打印

数字钟问题

[复制链接]
2597|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
happde|  楼主 | 2010-1-18 21:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
laslison| | 2010-1-18 21:52 | 只看该作者
不长的话直接贴出来,方面看

使用特权

评论回复
板凳
David_ming| | 2010-1-18 21:59 | 只看该作者
我猜,大部分人都懒得去下,除非你这个是什么好资料

使用特权

评论回复
地板
原野之狼| | 2010-1-18 22:38 | 只看该作者
开一个定时器 去改变显示的内容就是啊
当然 两点的亮暗时间可能不一样 在程序中需要记录暗的状态和亮的状态

void task(void)
{
    // : on
    // delay
    // :off
    // delay
}

使用特权

评论回复
5
happde|  楼主 | 2010-1-19 08:18 | 只看该作者
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0030H
;===================================================主程序
MAIN: MOV SP,#75H
CLR 00H   ;===========================================================================消斗标志位
CLR 02H   ;===========================================================================显示闪烁标志,1闪烁,0不闪
MOV 21H,#0   ;====================================功能标志单元21H,0为时钟运行态,1为秒调节,2为分调节,3为小时调节。
MOV R5,#50
MOV  R6,#2  
MOV 6DH,#23
MOV 6EH,#59

MOV TMOD,#01H  ;T0为方式1
MOV TH0,#0D8H  ;T0赋初值(10MS,fosc=12MHz)
MOV TL0,#0F0H

SETB EA   ;CPU开中断
SETB ET0   ;T0开中断
SETB TR0
SETB TR1   ;T0启动运行
MLP: SJMP MLP
;==================================================显示子程序
DISP: MOV DPTR,#TAB1
MOV A,70H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0 ;时的十位显示
LCALL D1MS
SETB P2.0
MOV A,71H
MOVC A,@A+DPTR
ANL A,#7FH
MOV P0,A
CLR P2.1 ;时的个位显示
LCALL D1MS
SETB P2.1
MOV DPTR,#TAB2
MOV A,72H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2 ;分的十位显示
LCALL D1MS
SETB P2.2
MOV A,73H
MOVC A,@A+DPTR
ANL A,#7FH
MOV P0,A
CLR P2.3 ;分的个位显示
LCALL D1MS
SETB P2.3

RET  ;=======================显示程序出口
;===============================================
TAB1: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
TAB2: DB 40H,0C3H,0A4H,86H,8BH,92H,98H,0C7H,80H,83H          ;TAB1: DB 40H,0F9H,0A4H,0B0H,99H,92H ;需要送到数码管显示的数据
          ;DB 82H,0F8H,80H,90H,0FFH
          ;TAB2: DB 40H,0CFH,0A4H,06H,8BH,92H,98H,0C7H,80H,83H
;===========================================================延时子程序
D1MS: MOV R7,#249    ;1T
D1MSLP: NOP     ;2TX256
NOP
DJNZ R7,D1MSLP   ;2TX256=996T
NOP     ;1T
RET;=============延时子程序出口
;=======================================================================================中断子程序   
INTT0: MOV TH0,#0D8H   ;T0重赋初值
MOV TL0,#0F0H
DJNZ R5,INTRET   ;100次中断为一秒
MOV R5,#50    ;下一次中断100次
CPL 02H    ;===========================================显示闪烁标志,1闪烁,0不闪。1秒亮,1秒灭
DJNZ R6,INTRET
MOV R6,#2  
MOV A,21H    ;======时钟运行状态
CJNE A,#0,INTRET   ;======时钟运行状态,21H=0。如时钟为调整状态,则时钟不随中断而变



