|
这是一个非常经典的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.
|
|