units equ 30H ;設定位址30H為個位數暫存器units tens equ 31H ;設定位址31H為十位數暫存器tens hundreds equ 32H ;設定位址32H為百位數暫存器hundreds scancode equ 33H ;設定位址33H為掃描值暫存器scancode org 0 ;程式由位址00H的地方開始存放 jmp start start: mov sp,#6fh ;設定堆疊存放位置從70H開始 mov tmod,#01100000b ;設定TMOD暫存器 (課本6-4) ;Timer1的工作模式為Mode2,且脈波源來自外部T1腳的數入脈波 ;Timer0的工作模式為Mode0,且脈波源來自內部晶體振盪Fosc/12 mov th1,#0 mov tl1,#0 mov r7,#200 setb tr1 call delay1 mov a,tl1 clr tr1 jmp count count: mov b,#6 ;圓盤一圈洞數6放入暫存器b div ab ;每秒訊號除以洞數6,a為商數(轉數rps),b為餘數 ;==百位數== mov b,#100 ;b放入100 div ab ;轉數除以100,a為百位數數值,b為餘數 mov hundreds,a ;百位數數值置入hundreds ;==十位數&個位數== mov a,b ;百位數計算後的餘數放入a mov b,#10 ;b放入10 div ab ;百位數計算後的餘數除以10,a為十位數,b為餘數 mov tens,a ;十位數數值置入tens mov a,b ;個位數數值放入a (因暫存器不能直接移動到另一暫存器) mov units,a ;個位數數值置入units ;==顯示七段顯示器== mov scancode,#11111110b mov r4,#3 mov r0,#2fh loop: inc r0 mov a,@r0 call accessdisplaycode mov p0,a mov p2,scancode mov a,scancode rl a mov scancode,a mov r6,#125 ;需作適當的時間延遲,掃描完4個顯示器大約花費 djnz r6,$ ;4 * 250us =1ms的時間 djnz r4,loop jmp start ;==延遲副程式1== delay1: setb tr0 timer_loop: mov tl0,#(2**13-5000).mod.32 mov th0,#(2**13-5000)/32 timer_wait: jbc tf0,timer_ok jmp timer_wait timer_ok: djnz r7,timer_loop clr tr0 ret ;==取碼副程式== accessdisplaycode: mov dptr,#displaycodetable movc a,@a+dptr ret displaycodetable: db c0h db 0f9h db 0a4h db 0b0h db 99h db 92h db 83h db 0f8h db 80h db 98h .end