INC 6EH  ;
MOV A,6EH
CJNE A,#60,INTRET
MOV 6EH,#0
INC 6DH  ;
MOV A,6DH
CJNE A,#24,INTRET
MOV 6DH,#0
INTRET:LCALL KEYA  ;调用键处理程序,每一次中断对按键进行一次扫描。
LCALL BIN2BCD ;调用转换子程序
LCALL XS_FL  ;调用显示闪烁子程序
LCALL DISP  ;调用显示子程序
RETI ;=======================================中断子程序出口   
;===================================================================================键处理子程序
KEYA: ORL P1,#07H   ;置P1.0 、P1.2、P1.3为输入态
MOV A,P1
CPL A   ;高电平有效
ANL A,#07H   ;屏蔽高5位,保留有效低三位
JZ GRET1   ;无键按下,返回
JBC 00H, KEYAP  ;========================================================消抖标志位,1为有键操作
SETB 00H
SJMP GRET   ;消抖标志位置1后返回,等到下一次中断时在响应按键操作,从而达到消抖作用。
GRET1: CLR 00H ;==========================================防抖清0
CLR 01H ;==================01H标志位,判键是否已有过操作。键已放开,则键操作标志位请0,从而达到防止对时钟进行连续调整的作用。
GRET: RET  ;========================================================键处理子程序出口
KEYAP: JB ACC.0,KA0
JB ACC.1,KA1
JB ACC.2,KA2
SJMP GRET
;====================================================================KA0键处理程序
KA0: JB 01H,CLR21H ;判断KA0键操作是否已有过处理,01H=1,则已处理过;否则没有处理过。
INC 21H  ;KA0键每按一次,时钟状态调整一次
MOV A,21H
CJNE A,#4,CLR21H ;到时调整状态时,在按一次KA0键,时钟回到正常运行状态。
MOV 21H,#0
CLR21H:   
SETB 01H  ;键程序已处理,标志位01H置1
SJMP GRET

;====================================================================KA1键处理程序(加1键)
KA1: JB 01H,N60  ;如KA0键操作已处理,则返回
MOV A,21H  ;
CJNE A,#0,N1 ;时钟正常运行状态,则返回
SJMP N60

N60:
   
SETB 01H  ;键程序已处理
SJMP GRET  ;程序出口
N1: CJNE A,#2,N2  ;分调整状态
INC 6EH  ;
MOV A,6EH
CJNE A,#60,N60
MOV 6EH,#0
SJMP N60
N2: CJNE A,#3,N3  ;时调整状态
INC 6DH  ;
MOV A,6DH
CJNE A,#24,N3
MOV 6DH,#0
N3: SJMP N60  
;====================================================================KA2键处理程序(减1键)
KA2: JB 01H,DN60 ;如KA1键操作已处理,则返回
MOV A,21H  ;
CJNE A,#0,DN1 ;时钟正常运行状态
SJMP DN60

DN60:   
SETB 01H  ;键程序已处理
SJMP GRET
DN1: CJNE A,#2,DN2 ;分调整状态
DEC 6EH  ;
MOV A,6EH
CJNE A,#255,DN60
MOV 6EH,#59
SJMP DN60
DN2: CJNE A,#3,DN3 ;时调整状态
DEC 6DH  ;
MOV A,6DH
CJNE A,#255,DN3
MOV 6DH,#23
DN3: SJMP DN60   
;====================================================================转换子程序
BIN2BCD:
MOV A,6DH
MOV B,#10
DIV AB
MOV 70H,A
MOV 71H,B
MOV A,6EH
MOV B,#10
DIV AB
MOV 72H,A
MOV 73H,B
MOV A,6FH
MOV B,#10
DIV AB
MOV 74H,A
MOV 75H,B
RET  ;===================转换子程序出口
;====================================================================闪烁子程序
XS_FL: MOV A,21H
CJNE A,#0,FL1
SJMP FLRET  ;如是时钟运行状态,返回

MFL: MOV 74H,#10
MOV 75H,#10
SJMP FLRET
FL1: CJNE A,#2,FL2 ;分调整状态
JB 02H,MFL1
LCALL BIN2BCD
SJMP FLRET
MFL1: MOV 72H,#10
MOV 73H,#10
SJMP FLRET
FL2: CJNE A,#3,FLRET ;时调整状态
JB 02H,MFL2
LCALL BIN2BCD
SJMP FLRET
MFL2: MOV 70H,#10
MOV 71H,#10
FLRET: RET  ;===================闪烁子程序出口
;====================================================================     
END ;======================================================================================================程序结束

使用特权

评论回复
6
冷漠| | 2010-1-19 13:42 | 只看该作者
本帖最后由 冷漠 于 2010-1-19 16:14 编辑

