📄 104-1602ʦ
字号:
C51 COMPILER V9.01 MAIN 05/13/2012 00:36:50 PAGE 1
C51 COMPILER V9.01, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <REG51.H>
2 #include <intrins.h>
3 //#include "LCD1602.h"
4 //#include "DS1302.h"
5 #define uint unsigned int
6 #define uchar unsigned char
7 sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚
8 sbit DS1302_IO = P1^6; //实时时钟数据线引脚
9 sbit DS1302_RST = P1^5; //实时时钟复位线引脚
10 sbit wireless_1 = P3^0;
11 sbit wireless_2 = P3^1;
12 sbit wireless_3 = P3^2;
13 sbit wireless_4 = P3^3;
14 sbit beep=P3^4;
15 sbit ACC0 = ACC^0;
16 sbit ACC7 = ACC^7;
17 char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year,hide_m,hide_f,hide_h;
18 sbit Set = P2^0; //模式切换键
19 sbit Up = P2^1; //加法按钮
20 sbit Down = P2^2; //减法按钮
21 sbit out = P2^3; //立刻跳出调整模式按钮
22 sbit dd=P2^4; // 定时
23
24 sbit DQ = P1^0; //温度传送数据IO口
25
26 char done,count,temp,flag,up_flag,down_flag,key;
27 uchar temp_value; //温度值
28 uchar m,f,h,mo,d,y,w,kaiguan,h=12,f=30;
29 uchar TempBuffer[5],week_value[2],nao[8];
30 void naotime();
31 uchar code tone[]={212,212,190,212,159,169,212,212,190,212,142,159,
32 212,212,106,126,159,169,190,119,119,126,159,142,159,0};
33
34 uchar code lon[]={9,3,12,12,12,24,9,3,12,12,12,24,
35 9,3,12,12,12,12,12,9,3,12,12,12,24,0};
36
37 void delay(uint z)
38 {
39 1 uint x,y;
40 1 for(x=z;x>0;x--)
41 1 for(y=110;y>0;y--);
42 1 }
43 void music()
44 {
45 1 uint i,j,k=0,m;
46 1 for(m=0;m<26;m++)
47 1 {
48 2 for(i=0;i<lon[k]*20;i++)
49 2 {
50 3 beep=~beep;
51 3 for(j=0;j<tone[k]/3;j++);
52 3 }
53 2 delay(10);
54 2 k++;
55 2 }
C51 COMPILER V9.01 MAIN 05/13/2012 00:36:50 PAGE 2
56 1 }
57 void show_time(); //液晶显示程序
58 /***********1602液晶显示部分子程序****************/
59
60
61 //Port Definitions**********************************************************
62 sbit LcdRs = P2^5;
63 sbit LcdRw = P2^6;
64 sbit LcdEn = P2^7;
65 sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
66
67 //内部等待函数**************************************************************************
68 unsigned char LCD_Wait(void)
69 {
70 1 LcdRs=0;
71 1 LcdRw=1; _nop_();
72 1 LcdEn=1; _nop_();
73 1
74 1 LcdEn=0;
75 1 return DBPort;
76 1 }
77 //向LCD写入命令或数据************************************************************
78 #define LCD_COMMAND 0 // Command
79 #define LCD_DATA 1 // Data
80 #define LCD_CLEAR_SCREEN 0x01 // 清屏
81 #define LCD_HOMING 0x02 // 光标返回原点
82 void LCD_Write(bit style, unsigned char input)
83 {
84 1 LcdEn=0;
85 1 LcdRs=style;
86 1 LcdRw=0; _nop_();
87 1 DBPort=input; _nop_();//注意顺序
88 1 LcdEn=1; _nop_();//注意顺序
89 1 LcdEn=0; _nop_();
90 1 LCD_Wait();
91 1 }
92
93 //设置显示模式************************************************************
94 #define LCD_SHOW 0x04 //显示开
95 #define LCD_HIDE 0x00 //显示关
96
97 #define LCD_CURSOR 0x02 //显示光标
98 #define LCD_NO_CURSOR 0x00 //无光标
99
100 #define LCD_FLASH 0x01 //光标闪动
101 #define LCD_NO_FLASH 0x00 //光标不闪动
102
103 void LCD_SetDisplay(unsigned char DisplayMode)
104 {
105 1 LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
106 1 }
107
108 //设置输入模式************************************************************
109 #define LCD_AC_UP 0x02
110 #define LCD_AC_DOWN 0x00 // default
111
112 #define LCD_MOVE 0x01 // 画面可平移
113 #define LCD_NO_MOVE 0x00 //default
114
115 void LCD_SetInput(unsigned char InputMode)
116 {
117 1 LCD_Write(LCD_COMMAND, 0x04|InputMode);
C51 COMPILER V9.01 MAIN 05/13/2012 00:36:50 PAGE 3
118 1 }
119
120 //初始化LCD************************************************************
121 void LCD_Initial()
122 {
123 1 LcdEn=0;
124 1 LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
125 1 LCD_Write(LCD_COMMAND,0x38);
126 1 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
127 1 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
128 1 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
129 1 }
130
131 //液晶字符输入的位置************************
132 void GotoXY(unsigned char x, unsigned char y)
133 {
134 1 if(y==0)
135 1 LCD_Write(LCD_COMMAND,0x80|x);
136 1 if(y==1)
137 1 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
138 1 }
139
140 //将字符输出到液晶显示
141 void Print(unsigned char *str)
142 {
143 1 while(*str!='\0')
144 1 {
145 2 LCD_Write(LCD_DATA,*str);
146 2 str++;
147 2 }
148 1 }
149 /*void printc(unsigned char lcd_data)
150 {
151 LCD_Write(LCD_DATA,lcd_data);
152 }*/
153
154
155
156
157
158 /***********DS1302时钟部分子程序******************/
159 typedef struct __SYSTEMTIME__
160 {
161 unsigned char Second;
162 unsigned char Minute;
163 unsigned char Hour;
164 unsigned char Week;
165 unsigned char Day;
166 unsigned char Month;
167 unsigned char Year;
168 unsigned char DateString[12];
169 unsigned char TimeString[10];
170 }SYSTEMTIME; //定义的时间类型
171 SYSTEMTIME CurrentTime;
172
173
174 #define AM(X) X
175 #define PM(X) (X+12) // 转成24小时制
176 #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
177 #define DS1302_MINUTE 0x82
178 #define DS1302_HOUR 0x84
179 #define DS1302_WEEK 0x8A
C51 COMPILER V9.01 MAIN 05/13/2012 00:36:50 PAGE 4
180 #define DS1302_DAY 0x86
181 #define DS1302_MONTH 0x88
182 #define DS1302_YEAR 0x8C
183
184 void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
185 {
186 1 unsigned char i;
187 1 ACC = d;
188 1 for(i=8; i>0; i--)
189 1 {
190 2 DS1302_IO = ACC0; //相当于汇编中的 RRC
191 2 DS1302_CLK = 1;
192 2 DS1302_CLK = 0;
193 2 ACC = ACC >> 1;
194 2 }
195 1 }
196
197 unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
198 {
199 1 unsigned char i;
200 1 for(i=8; i>0; i--)
201 1 {
202 2 ACC = ACC >>1; //相当于汇编中的 RRC
203 2 ACC7 = DS1302_IO;
204 2 DS1302_CLK = 1;
205 2 DS1302_CLK = 0;
206 2 }
207 1 return(ACC);
208 1 }
209
210 void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
211 {
212 1 DS1302_RST = 0;
213 1 DS1302_CLK = 0;
214 1 DS1302_RST = 1;
215 1 DS1302InputByte(ucAddr); // 地址,命令
216 1 DS1302InputByte(ucDa); // 写1Byte数据
217 1 DS1302_CLK = 1;
218 1 DS1302_RST = 0;
219 1 }
220
221 unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
222 {
223 1 unsigned char ucData;
224 1 DS1302_RST = 0;
225 1 DS1302_CLK = 0;
226 1 DS1302_RST = 1;
227 1 DS1302InputByte(ucAddr|0x01); // 地址,命令
228 1 ucData = DS1302OutputByte(); // 读1Byte数据
229 1 DS1302_CLK = 1;
230 1 DS1302_RST = 0;
231 1 return(ucData);
232 1 }
233
234
235
236 void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
237 {
238 1 unsigned char ReadValue;
239 1 ReadValue = Read1302(DS1302_SECOND);
240 1 Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
241 1 ReadValue = Read1302(DS1302_MINUTE);
C51 COMPILER V9.01 MAIN 05/13/2012 00:36:50 PAGE 5
242 1 Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
243 1 ReadValue = Read1302(DS1302_HOUR);
244 1 Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
245 1 ReadValue = Read1302(DS1302_DAY);
246 1 Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
247 1 ReadValue = Read1302(DS1302_WEEK);
248 1 Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
249 1 ReadValue = Read1302(DS1302_MONTH);
250 1 Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
251 1 ReadValue = Read1302(DS1302_YEAR);
252 1 Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
253 1 }
254
255 void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
256 { if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2
-007/07/22
257 1 {
258 2 Time->DateString[0] = '2';
259 2 Time->DateString[1] = '0';
260 2 Time->DateString[2] = Time->Year/10 + '0';
261 2 Time->DateString[3] = Time->Year%10 + '0';
262 2 }
263 1 else
264 1 {
265 2 Time->DateString[0] = ' ';
266 2 Time->DateString[1] = ' ';
267 2 Time->DateString[2] = ' ';
268 2 Time->DateString[3] = ' ';
269 2 }
270 1 Time->DateString[4] = '/';
271 1 if(hide_month<2)
272 1 {
273 2 Time->DateString[5] = Time->Month/10 + '0';
274 2 Time->DateString[6] = Time->Month%10 + '0';
275 2 }
276 1 else
277 1 {
278 2 Time->DateString[5] = ' ';
279 2 Time->DateString[6] = ' ';
280 2 }
281 1 Time->DateString[7] = '/';
282 1 if(hide_day<2)
283 1 {
284 2 Time->DateString[8] = Time->Day/10 + '0';
285 2 Time->DateString[9] = Time->Day%10 + '0';
286 2 Time->DateString[10] =' ';
287 2 Time->DateString[11] =' ';
288 2 }
289 1 else
290 1 {
291 2 Time->DateString[8] = ' ';
292 2 Time->DateString[9] = ' ';
293 2 Time->DateString[10] =' ';
294 2 Time->DateString[11] =' ';
295 2 }
296 1 if(hide_week<2)
297 1 {
298 2 week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -