📄 51
字号:
C51 COMPILER V8.02 1602SHIZHONG 07/23/2009 15:22:57 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 1602SHIZHONG
OBJECT MODULE PLACED IN 1602shizhong.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602shizhong.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"REGx52.h"
2 #include"RICHMCU.H"
3 sbit a0 = ACC^0;
4 sbit a1 = ACC^1;
5 sbit a2 = ACC^2;
6 sbit a3 = ACC^3;
7 sbit a4 = ACC^4;
8 sbit a5 = ACC^5;
9 sbit a6 = ACC^6;
10 sbit a7 = ACC^7;
11 sbit DQ = P3^3 ; //18B20接口
12 sbit speaker = P3^6 ; //蜂鸣器
13 sbit MODE = P1^4 ; //模式键
14 sbit INC = P1^5 ; //增加键
15 sbit DEC = P1^6 ; //减少键
16 sbit OK = P1^7 ; //OK键
17 #define LCD1602_DATA P0 //8位数据并行口
18 #define LCD1602_RS P2_0 //指令OR数据寄存器选择
19 #define LCD1602_RW P2_1 //读写控制
20 #define LCD1602_EN P2_2 //使能控制
21 #define LCD1602_CLR 0x01 //清屏
22 #define LCD1602_MODE 0x38 //8位数据,双列显示,5*7字形
23 #define LCD1602_ON 0x0c //开显示,关光标,光标不闪烁
24 #define LCD1602_ADDR_MODE 0x06 //地址递增
25 #define DS1302_SCLK P1_0 //1302时钟线
26 #define DS1302_IO P1_1 //1302数据线
27 #define DS1302_RST P1_2 //1302复位线
28
29 volatile uint8 data timedata[7] ; //时间值
30 volatile uint8 data display_buffer1[16]; //显示缓冲区1
31 volatile uint8 data display_buffer2[16]; //显示缓冲区2
32 volatile uint8 data temdata[5] ; //存放温度值
33 volatile uint16 data tdat ; //温度值变量
34 volatile uint8 data tflag ; //温度正负值标志
35 volatile int8 self_pos = 0 ;//自定义三角形标志显示位置变量
36 volatile uint8 OK_VALUE = 0 ; //OK键键值变量
37 volatile bit bdata DIS_ON = 1 ; //显示开关位 1 == on 0 == off
38 volatile bit bdata SCAN_ON = 0 ; //按键扫描开关位,由定时器每20MS刷新
39 volatile data MODE_ON = 0 ; //模式键按下后显示菜单的开关位
40 volatile data INC_VALUE = 0 ;
41 volatile data DEC_VALUE = 0 ;
42 volatile bit bdata ALARM_VALUE = 0 ;//闹钟标志位
43 volatile bit bdata ALARM_ON = 1 ; //闹钟响时关闭标志位
44 volatile uint8 data read_1 = 1,read_2 = 1,read_3 = 1,read_4 = 1;
45 volatile uint8 data stopwatch_count = 0;
46 volatile uint8 data stopwatch_second = 0;
47 volatile uint8 data stopwatch_minute = 0;
48 volatile bit bdata STOPWATCH_START = 0;
49 uint8 code self_table1[]={
50 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,// 年
51 0x1f,0x11,0x1f,0x11,0x1f,0x11,0x15,0x17,//月
52 0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,// 日
53 0x01,0x0c,0x17,0x14,0x17,0x0c,0x01,0x00,//闹钟标志
54 0x10,0x18,0x1c,0x1e,0x1f,0x1c,0x18,0x10 };//三角形符号
55
C51 COMPILER V8.02 1602SHIZHONG 07/23/2009 15:22:57 PAGE 2
56
57 /**********************************************************
58 蜂鸣器
59 ************************************************************/
60 void delay_ms(uint16 count) // 延时时间count*1ms
61 { uint16 i;
62 1 for(;count>0;count--)
63 1 {
64 2 for(i=0;i<110;i++)
65 2 {
66 3 nop;
67 3 }
68 2 }
69 1 }
70 void speakers(uint8 speak_count)
71 {
72 1 for(;speak_count>0;speak_count--)
73 1 {
74 2 speaker = 0 ;
75 2 delay_ms(1) ;
76 2 speaker = 1 ;
77 2 delay_ms(3) ;
78 2 }
79 1 }
80 /***********************************************************
81 忙检测
82 ************************************************************/
83 void LCD1602_check_busy(void)
84 {
85 1 LCD1602_DATA = 0xff;
86 1 LCD1602_RS = 0 ;
87 1 LCD1602_RW = 1 ;
88 1 LCD1602_EN = 1 ;
89 1 while(LCD1602_DATA & 0x80) ;
90 1 LCD1602_EN = 0 ;
91 1 }
92
93 /**********************************************************
94 写指令
95 ************************************************************/
96
97 void LCD1602_write_cmd(uint8 cmd)
98 {
99 1 LCD1602_check_busy();
100 1 LCD1602_RS = 0 ;
101 1 LCD1602_RW = 0 ;
102 1 LCD1602_DATA = cmd ;
103 1 LCD1602_EN = 1 ;
104 1 LCD1602_EN = 0 ;
105 1 }
106
107 /***********************************************************
108 写数据
109 *************************************************************/
110 void LCD1602_write_data(uint8 dat)
111 {
112 1 LCD1602_check_busy();
113 1 LCD1602_RS = 1 ;
114 1 LCD1602_RW = 0 ;
115 1 LCD1602_DATA = dat ;
116 1 LCD1602_EN = 1 ;
117 1 LCD1602_EN = 0 ;
C51 COMPILER V8.02 1602SHIZHONG 07/23/2009 15:22:57 PAGE 3
118 1 }
119
120
121 /***********************************************************
122 1602初始化
123 ************************************************************/
124 void LCD1602_init(void)
125 {
126 1 uint8 i ;
127 1 LCD1602_write_cmd(0x40);//CGRAM起始地址
128 1 for(i=0;i<40;i++)
129 1 LCD1602_write_data(self_table1[i]);//写入自定义字符
130 1 LCD1602_write_cmd(LCD1602_MODE) ;
131 1 LCD1602_write_cmd(LCD1602_ON) ;
132 1 LCD1602_write_cmd(LCD1602_ADDR_MODE) ;
133 1 LCD1602_write_cmd(LCD1602_CLR) ;
134 1 }
135
136 /************************************************************
137 设置显示坐标
138 ************************************************************/
139 void LCD1602_set_postion(uint8 x , uint8 y)
140 {
141 1 if(y<2)
142 1 {
143 2 y &= 0x01 ; //y值限定在0~1之间
144 2 x &= 0x0f ; //x值限定在0~15之间
145 2 if(y == 0)
146 2 x |= 0x40 ; //如果显示是在第二行,则x的值加0x40
147 2 x |= 0x80 ; //获得x的值
148 2 LCD1602_write_cmd(x) ;//写入坐标值到LCD
149 2 }
150 1 }
151
152 /************************************************************
153 指定位置写字符
154 *************************************************************/
155 void LCD1602_write_char(uint8 x , uint8 y , uint8 chardata)
156 {
157 1 LCD1602_set_postion(x,y) ;
158 1 LCD1602_write_data(chardata) ;
159 1 }
160
161 /************************************************************
162 指定位置写字符串
163 *************************************************************/
164 void LCD1602_write_string(uint8 x , uint8 y , uint8 *string)
165 {
166 1 LCD1602_set_postion(x,y) ;
167 1 while((*string) != '\0')
168 1 {
169 2 LCD1602_write_data(*string) ;
170 2 string++ ;
171 2 }
172 1 }
173 /***************************************************************
174 指定位置显示自定义字符
175 **************************************************************
176 uint8 LCD1602_display_self(uint8 count)
177 {
178 switch(count)
179 {
C51 COMPILER V8.02 1602SHIZHONG 07/23/2009 15:22:57 PAGE 4
180 case 0 : sele_count = 0 ; break ;
181 case 1 : sele_count = 1 ; break ;
182 case 2 : sele_count = 2 ; break ;
183 case 3 : sele_count = 3 ; break ;
184 default : break ;
185 }
186 return(self_count) ;
187 }*/
188
189
190 /****************************************************************
191 底层驱动函数(输入)
192 *****************************************************************/
193 void DS1302_input(uint8 inputdata)
194 {
195 1 ACC = inputdata ;
196 1 DS1302_IO = a0 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
197 1 DS1302_IO = a1 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
198 1 DS1302_IO = a2 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
199 1 DS1302_IO = a3 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
200 1 DS1302_IO = a4 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
201 1 DS1302_IO = a5 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
202 1 DS1302_IO = a6 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
203 1 DS1302_IO = a7 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
204 1 }
205
206 /****************************************************************
207 底层驱动函数(输出)控制位的第七位必须为1
208 *****************************************************************/
209 uint8 DS1302_output(void)
210 {
211 1 DS1302_IO = 1 ;
212 1 a0 = DS1302_IO ;
213 1 DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a1 = DS1302_IO ;
214 1 DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a2 = DS1302_IO ;
215 1 DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a3 = DS1302_IO ;
216 1 DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a4 = DS1302_IO ;
217 1 DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a5 = DS1302_IO ;
218 1 DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a6 = DS1302_IO ;
219 1 DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a7 = DS1302_IO ;
220 1 return(ACC);
221 1 }
222
223 /****************************************************************
224 底层驱动函数(指定地址写一个字节的数据)
225 *****************************************************************/
226 void DS1302_write_byte(uint8 cmd , uint8 dat)
227 {
228 1 DS1302_SCLK = 0 ;
229 1 DS1302_RST = 0 ;
230 1 DS1302_RST = 1 ;
231 1 DS1302_input(cmd) ;
232 1 DS1302_input(dat) ;
233 1 DS1302_RST = 0 ;
234 1 DS1302_SCLK = 1 ;
235 1 }
236
237 /****************************************************************
238 底层驱动函数(指定地址读取一字节的数据)
239 *****************************************************************/
240 uint8 DS1302_read_byte(uint8 cmd)
241 {
C51 COMPILER V8.02 1602SHIZHONG 07/23/2009 15:22:57 PAGE 5
242 1 uint8 receivedata = 0 ;
243 1 DS1302_SCLK = 0 ;
244 1 DS1302_RST = 0 ;
245 1 DS1302_RST = 1 ;
246 1 DS1302_input(cmd) ;
247 1 receivedata = DS1302_output() ;
248 1 DS1302_RST = 0 ;
249 1 DS1302_SCLK = 1 ;
250 1 return(receivedata) ;
251 1 }
252
253 /********************************************************
254 设置1302的初始时间
255 *********************************************************/
256 void DS1302_init()
257 {
258 1 if(DS1302_read_byte(0xc9) != 0xf0)
259 1 {
260 2 DS1302_write_byte(0x8e,0x00) ;//允许写操作
261 2 DS1302_write_byte(0xc8,0xf0) ; //写入初始化标志 ,系统上电后检测此标志,即此子函数只会在第一次初始化一
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -