📄 2402test.lst
字号:
C51 COMPILER V6.12 2402TEST 08/29/2007 22:42:54 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE 2402TEST
OBJECT MODULE PLACED IN 2402test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 2402test.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 /********************************************************************************************
3 //Dy-2402C 桌面控制钟
4 //应用程序 C
5 //杜洋
6 //V1.0 2007-4-20
7 //MCS-51 12MHZ C语言
8 //LCM2402 89S52 DS18B20 DS1302 AT24C02 红外接收IC
9 *********************************************************************************************/
10
11 /********************************************************************************************/
12 #include <AT89X52.h>
13 #include <string.h> // 包含头文件
14 /********************************************************************************************/
15 typedef unsigned char uint8; // 无符号8位整型变量
16 typedef unsigned short uint16; // 无符号16位整型变量
17 typedef signed char int8; // 有符号8位整型变量
18
19 sbit LED1 = P2 ^ 3; // 定义LCM2402的RS控制线
20
21 /********************************************************************************************/
22 //全局变量
23 static unsigned char data IRCode[3],IRCON,IRCON2;//遥控器中断专用
24 static unsigned char data DT,menu,rom,alarm_con;//遥控寄存值/菜单值/定时器组值/报警开关选择
25 /********************************************************************************************/
26
27
28 //=================================LCM2402模块驱动===========================================//
29
30 /********************************************************************************************/
31 #define LCM2402_DB0_DB7 P0 // 定义LCM2402的数据总线
32
33 sbit LCM2402_RS = P1 ^ 0; // 定义LCM2402的RS控制线
34 sbit LCM2402_RW = P1 ^ 2; // 定义LCM2402的RW控制线
35 sbit LCM2402_E = P1 ^ 1; // 定义LCM2402的E控制线
36 sbit LCM2402_Busy = P0 ^ 7; // 定义LCM2402的测忙线(与LCM2402_DB0_DB7关联)
37
38 /********************************************************************************************/
39 //定义LCM2402指令集//
40 #define CMD_clear 0x01 // 清除屏幕
41 #define CMD_back 0x02 // DDRAM回零位
42 #define CMD_dec1 0x04 // 读入后AC(指针)减1,向左写
43 #define CMD_add1 0x06 // 读入后AC(指针)加1,向右写
44 #define CMD_dis_gb1 0x0f // 开显示_开光标_开光标闪烁
45 #define CMD_dis_gb2 0x0e // 开显示_开光标_关光标闪烁
46 #define CMD_dis_gb3 0x0c // 开显示_关光标_关光标闪烁
47 #define CMD_OFF_dis 0x08 // 关显示_关光标_关光标闪烁
48 #define CMD_set82 0x38 // 8位总线_2行显示
49 #define CMD_set81 0x30 // 8位总线_1行显示(上边行)
50 #define CMD_set42 0x28 // 4位总线_2行显示
51 #define CMD_set41 0x20 // 4位总线_1行显示(上边行)
52 #define lin_1 0x80 // 4位总线_1行显示(上边行)
53 #define lin_2 0xc0 // 4位总线_1行显示(上边行)
54
55
C51 COMPILER V6.12 2402TEST 08/29/2007 22:42:54 PAGE 2
56 /********************************************************************************************[底层协议]
57 * 函数名称:DelayS()
58 * 功 能:延时
59 *********************************************************************************************/
60 void DelayS(unsigned int a){
61 1 unsigned char i;
62 1 while( --a != 0){
63 2 for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
64 2 } //i 从0加到125,CPU大概就耗时1毫秒
65 1 }
66 void DelayS250(void){
67 1 DelayS(250);
68 1 }
69 /********************************************************************************************[底层协议]
70 * 函数名称:LCM2402_TestBusy()
71 * 功 能:LCM2402测忙,若LCM2402处于忙状态,本函数将继续测忙,直到LCM2402处于非忙状态。
72 *********************************************************************************************/
73 void LCM2402_TestBusy(void){
74 1 LCM2402_DB0_DB7 = 0xff;//设备读状态
75 1 LCM2402_RS = 0;
76 1 LCM2402_RW = 1;
77 1 LCM2402_E = 1;
78 1 while(LCM2402_Busy);//等待LCM不忙
79 1 LCM2402_E = 0;//
80 1 }
81 /********************************************************************************************[底层协议]
82 * 函数名称:LCM2402_WriteCMD()
83 * 功 能:向LCM2402写命令。
84 * 入口参数:LCM2402_command 要写入LCM2402的命令字节
85 * 出口参数:无
86 *********************************************************************************************/
87 void LCM2402_WriteCMD(uint8 LCM2402_command) {
88 1 LCM2402_TestBusy();
89 1 LCM2402_DB0_DB7 = LCM2402_command;
90 1 LCM2402_RS = 0;
91 1 LCM2402_RW = 0;
92 1 LCM2402_E = 1;
93 1 LCM2402_E = 0;
94 1 }
95 /********************************************************************************************[底层协议]
96 * 函数名称:LCM2402_WriteData()
97 * 功 能:向LCM2402写数据。
98 * 入口参数:LCM2402_data 要写入LCM2402的数据字节
99 * 出口参数:无
100 *********************************************************************************************/
101 void LCM2402_WriteData(uint8 LCM2402_data){
102 1 LCM2402_TestBusy();
103 1 LCM2402_DB0_DB7 = LCM2402_data;
104 1 LCM2402_RS = 1;
105 1 LCM2402_RW = 0;
106 1 LCM2402_E = 1;
107 1 LCM2402_E = 0;
108 1 }
109 /********************************************************************************************
110 * 函数名称:LCM2402_Init()
111 * 功 能:LCM2402初始化
112 * 入口参数:无
113 * 出口参数:无
114 *********************************************************************************************/
115 void LCM2402_Init(void){
116 1 LCM2402_WriteCMD(CMD_set82);// 显示模式设置:显示2行,每个字符为5*7个像素
117 1 LCM2402_WriteCMD(CMD_clear);// 显示清屏
C51 COMPILER V6.12 2402TEST 08/29/2007 22:42:54 PAGE 3
118 1 LCM2402_WriteCMD(CMD_back);// 数据指针指向第1行第1个字符位置
119 1 LCM2402_WriteCMD(CMD_add1);// 显示光标移动设置:文字不动,光标右移
120 1 LCM2402_WriteCMD(CMD_dis_gb3); // 显示开及光标设置:显示开,光标开,闪烁开
121 1 }
122
123
124 /********************************************************************************************
125 * 函数名称:print()
126 * 功 能:向LCM发送一个字符串,长度48字符之内。//应用:print("doyoung.net");
127 * 入口参数:字符串
128 * 出口参数:无
129 *********************************************************************************************/
130 void print(uint8 a,uint8 *str){
131 1 LCM2402_WriteCMD(a);
132 1 while(*str != '\0'){
133 2 LCM2402_WriteData(*str++);
134 2 }
135 1 *str = 0;
136 1 }
137 /********************************************************************************************
138 * 函数名称:print2()
139 * 功 能:向LCM发送一个字符串,长度48字符之内。//应用:print("doyoung.net");
140 * 入口参数:字符串
141 * 出口参数:无
142 *********************************************************************************************/
143 void print2(uint8 a,uint8 t){//设置写入地址和数据//
144 1 LCM2402_WriteCMD(a);
145 1 LCM2402_WriteData(t);
146 1 }
147
148
149
150 //=================================AT24C02模块驱动===========================================//
151 //应用举例//
152 //AT24C02_Write1Byte(0x02,0xaa); // 向AT24C02的地址0x02写入0xaa
153 //i = AT24C02_Read1Byte(0x02); // 从AT24C02的地址0x02读出数据给变量i
154 /*********************************************************************************************/
155 #define AT24C02_WriteDeviceAddress 0xa0 /* 定义器件在I2C总线中的地址 */
156 #define AT24C02_ReadDeviceAddress 0xa1
157 sbit SCL=P2^1; /* 定义位变量 */ // I2C总线的时钟信号
158 sbit SDA=P2^2; // I2C总线的数据信号
159 #define TRUE 1
160 #define FALSE 0
161 #define I2C_DelayTime 60 // 不要小于50,否则可能造成时序混乱
162 /********************************************************************************************
163 * 函数名称:I2C_Delay()
164 * 功 能:I2C总线软件延时
165 * 入口参数:count 延时参数,值越大,延时越长
166 * 出口参数:无
167 *********************************************************************************************/
168 void I2C_Delay(uint16 count){
169 1 while(count!=0) count--;
170 1 }
171 /********************************************************************************************
172 * 函数名称:I2C_Start()
173 * 功 能:启动I2C总线
174 * 入口参数:无
175 * 出口参数:无
176 *********************************************************************************************/
177 void I2C_Start(void){
178 1 SDA=1;
179 1 SCL=1;
C51 COMPILER V6.12 2402TEST 08/29/2007 22:42:54 PAGE 4
180 1 I2C_Delay(I2C_DelayTime);
181 1 SDA=0;
182 1 I2C_Delay(I2C_DelayTime);
183 1 SCL=0;
184 1 I2C_Delay(I2C_DelayTime);
185 1 }
186 /********************************************************************************************
187 * 函数名称:I2C_Stop()
188 * 功 能:终止I2C总线
189 * 入口参数:无
190 * 出口参数:无
191 *********************************************************************************************/
192 void I2C_Stop(void){
193 1 SDA=0;
194 1 SCL=1;
195 1 I2C_Delay(I2C_DelayTime);
196 1 SDA=1;
197 1 I2C_Delay(I2C_DelayTime);
198 1 SCL=0;
199 1 I2C_Delay(I2C_DelayTime);
200 1 }
201 /********************************************************************************************
202 * 函数名称:I2C_Send_Bit_0()
203 * 功 能:发送比特0
204 * 入口参数:无
205 * 出口参数:无
206 *********************************************************************************************/
207 void I2C_Send_Bit_0(void){
208 1 SDA=0;
209 1 SCL=1;
210 1 I2C_Delay(I2C_DelayTime);
211 1 SCL=0;
212 1 I2C_Delay(I2C_DelayTime);
213 1 }
214 /********************************************************************************************
215 * 函数名称:I2C_Send_Bit_1()
216 * 功 能:发送比特1
217 * 入口参数:无
218 * 出口参数:无
219 *********************************************************************************************/
220 void I2C_Send_Bit_1(void){
221 1 SDA=1;
222 1 SCL=1;
223 1 I2C_Delay(I2C_DelayTime);
224 1 SCL=0;
225 1 I2C_Delay(I2C_DelayTime);
226 1 }
227 /********************************************************************************************
228 * 函数名称:I2C_Check_Ack()
229 * 功 能:发送完一个字节后检验设备的应答信号
230 * 入口参数:无
231 * 出口参数:返回值为True,成功
232 * 返回值为False,失败
233 *********************************************************************************************/
234 bit I2C_Check_Ack(void){
235 1 SDA=1;
236 1 SCL=1;
237 1 I2C_Delay(I2C_DelayTime/2);
238 1 F0=SDA;
239 1 I2C_Delay(I2C_DelayTime/2);
240 1 SCL=0;
241 1 I2C_Delay(I2C_DelayTime);
C51 COMPILER V6.12 2402TEST 08/29/2007 22:42:54 PAGE 5
242 1 if(F0==1) return FALSE;
243 1 return TRUE;
244 1 }
245 /********************************************************************************************
246 * 函数名称:I2C_Write8Bit()
247 * 功 能:向I2C总线写入8bit数据
248 * 入口参数:I2C_data 将要写入I2C总线的8bit数据
249 * 出口参数:无
250 *********************************************************************************************/
251 void I2C_Write8Bit(uint8 I2C_data)reentrant{
252 1 uint8 i;
253 1 for(i=0;i<8;i++){
254 2 if((I2C_data<<i)&0x80){
255 3 I2C_Send_Bit_1();
256 3 }
257 2 else{
258 3 I2C_Send_Bit_0();
259 3 }
260 2 }
261 1 }
262 /********************************************************************************************
263 * 函数名称:I2C_Read8Bit()
264 * 功 能:从I2C总线接收8bit数据
265 * 入口参数:无
266 * 出口参数:返回值为从I2C总线上接收到的8bit数据
267 *********************************************************************************************/
268 uint8 I2C_Read8Bit(void)reentrant{
269 1 uint8 I2C_data=0,i;
270 1 for(i=0;i<8;i++){
271 2 SDA=1;
272 2 SCL=1;
273 2 I2C_Delay(10);
274 2 F0=SDA;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -