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