敬佩极了。做个数字表需要这么长的程序?

能够在这么长的程序间跳跃的程序员真是不简单。

这些功能,程序裁剪到十分之一就够了。——把它模块化。

把复杂的程序模块化其实是很不简单的发明。至少是由美国大学一帮绝顶聪明的教授思考了N年才想出来的方法。然后有了宏汇编、C、操作系统指令.....编程工作越来越简单了。

有兴趣的话,抄段书上的汇编程序,不超过60条,点亮秒闪更简单了,——亮/暗各500ms。

使用特权

评论回复
7
冷漠| | 2010-1-19 16:09 | 只看该作者
本帖最后由 冷漠 于 2010-1-19 16:12 编辑

没注意,源程序已经写了。

;========中断子程序  

INTT0: MOV TH0,#0D8H   ;T0重赋初值
MOV TL0,#0F0H
DJNZ R5,INTRET   ;100次中断为一秒
MOV R5,#50    ;下一次中断100次
CPL 02H    ;===========显示闪烁标志,1闪烁,0不闪。1秒亮,1秒灭
DJNZ R6,INTRET
MOV R6,#2  
MOV A,21H    ;======时钟运行状态
CJNE A,#0,INTRET   ;======时钟运行状态,21H=0。如时钟为调整状态,则时钟不随中断而变


把 CPL 02H   修改成  CPL  P0.X   之类对应驱动端口就行了。按程序好像是0.5 秒亮,0.5 秒灭。

使用特权

评论回复
8
happde|  楼主 | 2010-1-19 22:18 | 只看该作者
7# 冷漠
改成P0.7,好像也不行耶!中间那两点就没它闪烁。大侠帮帮忙,急着用

使用特权

评论回复
9
杨工| | 2010-1-19 22:47 | 只看该作者
既然hh和mm都能显示了。我建议你写一个简单的小程序,只控制‘:’,简单的延时,看看闪不闪。

使用特权

评论回复
10
冷漠| | 2010-1-20 11:16 | 只看该作者

7楼没仔细看,那里不用改。改初始化这条:

本帖最后由 冷漠 于 2010-1-20 11:21 编辑

;===================================================主程序
MAIN: MOV SP,#75H
CLR 00H   ;==============================================消斗标志位
CLR 02H   ;=======显示闪烁标志,1闪烁,0不闪
MOV 21H,#0   ;===========0为时钟运行态,1为秒调节,2为分调节,3为小时调节。
MOV R5,#50
MOV  R6,#2  
MOV 6DH,#23
MOV 6EH,#59


把 CLR   02H   修改为
  SETB    02H     

使用特权

评论回复
11
冷漠| | 2010-1-20 11:30 | 只看该作者
本帖最后由 冷漠 于 2010-1-20 11:31 编辑

杨工说的对:天下难事,必做于易。

就点个秒显示,一对发光二极管的闪烁控制程序。

ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0030H
;===================================================主程序
MAIN: MOV SP,#75H
;CLR 00H   ;==============================================消斗标志位
;CLR 02H   ;=======================================显示闪烁标志,1闪烁,0不闪
;MOV 21H,#0   ;==============0为时钟运行态,1为秒调节,2为分调节,3为小时调节。
MOV R5,#50
MOV  R6,#2  
;MOV 6DH,#23
;MOV 6EH,#59

MOV TMOD,#01H  ;T0为方式1
MOV TH0,#0D8H  ;T0赋初值(10MS,fosc=12MHz)
MOV TL0,#0F0H

SETB EA   ;CPU开中断
SETB ET0   ;T0开中断
SETB TR0
;SETB TR1   ;T0启动运行
MLP: SJMP MLP

;================================================中断子程序   
INTT0: MOV TH0,#0D8H   ;T0重赋初值
MOV TL0,#0F0H
DJNZ R5,INTRET   ;100次中断为一秒
MOV R5,#50    ;下一次中断100次
CPL P0.7    ;=========================显示闪烁,1秒亮,1秒灭
DJNZ R6,INTRET
MOV R6,#2  
INTRET:  RETI


共阳极回路驱动要打开。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:当你在迷茫的时候,回到梦想的原点!

12

主题

79

帖子

1

粉丝