|
這是一個非常經典的8421定時案例
;兩段8421碼,用作計時,P1.3輸出,P1.0清零,P1.1啟動,P1.2為每秒閃爍一次。
;程序代碼如下:
ORG 0003H ;
LCALL FUWEI;
ORG 000BH;
FUWEI: MOV P1,#0FFH ;
MOV P2,#0FFH ;
;************讀兩位8421碼并合并**********
CLR P2.5 ;準備讀十位
CLR A ;累加器清零
MOV A,P2 ;讀取數據
CPL A ;A內容取反
ANL A,#0FH ;屏蔽高四位
MOV B,#0AH ;把0A送入B
MUL AB ;把數據變為十位
MOV 21H,A ;保存數據
SETB P2.5 ;
CLR P2.4 ;準備讀個位
CLR A ;累加器清零
MOV A,P2 ;讀取數據
CPL A ;A內容取反
ANL A,#0FH ;屏蔽高四位
ADD A,21H ;合并十位和個位
SETB P2.4 ;
CJNE A,#0,BAOCHUN ;
AJMP FUWEI ;
BAOCHUN: MOV 22H,A ;保存BCD碼
;*************啟動按鍵S1******************
S1: JNB P1.1,QIDONG ;
JNB P1.0,FUWEI ;清零鍵按下轉復位
AJMP FUWEI;
;**********啟動及輸出程序*****************
QIDONG: JNB P1.1,QIDONG ;
CLR P1.3 ;啟動輸出
LCALL YANSHI ;轉延時
BCD: CPL P1.2 ;
DJNZ 22H,YANSHI ;
AJMP FUWEI ;
;************延時1秒子程序***************
YANSHI: MOV R0,#20 ;
MOV TMOD,#10H ;設定為定時方式1
MOV TH1,#3CH ;裝入定時初值高位
MOV TL1,#0B0H ;裝入定時初值低位,定時時間為50ms.
SETB TR1 ;
LP1: JNB P1.0,FUWEI ;
JBC TF1,LP2 ;50ms時間到就轉
SJMP LP1 ;50ms時間沒到繼續等待
LP2: MOV TH1,#3CH ;重裝初值
MOV TL1,#0B0H ;重裝初值
DJNZ R0,LP1 ;把R0內容減1不等于0轉
AJMP BCD ;
END.
|
|