;*************************************************************************************** ;******** 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 lcall delay20ms jmp pro_key ke3:ret ;************************************** ;******** 定时器 T0 设置 ************** ;定时器工作在方式1,为提高精度,总定时时间为50ms, ;定时器溢出20次为1秒, pro_timer:mov tmod,#01h ;设置定时器为定时方式1 mov th0,#0ffh ;初始化定时初值 mov tl0,#0a1h ; setb ea ;总中断允许 setb et0 ;定时器0 允许 setb tr0 ;开始定时 ret ;返回 ; ***************************************** ; *************** 软件延时 ************* delay:push psw ;保存原来的寄存器内容 clr psw.3 ; clr psw.4 ;设置新的寄存器组 mov r0,#2 ;延时参数1 mov r1,#250 ;延时参数2 mov r2,#2 ;延时参数3 dl1:djnz r0,dl1 ;延时循环1 mov r0,#250 ; dl2:djnz r1,dl1 ;延时循环2 mov r0,#240 ; mov r1,#248 ; dl3:djnz r2,dl1 ;延时循环3 nop ;定时精度调整 pop psw ;恢复原来的寄存器 ret ;返回 ;***************************************** ;*************** 键盘延时 *************** delay20ms:push psw clr psw.3 clr psw.4 mov r0,#250 mov r1,#40 d20:djnz r0,d20 mov r0,#250 djnz r1,d20 pop psw ret ;************************************** ;*********** 延时 5ms **************** delay5ms:push psw clr psw.3 setb psw.4 mov r0,#250 mov r1,#10 d5:djnz r0,d5 mov r0,#250 djnz r1,d5 pop psw ret ;************************************************************************************ ;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16 ; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推 tab_nu:db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ;数字0-7 不带小数点代码 db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ;数字8-f 不带小数点代码 db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ;数字0-7 带小数点代码 db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ;数字8-f 带小数点代码 end ; |