标题:
基于89C51单片机的时钟汇编程序设计显示出现问题
[打印本页]
作者:
1054664355
时间:
2019-12-14 12:22
标题:
基于89C51单片机的时钟汇编程序设计显示出现问题
这是根某个共阳极数码管的程序修改来的,替换为了阴极数码管,对程序也进行了相应的改动,但显示时间时无法按照应有的顺序进行正常的显示,求助各位大神,希望能指出被我忽略的错误和有效的思路。
51hei.png
(19.89 KB, 下载次数: 23)
下载附件
2019-12-14 13:14 上传
单片机源程序如下:
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0030H
MAIN:
MOV SP,#60H ;确立堆栈区
MOV PSW,#00H
MOV R0,#20H ;RAM区首地址
MOV R7,#5FH ;RAM区单元个数
QL:
MOV @R0,#00H ;RAM清零
INC R0
DJNZ R7,QL
MOV IP,#02H ;IP初始化,优先定时器0
MOV IE,#82H ;IE初始化
MOV TMOD,#01H ;定时器0方式1工作
LCALL PP ;调P.子程序
NEXT:
LCALL KEY ;按键检测子程序
JB ACC.0,RUNF ;A键按下运行
LCALL DISP ;调用显示子程序
SJMP NEXT
RUNF:
LCALL OUTT ;调传送子程序
LCALL TIME ;开电子钟
JK:
LCALL DISP
LCALL KEY
JZ JK
LCALL ANKEY ;调用键功能子程序
LCALL DISP
SJMP JK
;P点显示的8LED段码初始化子程序
PP:
MOV 37H,#12 ;P点编码送寄存器,对应最左LED (共阳极,0CH )
MOV R0,#30H ;第8个LED,最右LED,段码存储的地址
MOV R7,#07H ;第8到第2个LED,共7个,初始化段码显示空白
PPP:
MOV @R0,#10 ;显示空白
INC R0
DJNZ R7,PPP
RET
;键扫描子程序
KEY:
LCALL KEYS ;调用键值处理子程序
JZ EXIT ;没有键按下转到返回
LCALL DISP
LCALL DISP ;调用显示去抖动
LCALL KEYS
JZ EXIT
MOV B,20H ;保存键值
KEYSF:
LCALL KEYS
JZ KEYY ;键释放,转到恢复键值
LCALL DISP ;调显示子程序延时
AJMP KEYSF ;等到键释放
KEYY:
MOV A,B ;键值送A
EXIT:RET
KEYS:
MOV P1,#0FFH ;先向P1口写1
MOV A,P1 ;P1口值送A (有按键按下,对应0,取反后1)
CPL A
ANL A,#0FH ;保存P1口的低4位
MOV 20H,A ;A值送20H保存
RET
;键功能子程序
ANKEY:
CLR EA ;关中断
CHECK:
JB TR0,YXZ ;判断是否运行
K0:
CJNE A,#01H,K1
AJMP RUN ;A键按下,恢复运行,转运行
K1:
CJNE A,#02H,K2
AJMP KEY1 ;转时调整
K2:
CJNE A,#40H,K3
AJMP KEY2 ;转分调整
K3:
CJNE A,#08H,OUT ;转
AJMP KEY3 ;转秒调整
YXZ:
JB ACC.0,STOP ;A键按下,暂停
AJMP OUT
KEY1:
MOV R0,#45H ;时调整
LCALL ADD1 ;调加一子程序
CLR C
CJNE A,#24H,OUTT ;转传送显示数据子程序
ACALL CLR0 ;调时间清理子程序
AJMP OUTT
KEY2:
MOV R0,#43H ;分调整
LCALL ADD1
CLR C
CJNE A,#60H,OUTT
ACALL CLR0
AJMP OUTT
KEY3:
MOV R0,#41H ;秒调整
ACALL ADD1
CLR C
CJNE A,#60H,OUTT
ACALL CLR0
;传送显示数据子程序
OUTT:
MOV 30H,40H ;秒显示单元40H-41H
MOV 31H,41H
MOV 32H,#11 ;"-"
MOV 33H,42H ;分显示单元42H-43H
MOV 34H,43H
MOV 35H,#11 ;"-"
MOV 36H,44H ;时显示单元44H-45H
MOV 37H,45H
RET
STOP:
CLR TR0
RET
RUN:
LCALL TIME ;调运行电子钟子程序
OUT:
SETB EA ;无键按下或完成功能跳出
RET
;运行电子钟子程序
TIME:
SETB EA
MOV TL0,#0B0H ;3CB0H
MOV TH0,#3CH
MOV R4,#20 ;50ms,20次循环
SETB TR0 ;启动定时器0
RET
;定时器0中断处理子程序
INTT0:
PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
MOV TL0,#0B0H ;重新设置定时初值
MOV TH0,#3CH
SETB TR0
DJNZ R4,OUTT0 ;r4-1 != 0 1秒未到,转OUTTO
ADDSS:
MOV R4,#14H ;20次计数
MOV R0,#41H ;秒十位
ACALL ADD1
CLR C
CJNE A,#60H,ADDMM ;1分到
ADDMM:
JC OUTT0 ;1分,60秒未到
ACALL CLR0 ;1分到,清零
MOV R0,#43H ;分十位
ACALL ADD1
CLR C
CJNE A,#60H,ADDHH ;1小时到
ADDHH:
JC OUTT0
ACALL CLR0
MOV R0,#45H ;时十位
ACALL ADD1
CLR C
CJNE A,#24H,HOUR ;1天到
HOUR:
JC OUTT0
ACALL CLR0
OUTT0:
MOV 30H,40H ;秒显示单元40H-41H
MOV 31H,41H
MOV 32H,#11 ;"-"
MOV 33H,42H ;分显示单元42H-43H
MOV 34H,43H
MOV 35H,#11 ;"-"
MOV 36H,44H ;时显示单元44H-45H
MOV 37H,45H
POP PSW
POP ACC
SETB ET0
RETI
;时间清理子程序
CLR0:
CLR A
MOV @R0,A
DEC R0
MOV @R0,A
RET
;加一子程序
ADD1:
MOV A ,@R0 ;取十位
DEC R0
SWAP A
ORL A,@R0 ;组合十位与个位
ADD A,#01H ;加1
DA A ;十进制调整
MOV R3,A ;暂存
ANL A,#0FH ;屏蔽十位
MOV @R0,A ;放入个位单元
MOV A,R3 ;取值
INC R0
SWAP A
ANL A,#0FH ;屏蔽个位
MOV @R0,A ;放入十位单元
MOV A,R3
RET
DISP:
MOV R1,#30H
MOV R2,#01H
DISP1:
MOV P2,R2
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CPL P0.0
CPL P0.1
CPL P0.2
CPL P0.3
CPL P0.4
CPL P0.5
CPL P0.6
CPL P0.7
ACALL DL
MOV A,R2
JB ACC.7,DISP2
RL A
INC R1
MOV R2,A
AJMP DISP1
DISP2:RET
TAB:DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,0FFH,0BFH,0CH
DL:
MOV R6,#14H
DL1:
MOV R7,#19H
DL2:
DJNZ R7,DL2
DJNZ R6,DL1
RET
END
复制代码
全部资料51hei下载地址:
shizhong.rar
(30.47 KB, 下载次数: 8)
2019-12-14 12:13 上传
点击文件名下载附件
作者:
csmyldl
时间:
2019-12-14 16:38
MOV P0,A
CPL P0.0
CPL P0.1
CPL P0.2
CPL P0.3
CPL P0.4
CPL P0.5
CPL P0.6
CPL P0.7
显示程序中这一段完全没必要这么写
只需要把数据表中的数据对应取反就变为了共阴极
TAB:DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,0FFH,0BFH,0CH
另外,位码放在R2中,共阴是MOV R2,#01H,换共阴就是MOV R2,#0FEH
所以,如果共阳是正常显示的话,只要改数据表和R2的值就变为了共阴
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1