这是根某个共阳极数码管的程序修改来的,替换为了阴极数码管,对程序也进行了相应的改动,但显示时间时无法按照应有的顺序进行正常的显示,求助各位大神,希望能指出被我忽略的错误和有效的思路。
单片机源程序如下:
- 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)
|