advertisement

2014年12月29日

喇叭與七段應用控制 8051 assembly

;------------------------------------------
; ===================================
; == 喇叭與七段應用控制 ==
; == 2014/12/29 ==
; == 蘇偉諺 4a037052 ==
; ===================================
;------------------------------------------
;控制喇叭及七段顯示器
;
spk equ p1.7; 定義spk等於p1.7
seg equ p1; 定義seg等於p1,p1等於7段顯示器
temp_h equ 30h;定義temp_h等於30h
temp_l equ 31h;定義temp_l等於31h
mov sp,#5fh;把5fh內的資料複製到sp
main: mov r0,#8;把8的值複製到r0
mov dptr,#table_seg_tone;把table_seg的值複製到dptr,dptr=16位元暫存
loop: clr a
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a
mov seg,a;把a的值複製到seg,使7段顯示器顯示功能
inc dptr
clr a
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a
mov temp_h,a;把a的值複製到temp_h
inc dptr
clr a
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a
mov temp_l,a;把a的值複製到temp_l
call music;呼叫music副程式
mov r7,#100;把100的值複製到r7
call delay;呼叫delay副程式
inc dptr;將r1加1
djnz r0,loop;將r0減1,若r0不為0就跳到loop
jmp main;程式結束
music: mov tmod,#00010001b;將timer1跟timer0都設定成mode1:16位元 計時/計數器
mov r3,#160;把160的值複製到r3
lpmusic1:
mov th1,temp_h;把temp_h的值複製到th1
mov tl1,temp_l;把temp_l的值複製到tl1
setb tr1;將tr1設定成1
wait1: jnb tf1,wait1;若tf1不為1就跳到wait1
clr tr1;清除tr1
clr tf1;清除tf1
cpl p1.7;清除p1.7
djnz r3,lpmusic1;把r3減1,若r3不為0就跳到lpmusic1
ret
delay: mov th0,#high(65536-10000);將(65536-10000)的值放到th0,為了延遲0.01ms
mov tl0,#low(65536-10000);將(65536-10000)的值放到tl0,為了延遲0.01ms
setb tr0;將tr0設定成1
wait0: jnb tf0,wait0;若tf0不為1就跳到wait0
clr tf0;清除tf0
clr tr0;清除tr0
djnz r7,delay;把r7減1,若r7不為0就跳到delay
ret
table_seg_tone:
db 0xf9;7段顯示器顯示1 ,0
dw 0fc44h ;do:a=0 1
db 0xa4;7段顯示器顯示2 ,1
dw 0fcadh ;re:a=2 3
db 0xb0;7段顯示器顯示3 ,2
dw 0fd0ah ;mi:a=4 5
db 0x99;7段顯示器顯示4 ,3
dw 0fd34h ;fa:a=6 7
db 0x92;7段顯示器顯示5 ,4
dw 0fd84h ;so:a=8 9
db 0x82;7段顯示器顯示6 ,5
dw 0fdc8h ;la:a=10 11
db 0xd8;7段顯示器顯示7 ,6
dw 0fe0bh ;si:a=12 13
db 0x80;7段顯示器顯示8 ,7
dw 0fe23h ;do:a=14 15
end
view raw speaker_ssd.asm hosted with ❤ by GitHub

沒有留言:

張貼留言

文章有誤或有問題麻煩您留言告知! 謝謝您~~