📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 06/08/2006 23:56:16 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*--------------------------------------
2 单片机课程大作业:电子钟
3 作者:kyflash
4 QQ:249656058
5 使用AT89S52(12M)+RT1602
6 两个独立按键,一个蜂鸣器和一个彩色LED
7 按键短按实现加一减一,1S以上长按实现功能调整,2S以上长按实现快速加减
8 可以根据需要使用一个按键或者两个按键
9 另外为了判断单片机资源利用情况,从而间接验证时钟是否会因为冲突而变缓,
10 加上了CPU利用率显示,限于个人水平,该数据只有参考意义
11
12 由于晶振误差等因素,如果发现一周内时钟偏差较大,可以自行调整,理想的做法是
13 在1s定时器中断里面加入若干个空操作语句(限于时钟快的情况)
14 各个功能块按顺序如下:
15 调整年
16 调整月
17 调整日
18 调整时
19 调整分
20 调整秒
21 调整星期
22 闹钟1时
23 闹钟1分
24 闹钟1是否开
25 闹钟2时
26 闹钟2分
27 闹钟2是否开
28
29 关于使用到的引脚,参见各个引脚定义
30
31 说明:
32 本程序仅为了应付单片机课程作业,必然存在一些不合理之处。
33 程序中的按键扫描放在了定时器中断中,其实放到主循环中更好。
34 程序中按键部分源自我以前参考computer00师兄在ADUC7027例成中的代码,
35 做了一点小修改
36 液晶驱动部分参考了网上一个程序
37
38 --------------------------------------*/
39 #include "main.h"
40 #include "1602.H"
41 #include "KEYS.h"
42 #include "timer.h"
43
44 volatile unsigned char menu_status=0,key_time=0;
45 volatile unsigned char ring_time=0;
46 volatile unsigned char alarm_hour1=10,alarm_minute1=2,alarm_hour2=10,alarm_minute2=4,alarm_1_ok=0,alarm_2_
-ok=0,
47 alarm_1_en=1,alarm_2_en=1,alarm_2_off=0,alarm_1_off=0;
48 void delayXms(unsigned int x) //延迟x毫秒函数
49 {
50 1 unsigned int i,j;
51 1 for(i=0;i<x;i++)
52 1 for(j=0;j<130;j++);
53 1 }
54
C51 COMPILER V7.06 MAIN 06/08/2006 23:56:16 PAGE 2
55 void short_bell(void)
56 {
57 1 bell_on;
58 1 delayXms(50);
59 1 bell_off;
60 1 }
61
62 void long_bell(void)
63 {
64 1 bell_on;
65 1 delayXms(30);
66 1 bell_off;
67 1 delayXms(80);
68 1 bell_on;
69 1 delayXms(35);
70 1 bell_off;
71 1 }
72
73 void system_initial(void) //系统初始化
74 {
75 1 TMOD=0x11; //定时器工作在模式1
76 1 ET0=1; //开定时器0中断
77 1 TR0=1; //启动定时器0
78 1 ET1=1; //开定时器1中断
79 1 TL1=0x10;
80 1 TH1=0x20;
81 1 TR1=1; //启动定时器1
82 1 EA=1; //开总中断
83 1 year=2006;
84 1 month=6;
85 1 day=9; //日期初始化为2005年6月9日
86 1 hour=10;
87 1 minute=0;
88 1 long_bell();
89 1 }
90
91 void display_alarm_time(unsigned char ID)
92 {
93 1 switch(ID)
94 1 {
95 2 case 1:
96 2 WriteCommandLCM(0x80,0);
97 2 LCD_prints("alarm1:");
98 2 WriteCommandLCM(0xc2,0);
99 2 LCD_printc(alarm_hour1/10%10+48);
100 2 LCD_printc(alarm_hour1%10+48);
101 2
102 2 LCD_printc(':');
103 2
104 2 LCD_printc(alarm_minute1/10%10+48);
105 2 LCD_printc(alarm_minute1%10+48);
106 2 if(alarm_1_en)
107 2 {
108 3 WriteCommandLCM(0xc0,1);
109 3 LCD_printc('e');
110 3 }
111 2 else {
112 3 WriteCommandLCM(0xc0,1);
113 3 LCD_printc(' ');
114 3 }
115 2 break;
116 2
C51 COMPILER V7.06 MAIN 06/08/2006 23:56:16 PAGE 3
117 2
118 2 case 2:
119 2 WriteCommandLCM(0x80,0);
120 2 LCD_prints("alarm2:");
121 2 WriteCommandLCM(0xc2,0);
122 2 LCD_printc(alarm_hour2/10%10+48);
123 2 LCD_printc(alarm_hour2%10+48);
124 2
125 2 LCD_printc(':');
126 2
127 2 LCD_printc(alarm_minute2/10%10+48);
128 2 LCD_printc(alarm_minute2%10+48);
129 2 if(alarm_2_en)
130 2 {
131 3 WriteCommandLCM(0xc0,1);
132 3 LCD_printc('e');
133 3 }
134 2 else
135 2 {
136 3 WriteCommandLCM(0xc0,1);
137 3 LCD_printc(' ');
138 3 }
139 2 break;
140 2 default:break;
141 2 }
142 1 }
143 void set_fuction(void)
144 {
145 1 //WriteCommandLCM(0x01,1); //显示清屏
146 1 WriteCommandLCM(0xcb,1);
147 1 switch(menu_status)
148 1 {
149 2 case 0:
150 2 LCD_prints(" "); //WriteCommandLCM(0x01,1); //显示清屏
151 2 break;
152 2 case 1:
153 2 LCD_prints("Year ");
154 2 break;
155 2 case 2:
156 2 LCD_prints("Month");
157 2 break;
158 2 case 3:
159 2 LCD_prints("Date ");
160 2 break;
161 2 case 4:
162 2 LCD_prints("Hour ");
163 2 break;
164 2 case 5:
165 2 LCD_prints("Minut");
166 2 break;
167 2 case 6:
168 2 LCD_prints("Secon");
169 2 break;
170 2 case 7:
171 2 LCD_prints("week ");
172 2 display_time();
173 2 break;
174 2 case 8:
175 2 WriteCommandLCM(0x01,1); //显示清屏
176 2 // WriteCommandLCM(0x8c,0);
177 2 WriteCommandLCM(0xcb,1);
178 2 LCD_prints("hour");
C51 COMPILER V7.06 MAIN 06/08/2006 23:56:16 PAGE 4
179 2 display_alarm_time(1);
180 2 break;
181 2 case 9:
182 2 //WriteCommandLCM(0x01,1); //显示清屏
183 2 // WriteCommandLCM(0x8c,0);
184 2 LCD_prints("minu");
185 2 display_alarm_time(1);
186 2 break;
187 2 case 10:
188 2 LCD_prints("alarm");
189 2 display_alarm_time(1);
190 2 break;
191 2 case 11:
192 2
193 2 // WriteCommandLCM(0x8c,0);
194 2 LCD_prints("hour");
195 2
196 2 display_alarm_time(2);
197 2 break;
198 2 case 12:
199 2 // WriteCommandLCM(0x8c,0);
200 2 LCD_prints("minu");
201 2 display_alarm_time(2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -