📄 timer02.lst
字号:
C51 COMPILER V8.05a TIMER02 02/28/2009 14:43:11 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE TIMER02
OBJECT MODULE PLACED IN timer02.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE timer02.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /* 程序能够正常运行,问题出现在keyscan()函数s2和s3的级数弄错了*/
2 #include<reg52.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5 uchar s1num=0;
6 uchar count;
7 char shi=23,fen=58,miao=25;
8 uint i;
9 sbit rs=P3^5;
10 sbit lcden=P3^4;
11 sbit s1=P2^0;
12 sbit s2=P2^1;
13 sbit s3=P2^2;
14 uchar code table[]=" dianzishizhong";//第一行显示
15 uchar code table1[]=" 23:58:25";//第二行 共12个字符,地址从零开始计0~11
16 /*液晶内延时函数*/
17 void delay(uint z)
18 {
19 1 uint x,y;
20 1 for(x=z;x>0;x--)
21 1 for(y=110;y>0;y--);
22 1 }
23 /*1602液晶写指令初始化,条件是rs为低电平,E为高脉冲*/
24 void write_com(uchar com)
25 {
26 1 rs=0;
27 1 lcden=0;
28 1 P0=com;//写入指令
29 1 delay(5);//延时5ms
30 1 lcden=1;
31 1 delay(5);
32 1 lcden=0;
33 1 }
34 /*1602液晶写数据初始化,条件是rs为高电平电平,E为高脉冲*/
35
36 void write_date(uchar date)
37 {
38 1 rs=1;
39 1 lcden=0;
40 1 P0=date;//写入指令
41 1 delay(5);//延时5ms
42 1 lcden=1;
43 1 delay(5);
44 1 lcden=0;
45 1 }
46 /*初始化液晶1602,说明书上有初始化设置,设置液晶的显示方式*/
47 void init()
48 {
49 1 lcden=0;
50 1 write_com(0x38);//显示模式设置,设置为16*2,5*7点阵,8位数据接口
51 1 write_com(0x0c);//开显示,不显示光标,光标不显示。
52 1 write_com(0x06);//当读或写一个字符后地址指针加1,且光标加1。
53 1 write_com(0x01);//刷新,数据指针清零、所有显示清零,不写的话刚显示会有一个黑团
54 1 write_com(0x80);//初始化地址,默认地址80H从第二行开始显示write_com(0x80+0x40h)
55 1 TMOD=0x01;
C51 COMPILER V8.05a TIMER02 02/28/2009 14:43:11 PAGE 2
56 1 TH0=(65536-50000)/256;//12mhZ
57 1 TL0=(65536-50000)%256;//50MS
58 1 EA=1;
59 1 ET0=1;
60 1 TR0=1;
61 1 for (i=0;i<=15;i++)
62 1 write_date(table[i]);
63 1 write_com(0x80+0x40);
64 1 for(i=0;i<12;i++)
65 1 write_date(table1[i]);
66 1 }
67 void write_sfm(uchar add ,uchar date)//时分秒函数,add为地址变量,date为写入的时分秒
68 {
69 1 uchar shi ,ge;
70 1 shi=date/10;
71 1 ge=date%10;//分离date时分秒的十位和个位用数码管也得分离
72 1 write_com(0x80+0x40+add);//时分秒的地址
73 1 write_date(0x30+shi);//跟据acs码,先送十位
74 1 write_date(0x30+ge);
75 1 }
76 /*键盘扫描函数,s1是一级,s2和s3是一级的比S1第一级*/
77 void keyscan()
78 {
79 1 if(s1==0)
80 1 {
81 2 delay(5);
82 2 if(s1==0)
83 2 {
84 3 s1num++;
85 3 while(!s1);
86 3 switch(s1num)
87 3 {
88 4 case 1:
89 4 {
90 5 write_com(0x80+0x40+11);
91 5 write_com(0x0f);
92 5 TR0=0;
93 5 } break;
94 4 case 2:
95 4 {
96 5 write_com(0x80+0x40+8) ;
97 5 write_com(0x0f);
98 5 TR0=0;
99 5 } break;
100 4 case 3:
101 4 {
102 5 write_com(0x80+0x40+5);
103 5 write_com(0x0f);
104 5 TR0=0;
105 5 } break;
106 4 default:
107 4 {
108 5 write_com(0x0c);
109 5 TR0=1;
110 5 }
111 4 }
112 3 }//s1键被按下
113 2 }
114 1 if(s1num!=0)
115 1 {
116 2 if(s2==0)//第二个键被按下,让时或分或秒加一
117 2 {
C51 COMPILER V8.05a TIMER02 02/28/2009 14:43:11 PAGE 3
118 3 while(!s2);//等待松手
119 3 if(s1num==1)//秒针按下
120 3 {
121 4 miao++;
122 4 if(miao==60) miao=0;
123 4 write_sfm(10,miao);
124 4 write_com(0x80+0x40+10);//驳回指针
125 4
126 4 }
127 3 if(s1num==2)
128 3 {
129 4 fen++;
130 4 if(fen==60) fen=0;
131 4 write_sfm(7,fen);
132 4 write_com(0x80+0x40+7);
133 4 }
134 3 if(s1num==3)//小时
135 3 {
136 4 shi++;
137 4 if(shi==24) shi=0;
138 4 write_sfm(4,shi);
139 4 write_com(0x80+0x40+4);
140 4 }
141 3 }
142 2 /*时分秒减*/
143 2 if(s3==0)
144 2 {
145 3 delay(5);
146 3 if(s3==0)
147 3 {
148 4 while(!s3);
149 4 if(s1num==1)
150 4 {
151 5 miao--;
152 5 if(miao==-1) miao=59;
153 5 write_sfm(10,miao);
154 5 write_com(0x80+0x40+10);
155 5 }
156 4 if(s1num==2)
157 4 {
158 5 fen--;
159 5 if(fen==-1) fen=59;
160 5 write_sfm(7,fen);
161 5 write_com(0x80+0x40+7);
162 5 }
163 4 if(s1num==3)
164 4 {
165 5 shi--;
166 5 if(shi==-1) shi=59;
167 5 write_sfm(4,fen);
168 5 write_com(0x80+0x40+4);
169 5 }
170 4
171 4 }
172 3 }
173 2 }
174 1
175 1 }
176
177
178 void main()
179 {
C51 COMPILER V8.05a TIMER02 02/28/2009 14:43:11 PAGE 4
180 1 init();
181 1 while(1)
182 1 {
183 2 keyscan();
184 2 }
185 1 }
186 void timer0() interrupt 1
187 {
188 1 TH0=(65536-50000)/256;
189 1 TL0=(65536-50000)%256;
190 1 count++;
191 1 if(count==20)//1s
192 1 {
193 2 count=0;
194 2 miao++;
195 2 if(miao==60)// 判断秒是否到达60
196 2 {
197 3 miao=0;
198 3 fen++;
199 3 if(fen==60)
200 3 {
201 4 fen=0;
202 4 shi++;
203 4 if (shi==24)
204 4 {
205 5 shi=0;
206 5 }
207 4 write_sfm(4,shi);
208 4 }
209 3 write_sfm(7,fen);
210 3 }
211 2 write_sfm(10,miao);//根据table1[]中秒的十位的地址
212 2 }
213 1
214 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 551 ----
CONSTANT SIZE = 30 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -