lesson 10.lst
来自「有51单片机C语言基础后在较短时间内学会51单片机C。」· LST 代码 · 共 385 行 · 第 1/2 页
LST
385 行
C51 COMPILER V8.05a LESSON_10 02/05/2009 23:23:38 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE LESSON_10
OBJECT MODULE PLACED IN lesson 10.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lesson 10.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4
5 uchar table1[]=" 2009-02-05";
6 uchar table2[]=" 23:23:55";
7 uchar count,switch_num,flag,judge,day_full,week;
8 uint year;
9 char table3[7][3]={{"SUN"},{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"}};
10 char hour,minute,second,day,month,year1,year2;
11
12 sbit s1=P3^2;
13 sbit s2=P3^4;
14 sbit rs=P3^0;
15 sbit en=P3^1;
16 sbit switch1=P3^5; //功能键
17 sbit switch2=P3^6; //加1键
18 sbit switch3=P3^7; //减1键
19
20 void delay(uint z); //延时
21 void intial_T0(); //定时器T0初始化
22 void initial_LCD(); //液晶显示初始化
23 void write_cmd(uchar cmd_data); //写命令
24 void write_data(uchar data1); //写数据
25 void LCD_display(uchar address,uchar temp); //年、月、日、时、分、秒显示
26 void week_display(uchar week); //星期显示
27 void keyscan(); //键盘
28 void count_month_year(); //判断闰年和非闰年个月的天数
29 void count_day(); //年、月
30
31 void main()
32 {
33 1 intial_T0();
34 1 initial_LCD();
35 1 while(1)
36 1 {
37 2 keyscan();
38 2 }
39 1 }
40
41 void delay(uint z) //延时
42 {
43 1 uint x,y;
44 1 for(x=z;x>0;x--)
45 1 for(y=110;y>0;y--);
46 1 }
47
48 void intial_T0() //T0初始化
49 {
50 1 second=56;minute=23;hour=23; week=4;
51 1 day=5; month=2; year1=9; year2=20;
52 1 TMOD=0x01;
53 1 TH0=(65536-50000)/256;
54 1 TL0=(65536-50000)%256;
55 1 EA=1;
C51 COMPILER V8.05a LESSON_10 02/05/2009 23:23:38 PAGE 2
56 1 ET0=1;
57 1 TR0=1;
58 1 }
59
60 void initial_LCD()
61 {
62 1 uchar i;
63 1 en=0; switch1=1; switch2=1; switch3=1;
64 1 write_cmd(0x38); // 16X2 5X8显示
65 1 write_cmd(0x0c); //开显示 光标 闪烁
66 1 write_cmd(0x06); //地址指针自动加一,不移动
67 1 write_cmd(0x01); //清屏
68 1 write_cmd(0x80); //数据指针设置
69 1 for(i=0;i<12;i++)
70 1 {
71 2 write_data(table1[i]);
72 2 }
73 1 write_cmd(0x80+0x40); //数据指针设置
74 1 for(i=0;i<12;i++)
75 1 {
76 2 write_data(table2[i]);
77 2 }
78 1 week_display(4); //写星期
79 1 }
80
81 void write_cmd(uchar cmd_data) //1602液晶写命令子程序
82 {
83 1 rs=0;
84 1 P2=cmd_data; delay(1); //P2为数据口
85 1 en=1; delay(1);
86 1 en=0;
87 1 }
88
89 void write_data(uchar data1) //1602液晶写数据子程序
90 {
91 1 rs=1;
92 1 P2=data1; delay(1); //P2为数据口
93 1 en=1; delay(1);
94 1 en=0;
95 1 }
96
97 void LCD_display(uchar address,uchar temp)
98 { //LCD显示程序
99 1 uchar shi,ge;
100 1 shi=temp/10;
101 1 ge=temp%10;
102 1 write_cmd(0x80+0x40+address); //数据指针设置
103 1 if(flag==1) write_cmd(0x80+address);
104 1 write_data(0x30+shi);
105 1 write_data(0x30+ge);
106 1 flag=0;
107 1 }
108
109 void week_display(uchar week1)
110 {
111 1 uchar i;
112 1 write_cmd(0x80+12);
113 1 for(i=0;i<3;i++)
114 1 {
115 2 write_data(table3[week1][i]);
116 2 }
117 1 }
C51 COMPILER V8.05a LESSON_10 02/05/2009 23:23:38 PAGE 3
118
119 void keyscan()
120 {
121 1 if(switch1==0) //判断功能键是否按下
122 1 {
123 2 delay(5); //去抖动
124 2 if(switch1==0) //在判断功能键是否按下
125 2 {
126 3 while(!switch1); //松手检测
127 3 delay(5);
128 3 switch_num++; //功能键次数加一
129 3 TR0=0;
130 3 if(0<switch_num<=8) //功能键1到3次液晶显示对应位闪烁
131 3 write_cmd(0x0d);
132 3 if(switch_num==9) //按4次功能键时钟运行
133 3 {
134 4 switch_num=0;
135 4 TR0=1; //时钟重新运行
136 4 write_cmd(0x0c); //消除闪烁
137 4 }
138 3 switch(switch_num) //时 分 秒对应位闪烁
139 3 {
140 4 case 1: { write_cmd(0x80+0x40+11);}break;
141 4 case 2: { write_cmd(0x80+0x40+8);}break;
142 4 case 3: { write_cmd(0x80+0x40+5);}break;
143 4 case 4: { write_cmd(0x80+2);}break;
144 4 case 5: { write_cmd(0x80+4);}break;
145 4 case 6: { write_cmd(0x80+7);}break;
146 4 case 7: { write_cmd(0x80+10);}break;
147 4 case 8: { write_cmd(0x80+13);}break;
148 4 }
149 3 }
150 2 }
151 1 if(switch_num!=0) //判断功能键是否按下过
152 1 {
153 2 if(switch2==0) //判断加1键是否按下
154 2 {
155 3 delay(5); //去抖动
156 3 if(switch2==0)
157 3 {
158 4 while(!switch2);
159 4 delay(5);
160 4 switch(switch_num)
161 4 {
162 5 case 1:{second++; //秒加1并刷新显示
163 6 if(second==60) second=0;
164 6 LCD_display(10,second);
165 6 write_cmd(0x80+0x40+11);}break;
166 5 case 2:{minute++; //分加1并刷新显示
167 6 if(minute==60) minute=0;
168 6 LCD_display(7,minute);
169 6 write_cmd(0x80+0x40+8);}break;
170 5 case 3:{hour++; //时加1并刷新显示
171 6 if(hour==24) hour=0;
172 6 LCD_display(4,hour);
173 6 write_cmd(0x80+0x40+5);}break;
174 5 case 4:{year2++; //年高二位加1并刷新显示
175 6 if(year2==100) year2=0;
176 6 flag=1;
177 6 LCD_display(1,year2);
178 6 write_cmd(0x80+2);}break;
179 5 case 5:{year1++; //年低二位加1并刷新显示
C51 COMPILER V8.05a LESSON_10 02/05/2009 23:23:38 PAGE 4
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?