找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2633|回复: 9
打印 上一主题 下一主题
收起左侧

单片机数码管显示程序会有跳动

[复制链接]
跳转到指定楼层
楼主
为什么我上边的数码管会没有规律的跳成六个0,跳动的时间很短,但是能看到。求大神解答代码如下

ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTTO执行
ORG 0013H ;外中断1中断程序入口
RETI ;外中断1中断返回
ORG 001BH ;定时器T1中断程序入口
LJMP INTT1 ;跳至INTT1执行
ORG 0023H ;串行中断程序入口地址
RETI ;串行中断程序返回
; ******************************************
;; 主 程 序 ;;
; ******************************************
START: MOV R0,#70H ;清70H-7AH共11个内存单元
MOV R7,#0BH ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV R0,#40H
MOV R7,#0BH
CLEAR1:MOV @R0,#00H
INC R0
DJNZ R7,CLEAR1
MOV 20H,#00H ;清20H(标志用)
MOV 7AH,#0AH ;放入"熄灭符"数据
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#00H ;50MS定时初值(T0计时用)
MOV TH0,#4CH ;50MS定时初值
MOV TL1,#00H ;50MS定时初值(T1闪烁定时用)
MOV TH1,#4CH ;50MS定时初值
MOV 55H,#00H
MOV 56H,#06H
MOV 57H,#00H
MOV P2,#0FFH
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1秒定时用初值(50MS×20)
START1: LCALL DISPLAY ;调用显示子程序
JNB P2.0,SETMM1 ;P2.0口为0时转时间调整程序
JNB P2.1,ASETMM1
JNB P2.2,ASETMM2
JNB P2.3,ASETMM3
JNB P2.4,ASETMM4
JNB P2.5,ASETMM5
SJMP START1 ;P2.0口为1时跳回START1
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
ASETMM1:LJMP ASETMM11
ASETMM2:LJMP ASETMM21
ASETMM3:LJMP ASETMM31
ASETMM4:LJMP ASETMM41
ASETMM5:
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#00H
MOV 45H,#00H
LJMP START1



















; ******************************************
;; 1秒计时程序 ;;
; ******************************************
;T0中断服务程序
INTT0: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值(低8位修正值)
MOV A,#4CH ;高8位初值修正
ADDC A,TH0
MOV TH0,A ;重装初值(高8位修正值)
SETB TR0 ;开启定时器T0
DJNZ R4, OUTT0 ;20次中断未到中断退出
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
MOV R0,#71H ;指向秒计时单元(71H-72H)
ACALL ADD1 ;调用加1程序(加1秒操作)


MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
CLR C ;清进位标志
CJNE A,#60H,ADDMM ;
ADDMM: JC OUTT0 ;小于60秒时中断退出
ACALL CLR0 ;大于或等于60秒时对秒计时单元清0
MOV R0,#77H ;指向分计时单元(76H-77H)
ACALL ADD1 ;分计时单元加1分钟
MOV A,R3 ;分数据放入A
CLR C ;清进位标志
CJNE A,#60H,ADDHH ;
ADDHH: JC OUTT0 ;小于60分时中断退出
ACALL CLR0 ;大于或等于60分时分计时单元清0
MOV R0,#79H ;指向小时计时单元(78H-79H)
ACALL ADD1 ;小时计时单元加1小时
MOV A,R3 ;时数据放入A
CLR C ;清进位标志
CJNE A,#24H,HOUR ;
HOUR: JC OUTT0 ;小于24小时中断退出
ACALL CLR0 ;大于或等于24小时小时计时单元清0
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
MOV 73H,77H ;入对应显示单元
MOV 74H,78H ;
MOV 75H,79H ;
POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
RETI ;中断返回


; ******************************************
;; 闪动调时 程 序 ;;
; ******************************************
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1:


INTT11:PUSH ACC ;中断现场保护
PUSH PSW ;
MOV TL1, #00H ;装定时器T1定时初值
MOV TH1, #4CH ;
DJNZ R2,INTT11OUT ;0.3秒未到退出中断(50MS中断6次)
MOV R2,#06H ;重装0.3秒定时用初值
CPL 02H ;0.3秒定时到对闪烁标志取反
JB 02H,FLASH11 ;02H位为1时显示单元"熄灭"
MOV 72H,76H ;02H位为0时正常显示
MOV 73H,77H ;
MOV 74H,78H ;
MOV 75H,79H ;
INTT11OUT: POP PSW ;恢复现场
POP ACC ;
RETI ;中断退出
FLASH11: JB 01H,FLASH21 ;01H位为1时,转小时熄灭控制
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
MOV 74H,78H ;
MOV 75H,79H ;
AJMP INTT11OUT ;转中断退出
FLASH21: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示
MOV 74H,7AH ;
MOV 75H,7AH ;
AJMP INTT11OUT ;转中断退出



; ******************************************
;; 加1子 程 序 ;;
; ******************************************
ADD1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十进制调整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
MOV @R0,A ;放回前一地址单元
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当削地址单元中
RET ;子程序返回
; ******************************************
;; 清零程序 ;;
; ******************************************
;对计时单元复零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
; ******************************************
;; 时钟调整程序 ;;
; ******************************************
;当调时按键按下时进入此程序
SETMM: cLR ET0 ;关定时器T0中断
CLR TR0 ;关闭定时器T0
LCALL DL1S ;调用1秒延时程序
JB P2.0,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
SETB ET1 ;允许T1中断
SETB TR1 ;开启定时器T1
SET2: JNB P2.0,SET1 ;P2.0口为0(键未释放),等待
SETB 00H ;键释放,分调整闪烁标志置1
SET4: JB P2.0,SET3 ;等待键按下
LCALL DL05S ;有键按下,延时0.5秒
JNB P2.0,SETHH ;按下
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作
LCALL ADD1 ;调用加1子程序
MOV A,R3 ;取调整单元数据
CLR C ;清进位标志
CJNE A,#60H,HHH ;调整单元数据与60比较
HHH: JC SET4 ;调整单元数据小于60转SET4循环
LCALL CLR0 ;调整单元数据大于或等于60时清0
CLR C ;清进位标志
AJMP SET4 ;跳转到SET4循环
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
SETB TR0 ;开启T0定时器(开时钟)
CLOSE: JB P2.0,CLOSE ;无按键按下,等待。
LCALL DISPLAY ;有键按下,调显示子程序延时削抖
JB P2.0,CLOSE ;是干扰返回CLOSE等待
WAITH: JNB P2.0,WAITH ;等待键释放
LJMP START1 ;返回主程序(LED数据显示亮)
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
SETHH1: JNB P2.0,SET5 ;等待键释放
SETB 01H ;小时调整标志置1
SET6: JB P2.0,SET7 ;等待按键按下
LCALL DL05S ;有键按下延时0.5秒
JNB P2.0,SETOUT ;按下时间大于0.5秒退出时间调整
MOV R0,#79H ;按下时间小于0.5秒加1小时操作
LCALL ADD1 ;调加1子程序
MOV A,R3 ;
CLR C ;
CJNE A,#24H,HOUU ;计时单元数据与24比较
HOUU: JC SET6 ;小于24转SET6循环
LCALL CLR0 ;大于或等于24时清0操作
AJMP SET6 ;跳转到SET6循环
SETOUT: JNB P2.0,SETOUT1 ;调时退出程序。等待键释放
LCALL DISPLAY ;延时削抖
JNB P2.0,SETOUT ;是抖动,返回SETOUT再等待
CLR 01H ;清调小时标志
CLR 00H ;清调分标志
CLR 02H ;清闪烁标志
CLR TR1 ;关闭定时器T1
CLR ET1 ;关定时器T1中断
SETB TR0 ;开启定时器T0
SETB ET0 ;开定时器T0中断(计时开始)
LJMP START1 ;跳回主程序
SET1: LCALL DISPLAY ;键释放等待时调用显示程序(调分)
AJMP SET2 ;防止键按下时无时钟显示
SET3: LCALL DISPLAY ;等待调分
AJMP SET4
SET5: LCALL DISPLAY ;键释放等待时调用显示程序(调小时)
AJMP SETHH1 ;防止键按下时无时钟显示
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
AJMP SET6
SETOUT1: LCALL DISPLAY ;退出时钟调整时键释放等待
AJMP SETOUT ;防止键按下时无时钟显示;



ASETMM11:
INC 42H
BSET11:JNB P2.1,ASET11
LJMP START1
ASET11:LCALL DISPLAY
LJMP BSET11


ASETMM21:
INC 43H
BSET21:JNB P2.2,ASET21
LJMP START1
ASET21:LCALL DISPLAY
LJMP BSET21


ASETMM31:
INC 44H
BSET31:JNB P2.3,ASET31
LJMP START1
ASET31:LCALL DISPLAY
LJMP BSET31

ASETMM41:
INC 45H
BSET41:JNB P2.4,ASET41
LJMP START1
ASET41:LCALL DISPLAY
LJMP BSET41







; ******************************************
;; 显示程序 ;;
; ******************************************
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: MOV R1,#70H ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
MOV R0,#40H
PLAY: MOV A,R5 ;扫描字放入A
MOV P3,A ;从P3口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P1,A ;段码放入P1口

MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A

LCALL DL1MS ;显示1MS
INC R0
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内

AJMP PLAY ;跳回PLAY循环
ENDOUT: SETB P3.5 ;一次显示结束,P3口复位
MOV P1,#0FFH ;P1口复位
MOV P0,#0FFH
RET ;子程序返回
TAB: DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00
;共阳段码表 "0""1""2""3""4""5""6""7""8""9""不亮"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
DS20MS: ACALL DISPLAY
ACALL DISPLAY
ACALL DISPLAY
RET
;延时程序,用作按键时间的长短判断
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
END ;程序结束



5WI9~8]JVQYFZ(ZLD6A4H@G.png (60.34 KB, 下载次数: 67)

5WI9~8]JVQYFZ(ZLD6A4H@G.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:453198 发表于 2020-12-17 11:11 | 只看该作者
汇编啊 牛逼 把延时改短一点
回复

使用道具 举报

板凳
ID:414556 发表于 2020-12-19 13:34 | 只看该作者
跳是刷新显示的时间太长,减短刷新时间。
回复

使用道具 举报

地板
ID:863097 发表于 2020-12-19 13:59 | 只看该作者
把延时搞得短一点,应该可以避免
回复

使用道具 举报

5#
ID:420836 发表于 2020-12-20 00:54 | 只看该作者
楼主有什么更新吗? 问题解决了吗?

回复

使用道具 举报

6#
ID:863773 发表于 2020-12-20 01:57 | 只看该作者
应该是延时时间过长导致的,减短延时时间就可以了
回复

使用道具 举报

7#
ID:860585 发表于 2020-12-21 21:29 | 只看该作者
zailushang... 发表于 2020-12-17 11:11
汇编啊 牛逼 把延时改短一点

解决了,谢谢
回复

使用道具 举报

8#
ID:860585 发表于 2020-12-21 21:30 | 只看该作者
amandv 发表于 2020-12-19 13:34
跳是刷新显示的时间太长,减短刷新时间。

已解决,谢谢
回复

使用道具 举报

9#
ID:860585 发表于 2020-12-21 21:30 | 只看该作者
srl 发表于 2020-12-20 01:57
应该是延时时间过长导致的,减短延时时间就可以了

已解决,谢谢
回复

使用道具 举报

10#
ID:860585 发表于 2020-12-21 21:30 | 只看该作者
123sof 发表于 2020-12-19 13:59
把延时搞得短一点,应该可以避免

已解决,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表