📄 licheng.asm
字号:
;2051单片机自行车里程表程序
;Desigh by LinLifang 2006-02-01
ORG 0000H
AJMP MAIN
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 0030H
MAIN:
MOV 34H,#00H ;34H存百分位数
MOV 35H,#00H ;35H存十分位数
MOV 36H,#00H ;36H存个位数
MOV 37H,#00H ;37H存十位数
MOV 38H,#00H ;38H存百位数
MOV 30H,#50H ;30H存加数低8 位
MOV 31H,#20H ;31H存加数高8 位,测得26"自行车轮周距为2050mm。
LOOP:
ACALL DISP ;调用显示子程序
LOP:
ACALL KEY ;调用触点子程序
JNB F0,LOOP ;标志位为0,回LOOP,循环执行
ACALL MAIN1 ;标志位为1,转里程运算子程序
AJMP LOOP ;跳回LOOP,检测触点状态
KEY:
CLR F0 ;清标志位
JB P3.2,K_RET ;如果为1,触点未合
ACALL DELAY ;否则延时去抖
SETB P3.2 ;P3.2置1
JB P3.2,K_RET ;再判
SETB F0 ;设置触点合上标志
K_RET:
JB P3.2,K_RET1 ;触点合上,返回触点子程序调用
ACALL DISP ;如不加此句,触点合上时,LED灭一下。
AJMP K_RET ;循环等待触点释放,直到值为0,说明已释放.才从触点处理程序返回
K_RET1:
RET
DELAY:
MOV R5,#5 ;延时,防抖。
LOP1:
ACALL DISP ;循环调用5次显示子程序,防抖作用同时让LED显示,以不闪烁。
DJNZ R5,LOP1 ;R5不为0,继续显示直到R5等于0
RET ;返回防抖子程序调用
MAIN1:
MOV R0,#30H ;送数30H到R0
MOV R1,#32H ;送数32H到R1
MOV A,@R0 ;送30H地址内数到A
ADD A,@R1 ;30H内数与32H内数相加
DA A ;二﹣十进制数调整
MOV @R1,A ;和存32H
INC R0 ;30H+1=31H
INC R1 ;32H+1=33H
MOV A,@R0 ;送31H地址内数到A
ADDC A,@R1 ;31H内数与33H内数及进位位内数相加
DA A ;二﹣十进制数调整
MOV @R1,A ;和数送33H
CLR A ;清A
ADDC A,#00H ;取进位位内数
CJNE A,#01H,K_RET1 ;进位数为0调用返回,为1继续执行
MAIN2:
SETB P3.2
MOV A,34H ;里程百分位数送A
ADD A,#01H ;加1
DA A ;二﹣十进制调整
MOV 34H,A ;调整后送34H
CJNE A,#10H,K_RET1
;A未到10返回
MOV 34H,#00H ;34H清零
MOV A,35H ;里程十分位数送A
ADD A,#01H ;加1
DA A ;二﹣十进制调整
MOV 35H,A ;调整后存35H
CJNE A,#10H,K_RET1
;A未到10调用返回
MOV 35H,#00H ;35H清零
MOV A,36H ;里程个位数送A
ADD A,#01H ;加1
DA A ;二﹣十进制调整
MOV 36H,A ;调整后存36H
CJNE A,#10H,K_RET1
;A未到10调用返回
MOV 36H,#00H ;36H清零
MOV A,37H ;里程十位数送A
ADD A,#01H ;加1
DA A ;二十进制调整
MOV 37H,A ;调整后数存37H
CJNE A,#10H,K_RET1 ;A未到10调用返回
MOV 37H,#00H ;37H清零
MOV A,38H ;里程百位数送A
ADD A,#01H ;加1
DA A ;二﹣十进制调整
MOV 38H,A ;调整后数存38H
CJNE A,#10H,K_RET1 ;A未到10调用返回
MOV 38H,#00H ;38H清零
RET ;返回
DISP:
MOV A,34H ;百分位送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
CLR P3.0 ;开百分位
ACALL DL1MS ;延时
SETB P3.0 ;关百分位,防止鬼影
MOV A,35H ;十分位数送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
CLR P3.1 ;开十分位
ACALL DL1MS ;延时
SETB P3.1 ;关十分位,防止鬼影
MOV A,36H ;个位数送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
SETB P1.7 ;开个位小数点
CLR P3.3 ;开个位
ACALL DL1MS ;延时
SETB P3.3 ;关个位,防止鬼影
MOV A,37H ;十位数送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
CLR P3.4 ;开十位
ACALL DL1MS ;延时
SETB P3.4 ;关十位,防止鬼影
MOV A,38H ;百位数送A
MOV DPTR,#TAB ;码表首地址
MOVC A,@A+DPTR ;取字形码送A
MOV P1,A ;字形码送P1口
CLR P3.5 ;开百位
ACALL DL1MS ;延时
SETB P3.5 ;关百位,防止鬼影
RET
DL1MS: MOV R7,#80 ;2+2X80=162微秒,延时按12MHZ计算
DJNZ R7,$
RET
;共阳LED字型码表
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -