📄 可预制的倒计时钟,p35个位,p34十位,p32确.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0039)http://www.8951.com/TEST/TEST/tl013.htm -->
<HTML><HEAD><TITLE>单片机通信</TITLE><LINK
href="可预制的倒计时钟,p35个位,p34十位,p32确.files/gpszx.css" type=text/css
rel=stylesheet><LINK href="../index.files/gpszx.css" type=text/css
rel=stylesheet>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2523" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY>
<DIV align=center>
<TABLE height=356 cellSpacing=0 cellPadding=0 width=769 bgColor=#66ccff
borderColorLight=#000000 border=0>
<TBODY>
<TR>
<TD align=middle width=752 bgColor=#ffffff colSpan=5 height=356>
<P align=left><FONT font><FONT color=#ff0000>单片机提高</FONT><FONT
color=#ff0000><IMG height=11
src="可预制的倒计时钟,p35个位,p34十位,p32确.files/gif091.gif" width=28
border=0></FONT><FONT color=#454545>WWW.51C51.COM
自学单片机的网站:作中国单片机编程技术普及推广第一站!倚天一出宝刀屠龙</FONT></FONT><IMG height=100
src="可预制的倒计时钟,p35个位,p34十位,p32确.files/titou2.jpg" width=760 border=0> <FONT
color=#454545 font><A href="http://www.8951.com/index.htm">返回主页 给我留言</A>
<A href="http://www.8951.com/jiaoxue.htm">单片机教学</A> <A
href="http://www.8951.com/tigao.htm">单片机提高</A> <A
href="http://www.8951.com/pinzhi.htm">品质技术</A> <A
href="http://www.8951.com/1000/WANGZHI.HTM">单片机网址</A> <A
href="http://www.8951.com/down/down.htm">软件下载</A> <A
href="http://www.8951.com/yejin/yejin.htm">学液晶显示</A> <A
href="http://www.8951.com/chanpin.htm">产品介绍</A> <A
href="http://www.8951.com/10/huikan.htm">如何购买</A></FONT><FONT size=2>
<BR></FONT><BR>;可预制的倒计时钟,p35个位,p34十位,p32确定<BR><FONT
size=2>;***************************************************************************<BR>;*
E-mail:sxj1974@163.com (51c51 test web) 51单片机学习网,自学单片机的网站
*<BR>;* Create by :石学军 <A
href="http://www.51c51.com/">http://www.51c51.com/</A>
www.8951.com 更多例程请登陆网站
*<BR>;***************************************************************************</FONT><BR>keyok
bit 00h ;是否有键按下的标志<BR>startrun bit 01h ;是否开始运行<BR>value equ 21h
;秒计时值<BR>setval equ 22h ;设置的数值<BR>counter equ 23h ;用于显示的计数器<BR>count equ
24h ;秒计数器<BR>keyval equ 25h ;按键寄存器<BR>dispbuf equ 5eh ;显示缓冲区<BR>first bit
p2.5 ;第一个数码管控制<BR>second bit p2.6 ;第二个数码管控制<BR>tmrvar equ 60110
;定时器的初值65536-5000<BR>hidden equ 0ffh ;显示器的消隐<BR>org 0000h<BR>jmp
start<BR>org 1*8+3 ;time0中断入口<BR>jmp int_t0
;到定时器t0中断服务程序的入口<BR>start:<BR>mov sp,#5fh ; 设置堆栈<BR>mov p1,#0ffh ;
所有led熄灭<BR>mov setval,#59 ;初值59<BR>mov value,setval ;开始不运行,按键后运行<BR>clr
startrun<BR>clr keyok ;清除有键按下的标志<BR>mov tmod,#01h<BR>mov th0,#HIGH(TMRVAR)
;取tirvar的高8位<BR>MOV TL0,#LOW(TMRVAR) ; 取tirvar的低8位<BR>SETB ET0 ;
开t0中断<BR>SETB TR0 ;定时器开始运行<BR>; CLR SEC<BR>SETB EA ; 开总中断<BR>LOOP:CALL KEY
;调用键盘程序<BR>JB KEYOK,KEYPROC;如果有键盘按下则转键盘处理<BR>NEXT:MOV A,VALUE
;获得秒的数值<BR>MOV B,#10<BR>DIV AB ;二进制转10进制10位个位分别送显示缓冲<BR>NEXT1:MOV
DISPBUF,A ;<BR>MOV DISPBUF+1,B ;个位送显示缓冲<BR>JMP LOOP<BR>KEYPROC:MOV
A,KEYVAL ;取得键值<BR>JZ KEYRUN ;如果为0转keyrun<BR>DEC A<BR>JZ KEYSTOP ;如果键值1
转stop<BR>DEC A<BR><BR>JZ KEYLEFT ;如果键值2转left<BR>JMP KEYRIGHT
;如果为3转right<BR>KEYRUN: <BR>SETB STARTRUN ;将开始运行的标志送1<BR>JMP
LOOP<BR>KEYSTOP:<BR>CLR STARTRUN ;开始运行位送0<BR>JMP LOOP<BR>KEYLEFT:
;键盘处理,10位加1并在0-5循环<BR>CLR STARTRUN ;先停止秒<BR>MOV A,SETVAL ;取设置位<BR>ADD
A,#10 ;加10<BR>CJNE A,#60,LEFT0 ;到60了么?<BR>MOV A,#0 ;是则清零<BR>JMP LEFT2
;转left2<BR>LEFT0:JNC LEFT1 ;比60大么, 是则转left1<BR>JMP LEFT2 ;
转left2<BR>LEFT1:SUBB A,#60 ;减60<BR>LEFT2:MOV SETVAL,A
;处理后的a送回setval<BR>MOV VALUE,SETVAL ; 送显示<BR>JMP LOOP<BR>KEYRIGHT: ;
键盘处理,10位加1并在0-5循环<BR>CLR STARTRUN ;先停止秒<BR>INC DISPBUF+1 ;显示器的低位加1<BR>MOV
A,DISPBUF+1 ; 送到a<BR>CJNE A,#10,REFT0 ;与10比较不等于则转移<BR>MOV DISPBUF+1,#0 ;
等于10则送0<BR>REFT0:MOV A,DISPBUF ; 取出显示缓冲的高位<BR>MOV B,#10<BR>MUL AB
;乘10<BR>ADD A,DISPBUF+1 ;加低位<BR>MOV SETVAL,A ;送到setval暂存<BR>MOV
VALUE,SETVAL ;送显示<BR>JMP LOOP<BR>KEY: ORL P3,#00111100B ;键盘口先送1<BR>CLR
KEYOK ;清key标志<BR>MOV A,P3 ;取p3的值<BR>ORL A,#11000011B ;把无关的4位置位<BR>CPL A
;取反a<BR>JZ KEY_RET ;没有按则所有位都是1 取反则为0<BR>CALL DELAY<BR><BR>MOV A,P3
;再读p3的值<BR>ORL A,#11000011B<BR>CPL A<BR>JZ KEY_RET<BR>SETB KEYOK
;确实有按下<BR>JNB ACC.2,KEY_1 ;s1没有按转key1<BR>MOV KEYVAL,#0 ;如按下则值为0<BR>JMP
KEY_RET<BR>KEY_1:JNB ACC.3,KEY_2 ;s1没有按转key2<BR>MOV KEYVAL,#1
;如按下则值为1<BR>JMP KEY_RET<BR>KEY_2:JNB ACC.4,KEY_3<BR>MOV KEYVAL,#2<BR>JMP
KEY_RET<BR>KEY_3:MOV KEYVAL,#3<BR>KEY_RET:<BR>MOV A,P3<BR>ORL
A,#11000011B<BR>CPL A<BR>JNZ KEY_RET ;等按键释放<BR>RET<BR>DELAY: mov r5,#2
;延时20MS<BR>d1:mov r6,#2<BR><BR>D2:djnz r6,d2<BR>djnz
r5,d1<BR>ret<BR><BR>INT_T0: ;定时器t0的中断响应<BR>PUSH ACC<BR>PUSH PSW
;压堆栈<BR>MOV TH0,#HIGH(TMRVAR)<BR>MOV TL0,#LOW(TMRVAR)<BR>INC COUNT
;软件计数器加1<BR>MOV A,COUNT ;<BR>CJNE A,#200,INT_N2<BR>MOV COUNT,#0
;到了200清除<BR>INT_N1:JNB STARTRUN,INT_N2 ; 停止运转,转<BR>DEC VALUE ;计数器减1<BR>MOV
A,VALUE<BR>JNZ INT_N2 ; 不为0则转<BR>MOV VALUE,SETVAL ;
否则再置初值<BR>INT_N2:<BR>SETB FIRST<BR>SETB SECOND ;关显示<BR>MOV A,#DISPBUF ;
显示缓冲的首地址<BR>ADD A,COUNTER<BR>MOV R0,A<BR>MOV A,@R0 ;根据计数器的值取相应缓冲的值<BR>MOV
DPTR ,#DISPTAB ;字型表的首地址<BR>MOVC A,@A+DPTR<BR>MOV P0,A ; 送显示<BR>MOV
A,COUNTER ;取计数器的值<BR>JZ DISPFIRST ; 如果为0则显示第一位<BR>CLR SECOND ;
否则显示第二位<BR>AJMP DISPNEXT<BR>DISPFIRST:<BR>CLR FIRST
;显示第一位<BR>DISPNEXT:<BR>INC COUNTER ;计数器加1<BR>MOV A,COUNTER<BR>DEC A<BR>DEC
A ;如果为2则回0<BR>JZ RSTCOUNT<BR>AJMP DISPEXIT<BR>RSTCOUNT:<BR>MOV COUNTER,#0
;计数器的值只能为0或者1<BR>DISPEXIT:<BR>POP PSW<BR>POP ACC<BR>RETI<BR>DISPTAB:DB
28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H<BR><BR>END<BR><BR><BR><BR></P></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -