MOV r1,#01h ;从第一个数码管开始
MOV r2,#06h ;共6个数码管
dislp: MOV led_data,@r0 ;获得当前单元数据
inc r0 ;指向下一个单元
MOV p0,r1 ;数码显示
MOV a,r1 ;为下一个数准备
rl a ;下一个单元
MOV r1,a ;保存
lcall delay5ms ;为了保证数码管亮度,
;但要防止闪烁,延时5ms
djnz r2,dislp ;重复显示,直到全部数据刷新过
ret ;返回
; ******* time_pro 时间处理,主要为 bcd码转换,查表 ***********
time_pro:lcall bcd ;BCD码转换
MOV r0,#disstart ;获得显示单元首地址
MOV r2,#06h ;需要转换的个数
prlp: MOV a,@r0 ;取得当前需要转换的数据
MOV dptr,#tab_nu ;获得表头
MOV c a,@a+dptr ;获得转换后的数据
MOV @r0,a ;存回去
inc r0 ;指向下一个
djnz r2,prlp ;重复转换,直到6个全部完成
ret ;返回
; **************** 码型变换 ****************************************
bcd: MOV r0,#disstart ;获得首地址
MOV a,t_s ;获得待转化的低位
MOV b,#10 ;转化进制,如果要进行十进制转换 改为 10
div ab ;计算 A/B
MOV @r0,b ;第一位转换完毕,保存低位转化后的数据
inc r0 ;自增
MOV @r0,a ;保存高位
inc r0 ;取第二个数据地址
MOV a,t_m ;获得第二个需要转换的数据
MOV b,#10 ;十六进制
div ab ;计算
MOV @r0,b ;存低位
inc r0
MOV @r0,a ;存高位
inc r0 ;第三位
MOV a,t_h ;获得数据
MOV b,#10 ;十六进制
div ab ;计算
MOV @r0,b ;存低位
inc r0
MOV @r0,a ;存高位
ret ;完毕,返回
;***************************************************************************************
;******** time_set 设置时间 *******************************************************
; * *
; * 检测用户按键,1-> 设置时单元 2-> 设置分单元,3->设置增减方式 *
; * 如果需要增加 时,先将方式设置为 增加(默认为减),即,按下 KEY3一下, *
; * 然后按 KEY1 ,如果要减少时单元,需要再次按下KEY3,然后按KEY1; *
; * 分的设置也是如此。 *
;***************************************************************************************
time_set: MOV p0,#00h ;禁止数码管显示
MOV p2,#255 ;防止按键时闪烁
lcall pro_key ;查找用户按键情况
MOV a,key ;查找键值
jz tsend ;如果等于0,表示没用按键,直接返回
cjne a,#1,tset1 ;是否等于1?没有到下一个处理程序
MOV key,#00h ;等于1,表示设置时 请零,否则会引起重复设置
jb timset,tset10 ;时间设置标志位,1 ->减少,0->增加
MOV a,t_h ;标志位 0 ,增加,取得时单元
cjne a,#23,ts1 ;如果时单元不等于23,转移到增加操作
jmp tsend ;等于23 直接返回
ts1:inc t_h ;时单元增加1
jmp tsend ;返回
tset10: MOV a,t_h ;这里处理为减少的情况
jz tsend ;如果时单元为0,直接返回
dec t_h ;否则,数据减1
jmp tsend ;返回,以下关于分的设置一样
tset1:cjne a,#2,tset2 ;如果按键不是 2 则 转移到下一个处理
MOV key,#00h ;是2,表示设置 分
jb timset,tset20 ;其余同上
MOV a,t_m
cjne a,#59,
ts2 jmp tsend
ts2:inc t_m
jmp tsend
tset20: MOV a,t_m
jz tsend
dec t_m
jmp tsend
tset2:cjne a,#3,tsend ;等于 3 表示设置标志
MOV key,#00h ;清零
cpl timset ;标志取反
tsend:ret ;返回
;********* 按键处理 读取键盘 *************************
;参见有关键盘查询的说明,和前面的有关程序
pro_key: ;键盘查询子程序
setb key1 ;首先输出高电平,检测低电平的到来
setb key2 ;不同电路,可能检测方式不一样
setb key3
jb key1,ke1 ;如果用户没有按第一个键,到第下个处理部分,
MOV key,#1 ;表示用户按了第一个键
lcall delay20ms ;软件延时,防止干扰
jmp pro_key ;重新查询,直到用户释放按键
ke1:jb key2,ke2 ;处理第二个按键,如果没有到下一个处理部分
MOV key,#2 ;以下和第一个处理单元相似。
lcall delay20ms
jmp pro_key
ke2:jb key3,ke3
MOV key,#3
上一页 [1] [2] [3] 下一页
本文关键字:电子钟 51单片机,单片机-工控设备 - 51单片机