jump to navigation

Program LED jalan pakai Assembly September 11, 2007

Posted by eepu in 8051 arch.
add a comment

Program berikut digunakan untuk menyalakan 32 lampu LED yang bergerak secara satu-persatu. Program ini belum melalui proses optimisasi, tapi semoga berguna.

2007-09-11_111318 

;by Fandi Gunawan

mulai:
    mov p0,#0 ; pindah “0″ -> register port 0
    mov p1,#0
    mov p2,#0
    mov p3,#0

inisialisasi:
    mov p0,#255
    mov p1,#255
    mov p2,#255
    mov p3,#255

putar_lagi:

geser_led_0 :
    mov a,#254 ; pindah “FE” hex -> akumulator
    mov p0,a   ; pindah isi reg akumulator -> register port 0
    mov r0,#8  ; pindah “8″ -> register 0
putar0:   
    call delay ; panggil rutin delay
    rl   a       ;geser kiri akumulator
    mov  p0,a  ; pindahkan isi akumulator ke register port 0
    djnz r0,putar0 ;kurangi isi r0 jika tidak 0 maka lompat ke putar 0

    mov p0,#255
    mov p1,#255
    mov p2,#255
    mov p3,#255
geser_led_1 :
    mov a,#254 ; pindah “FE” hex -> akumulator
    mov p1,a   ; pindah isi reg akumulator -> register port 1
    mov r0,#8  ; pindah “8″ -> register 0
putar1:   
    call delay ; panggil rutin delay
    rl   a       ;geser kiri akumulator
    mov  p1,a  ; pindahkan isi akumulator ke register port 1
    djnz r0,putar1 ;kurangi isi r0 jika tidak 0 maka lompat ke putar1

    mov p0,#255
    mov p1,#255
    mov p2,#255
    mov p3,#255

geser_led_2 :
    mov a,#254 ; pindah “FE” hex -> akumulator
    mov p2,a   ; pindah isi reg akumulator -> register port 2
    mov r0,#8  ; pindah “8″ -> register 0
putar2:   
    call delay ; panggil rutin delay
    rl   a       ;geser kiri akumulator
    mov  p2,a  ; pindahkan isi akumulator ke register port 2
    djnz r0,putar2 ;kurangi isi r0 jika tidak 0 maka lompat ke putar2

    mov p0,#255
    mov p1,#255
    mov p2,#255
    mov p3,#255

geser_led_3 :
    mov a,#254 ; pindah “FE” hex -> akumulator
    mov p3,a   ; pindah isi reg akumulator -> register port 3
    mov r0,#8  ; pindah “8″ -> register 0
putar3:   
    call delay ; panggil rutin delay
    rl   a       ;geser kiri akumulator
    mov  p3,a  ; pindahkan isi akumulator ke register port 3
    djnz r0,putar3 ;kurangi isi r0, jika tidak 0 maka lompat ke putar3

    mov p0,#255
    mov p1,#255
    mov p2,#255
    mov p3,#255

    sjmp putar_lagi

delay:   
    mov r1,#255
lompat2:mov b,#0ah
lompat1:djnz b,lompat1
    djnz r1,lompat2
    ret

end

Holtek HT48C50 C code for Piano September 10, 2007

Posted by eepu in Microcontroller.
add a comment

Currently I (Fandi Gunawan) am playing around with Holtek’s microcontroller series. This is the example of Piano’s code in C language since I do not want to touch assembly language.

//Piano.c
//
//Body: HT48C50-1
//Mask option
//BZ/BZB : All Disable
//the others use the default value

#include <ht48c50-1.h>

#pragma vector isr_4 @ 0×4
#pragma vector isr_8 @ 0×8
#pragma vector isr_c @ 0xc

//ISR for safequard
void isr_4(){} // external ISR
void isr_8(){} // timer/event 0

//initialize registers for safeguard
void safeguard_init(){
        _intc = 0;
        _tmr0c = 0;
        _tmr0 = 0;
        _tmr1c = 0;
        _tmr1h = 0;
        _tmr1l = 0;
        _pac = 0xff;
        _pbc = 0xff;
        _pcc = 0xff;
        _pdc = 0xff;
}

#define _tmr1c4 _11_4  //timer1 enable bit

const unsigned char frq[16] = {
0×21, 0xfe, 0×58, 0xfe, 0×84, 0xfe, 0×99, 0xfe,
0xc1, 0xfe, 0xe3, 0xfe, 0×2, 0xff, 0×11, 0xff};

unsigned char frq_idx;

void initial();
void wait_key_press();
void wait_key_release();
void start_sound();
void stop_sound();

void main(){

        safeguard_init();
        initial();

        while(1){
                wait_key_press();
                start_sound();
                wait_key_release();
                stop_sound();
        }
}

void wait_key_press(){
        unsigned char i, key;

        key = 0;
        while(!key)
                key = ~_pa;

        for(i=0; i<8; i++){
                if (key & 0×1){
                        frq_idx = i << 1;                                                  
                        break;
                }
                key >>= 1;
        }
}

void wait_key_release(){
        unsigned char key;
        key = 1;
        while(key)
                key = ~_pa;
}

void start_sound(){
        _intc = 9;              //enable timer1
        _tmr1c = 0×80;          //timer mode
        _tmr1l = frq[frq_idx];  //load sound freq.
        _tmr1h = frq[frq_idx+1];
        _tmr1c4 = 1;            //start timer1
}

void stop_sound(){
        _tmr1c4 = 0;            //stop timer1
        _pb = 0;
}

void isr_c(){                   // timer1                  
        _pb = ~_pb;             // generate square wave
}

void initial(){
        _pac = 0xff;    //set port A to input port
        _pbc = 0;       //set port B to output port
        _pb = 0;
}