📄 ds1302+lcd1602-c51.lst
字号:
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS1302_LCD1602_C51
OBJECT MODULE PLACED IN DS1302+LCD1602-C51.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE DS1302+LCD1602-C51.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************/
2 /* */
3 /* - DS1302时钟显示与定时控制 */
4 /* */
5 /* LCD1602显示 */
6 /*---------------------湖北汽车工业学院----------------------------*/
7 /*--------------------------电信系---------------------------------*/
8 /******************************************************************/
-
9 #include<reg51.h>
10 #include<intrins.h>
11 #include"AT2402.H"
12
13 #define ALARM_NUM 8
14 #define uchar unsigned char
15 #define uint unsigned int
16 sbit LCD_RS = P2^0; //REST的信号
17 sbit LCD_RW = P2^1; //
18 sbit LCD_EN = P2^2;
19
20 sbit K1 = P1^4; //开关
21 sbit K2 = P1^5;
22 sbit K3 = P1^6;
23 sbit K4 = P1^7;
24
25 //*******************************************
26 sbit reset = P1^2; //DS1302的复位信号
27 sbit sclk = P1^0; //DS1302的时钟信号
28 sbit io = P1^1; //IO口信号 数据线
29 //*******************************************
30
31 /////****************************************
32 //24c04的定义****************************
33 //sbit sclk;
34 //******************************************
35 sbit BEEP = P3^7;
36 bit flag=1, hour=0, min=0, sec=0, num=0;
37 bit year=0, month=0, day=0, week=0;
38 bit alarm_flag=0;
39 uchar timecount=0, count=0;
40 uchar k=0;
41
42 uchar str1[]=" - - Week: ";
43 uchar str2[]="Time: ";
44 uchar str3[]="Alarm: ";
45 uchar str4[]="Alarm_num: ";
46 uchar init [] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //
47 uchar init1[] ={0x00,0x00};
48 uchar init2[] ={0x00,0x59,0x23,0x01,0x05,0x01,0x06}; //星期0x01
49 //秒, 分, 时, 日, 月,星期,年
50
51 //******************************************
52
53 struct alarm
54 {
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 2
55 char s; //秒
56 char m; //分
57 char h; // 时
58 }alarm2={0x00,0x00,0x00}; //定义结构数组
59
60 //********************************************************************************
61
62 uchar code mytab[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00}; //小喇叭
63
64 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; //延时作用
65
66 void Set_W1302(uchar addr); // 设定值写入DS1302
67 void Set_Flash(uchar row,uchar col); // 被设置数据闪动
68 void Set_place(uchar row,uchar col); // 指定位置显示
69 void Play_nowtime(); // 显示当前时间
70 void key_set(uchar num,uchar row,uchar col ); // 键设定函数
71 void alarm_time(); // 报警时间设定
72 void Play_alarmtime(); // 报警时间显示
73 void Time_compare(); // 时间比较
74 void write_byte(uchar inbyte);
75 void init_24c02(void); //初始化24c02
76 /******************************************************************/
77 void delay1(int ms) //延时函数
78 {
79 1 unsigned char y;
80 1 while(ms--)
81 1 {
82 2 for(y = 0; y<250; y++)
83 2 {
84 3 _nop_();
85 3 _nop_();
86 3 _nop_();
87 3 _nop_();
88 3 }
89 2 }
90 1 }
91
92 /**********以下为读写24c02的函数***********************************************/
93 /**********************************************************/
94 //写的子函数
95 /**********************************************************/
96 void write_byte(uchar inbyte)
97 {
98 1 uchar i;
99 1 for(i=0;i<8;i++)
100 1 {
101 2 sclk=0; //写的时候低电平改变数据
102 2 if(inbyte&0x01)
103 2 io=1; //数据线
104 2 else
105 2 io=0;
106 2 sclk=1; //写的时候高电平,把数据写入ds1302
107 2 _nop_();
108 2 inbyte=inbyte>>1;
109 2 }
110 1 }
111
112 /******************************************************************/
113 /* */
114 /*检查LCD忙状态 */
115 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
116 /* */
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 3
117 /******************************************************************/
118
119 bit lcd_busy()
120 {
121 1 bit result;
122 1 LCD_RS = 0; //指令寄存器
123 1 LCD_RW = 1; //读数据
124 1 LCD_EN = 1; //使能信号
125 1 delayNOP();
126 1 result = (bit)(P0&0x80);//读取信号
127 1 LCD_EN = 0;
128 1 return(result);
129 1 }
130
131 /*********************************************************/
132 /* */
133 /*写指令数据到LCD */
134 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
135 /* */
136 /*********************************************************/
137
138 void lcd_wcmd(uchar cmd)
139 {
140 1 while(lcd_busy());
141 1 LCD_RS = 0;
142 1 LCD_RW = 0;//写数据
143 1 LCD_EN = 0; //不动作
144 1 _nop_();
145 1 _nop_();
146 1 P0 = cmd; //指令数据
147 1 delayNOP();
148 1 LCD_EN = 1; //高位使能
149 1 delayNOP();
150 1 LCD_EN = 0;
151 1 }
152
153 /*********************************************************/
154 /* */
155 /*写显示数据到LCD */
156 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
157 /* */
158 /*********************************************************/
159 void lcd_wdat(uchar dat)
160 {
161 1 while(lcd_busy());
162 1 LCD_RS = 1; //写入数据寄存器
163 1 LCD_RW = 0;
164 1 LCD_EN = 0;
165 1 P0 = dat; //写入数据
166 1 delayNOP();
167 1 LCD_EN = 1;
168 1 delayNOP();
169 1 LCD_EN = 0;
170 1 }
171
172 /*********************************************************/
173 /* */
174 /* LCD初始化设定 */
175 /* */
176 /*********************************************************/
177
178 void init_lcd()
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 4
179 {
180 1 delay1(15);
181 1 lcd_wcmd(0x01); //清除LCD的显示内容
182 1
183 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
184 1 delay1(5);
185 1 lcd_wcmd(0x38);
186 1 delay1(5);
187 1 lcd_wcmd(0x38);
188 1 delay1(5);
189 1
190 1 lcd_wcmd(0x0c); //显示开,关光标
191 1 delay1(5);
192 1 lcd_wcmd(0x06); //移动光标
193 1 delay1(5);
194 1 lcd_wcmd(0x01); //清除LCD的显示内容
195 1 delay1(5);
196 1 }
197
198 /*********************************************************/
199 //延时函数
200 /*********************************************************/
201 void delay()
202 {
203 1 uchar j;
204 1 for(j=250;j>0;j--);
205 1 }
206
207 /*********************************************************/
208 /* */
209 /* 写字符串函数 */
210 /* */
211 /*********************************************************/
212 void write_str(uchar addr,uchar *p)
213 {
214 1 uchar i=0;
215 1 lcd_wcmd(addr); //写入指令数据
216 1 while(p[i]!='\0')
217 1 {
218 2 lcd_wdat(p[i]);//写入数据
219 2 i++;
220 2 }
221 1 }
222
223 /*********************************************************/
224 /* */
225 /* 设定显示位置 */
226 /* */
227 /*********************************************************/
228 void write_position(uchar row,uchar col)
229 {
230 1 uchar place;
231 1 if(row==1)
232 1 {
233 2 place=0x80+col-1;
234 2 lcd_wcmd(place); //位置指令数据
235 2 }
236 1 else
237 1 {
238 2 place=0xc0+col-1;
239 2 lcd_wcmd(place);
240 2 }
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 5
241 1 }
242
243 /*********************************************************/
244 /* */
245 /*自定义字符写入CGRAM */
246 /* */
247 /*********************************************************/
248 void writetab()
249 {
250 1 unsigned char i;
251 1 lcd_wcmd(0x40); //写CGRAM
252 1 for (i = 0; i< 8; i++)
253 1 lcd_wdat(mytab[i]);
254 1 }
255
256 /**********************************************************/
257 /**********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -