製作一個具有4位數字的計時器(只能開始跟暫停= =|||)
........組語這樣就教完了!?
真是神秘.....我只記得每週睡醒後改一改作業就結束一學期了喔
說好的自製世界線真空管時鐘勒~(啥鬼)
總之就是『複製x貼上x改一改』!
(就算範例沒有,教授大人會自己打出範例呦w)
參考文獻:
8051的指令集
8051介紹
第六章 計時/計數器
真是神秘.....我只記得每週睡醒後改一改作業就結束一學期了喔
說好的自製世界線真空管時鐘勒~(啥鬼)
總之就是『複製x貼上x改一改』!
(就算範例沒有,教授大人會自己打出範例呦w)
參考文獻:
8051的指令集
8051介紹
第六章 計時/計數器
MOV R0,#VAL1
MOV A,@R0 ;將R0內的東西當作記憶體位置拿值
INC R0
重點再以上三行~......反倒跟計時器無關= =
簡單說就是從頭到尾一直掃描~用兩個按鈕控制計時器1的開關
其他部份都是直接拿神範例改的~懶的看
﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍程式碼﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍
VAL1: EQU 40H ;千
VAL2: EQU VAL1+1;百
VAL3: EQU VAL2+1;十
VAL4: EQU VAL3+1;個
KEY1 REG P2.0 ;STOP
KEY2 REG P2.1 ;START
MAX_INT EQU 65535
T0_VALUE EQU 5000 ;掃描
T1_VALUE EQU 46080;希望是計時0.05秒
ORG 00H
JMP START
ORG 0BH ;Timer0中斷向量位址
JMP TIMER0_DRV ;中斷服務程式執行
ORG 1BH ;Timer1中斷向量位址
JMP TIMER1_DRV ;中斷服務程式執行
ORG 30H
START:
MOV TMOD,#00010001B
MOV IP,#00001010B ;設定Timer0為高優先權
MOV IE,#10001010B ;致能Timer0中斷
MOV TL0,#<(MAX_INT-T0_VALUE) ;儲存16位元之低8位元
MOV TH0,#>(MAX_INT-T0_VALUE) ;儲存16位元之高8位元
MOV TL1,#<(MAX_INT-T1_VALUE) ;儲存16位元之低8位元
MOV TH1,#>(MAX_INT-T1_VALUE) ;儲存16位元之高8位元
MOV R2,#0
MOV R0,#VAL1 ;R0設為40H
;歸0
MOV VAL1,#0
MOV VAL2,#0
MOV VAL3,#0
MOV VAL4,#0
SETB TR0;開掃描
LOOP1:
JB KEY1,LOOOP1
JB KEY1,LOOOP1
CLR TR1 ;暫停的按鈕
LOOP2:
JNB KEY1,LOOP2
JNB KEY1,LOOP2
SJMP LOOOP1
LOOOP1:
JB KEY2,LOOP1
JB KEY2,LOOP1
SETB TR1 ;開始
LOOOP2:
JNB KEY2,LOOOP2
JNB KEY1,LOOOP2
SJMP LOOP1
TIMER0_DRV: ;掃描
CLR TR0 ;停止計時
MOV TL0,#<(MAX_INT-T0_VALUE) ;重新儲存16位元之低8位元
MOV TH0,#>(MAX_INT-T0_VALUE) ;重新儲存16位元之高8位元
MOV P1,#0FFH;
MOV A,@R0;將R0內的東西當作記憶體位置拿值
MOV DPTR,#SSTBL
MOVC A,@A+DPTR
MOV P0,A
MOV A,R2
MOV DPTR,#LOC
MOVC A,@A+DPTR
MOV P1,A
INC R2
INC R0
CJNE R2,#4,NEXT1
MOV R2,#0
MOV R0,#VAL1
NEXT1:
SETB TR0 ;再啟動計時
RETI
TIMER1_DRV: ;一直加加
CLR TR1 ;停止計時
MOV TL1,#<(MAX_INT-T1_VALUE) ;重新儲存16位元之低8位元
MOV TH1,#>(MAX_INT-T1_VALUE) ;重新儲存16位元之高8位元
;應該可以縮減~但是弄不出來XD
MOV A,VAL4;
INC A;
MOV,VAL4,A;
CJNE A,#10,NEXT2
MOV VAL4,#0;
MOV A,VAL3;
INC A;
MOV,VAL3,A;
CJNE A,#10,NEXT2
MOV VAL3,#0;
MOV A,VAL2;
INC A;
MOV,VAL2,A;
CJNE A,#10,NEXT2
MOV VAL2,#0;
MOV A,VAL1;
INC A;
MOV,VAL1,A;
CJNE A,#10,NEXT2
MOV VAL1,#0;
;加1
NEXT2:
SETB TR1 ;再啟動計時
RETI
SSTBL:
DB 0C0H,0F9H,0A4H,0B0H,099H;0~4
DB 092H,082H,0F8H,080H,090H;5~9
LOC:
DB 0F7H,0FBH,0FDH,0FEH
END