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.
;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;
}