;此範例的差別, 在填入LED_BUF緩衝區時,已經先轉換成7段顯示器字型, 送出掃描時, 就不用再轉換一次 LED_BUF EQU 31H ;LED顯示資料暫存器, 共需8個byet LED_CNT EQU 30H ;控制LED顯示位置暫存器 LED EQU P2 ORG 00H JMP MAIN ORG 0BH JMP SCAN_LED MAIN: ;LED顯示資料暫存器位址31H~38H初值預先設定為0~7 MOV R0,#LED_BUF ;指到顯示資料暫存器開頭 MOV DPTR,#FONT ;控制LED顯示位置 MOV A,#0 ;第一筆值為0 MOV R4,#8 FILL: PUSH ACC ;在執行下一行指令時, 會改變ACC的值,所以先存到堆疊 MOVC A,@A+DPTR ;取出字型 MOV @R0,A ;將數值填入R0所指記憶體位址 INC R0 POP ACC ;從堆疊取回累加器ACC值 INC A DJNZ R4,FILL MOV TMOD,#00000001B MOV TH0,#(65536-2000) /256 MOV TL0,#(65536-2000) MOD 256 MOV IE,#10000010B SETB TR0 MOV R4,#0 MOV LED_CNT,#LED_BUF JMP $ ;程式停在此行, 等待中斷 ;7段顯示器掃描程式, 依序將LED_BUF內儲存之內容送至7段顯示器顯示 SCAN_LED: MOV TH0,#(65536-2000) /256 MOV TL0,#(65536-2000) MOD 256 MOV A,R4 ADD A,#0F8H ;在實驗版中, P1.7~P1.4另有其他用途, 先設為1, 避免干擾 MOV P1,A MOV R0,LED_CNT MOV A,@R0 MOV LED,A ;顯示於LED INC LED_CNT INC R4 CJNE R4,#8,NOT_END MOV R4,#0 ;掃完8次,重設初值 MOV LED_CNT,#LED_BUF NOT_END: RETI FONT: DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;0~9之7段顯示器字型 END