📄 lcd12232.lst
字号:
C51 COMPILER V8.02 LCD12232 03/13/2009 19:43:48 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD12232
OBJECT MODULE PLACED IN lcd12232.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd12232.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*此例子是LCD12232,时钟和温度传感受的集合,有不明白的朋友,可以先看下前面的三个例子,再加已集合*/
2
3 #include <reg51.h>
4 #include <intrins.h>
5
6 #define MSB 0x80
7 #define LSB 0x01
8
9 sbit LCD_RS=P1^0;//定义引脚
10 sbit LCD_RW=P1^1;
11 sbit LCD_E=P1^2;
12 #define LCD_Data P2
13 #define Busy 0x80 //用于检测LCD状态字中的Busy标识
14
15 sbit SCL2=P1^3;
16 sbit SDA2=P1^4;
17 sbit RST = P1^5;// DS1302片选 5脚
18 sbit DS=P3^3; //定义DS18B20接口
19
20
21 void WriteDataLCD(unsigned char WDLCD);
22 void WriteCommandLCD(unsigned char WCLCD,BuysC);
23 unsigned char ReadDataLCD(void);
24 unsigned char ReadStatusLCD(void);
25 void LCDInit(void);
26 void LCDClear(void);
27 void LCDFlash(void);
28 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
29 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData);
30 void Delay5Ms(void);
31 void Delay400Ms(void);
32
33 void Write_Ds1302_byte(unsigned char temp);
34 void Write_Ds1302( unsigned char address,unsigned char dat );
35 unsigned char Read_Ds1302 ( unsigned char address );
36 void Read_RTC(void);//read RTC
37 void Set_RTC(void);//set RTC
38
39 int tmep(void);
40 void tmpchange(void);
41 void tmpwritebyte(unsigned char dat);
42 unsigned char tmpread(void);
43 bit tmpreadbit(void);
44 void dsreset(void);
45 void delayb(unsigned int count);
46
47 unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x1C,0x08,0x07,0x08,0};
48
49 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
50 code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
51
52 unsigned char lhj_f[15]={"2008年08月28日"};
53 unsigned char lhj_s[15]={"12:00 温度28℃"};
54
55 void main(void)
C51 COMPILER V8.02 LCD12232 03/13/2009 19:43:48 PAGE 2
56 {
57 1 unsigned char oldtimer=0,i=0;
58 1 int l_tmp=0;
59 1 Set_RTC();
60 1 Delay400Ms(); //启动等待,等LCD讲入工作状态
61 1 LCDInit(); //LCM初始化
62 1 Delay5Ms(); //延时片刻(可不要)
63 1 while(1){
64 2 Read_RTC();
65 2 if(oldtimer!=l_tmpdate[0]){//每一秒钟刷新显示
66 3 oldtimer=l_tmpdate[0];
67 3 lhj_f[2]=(l_tmpdate[6]/16)+0X30; //这里加上0X30是在ASCII字符编码中的地址,你们可以查下ASCII码
68 3 //这里除以16怎么不是除以10呢,是的,这是因为DS1302里面是按10进制存放的
69 3 lhj_f[3]=(l_tmpdate[6]&0x0f)+0X30;
70 3 lhj_f[6]=(l_tmpdate[4]/16)+0X30;
71 3 lhj_f[7]=(l_tmpdate[4]&0x0f)+0X30;
72 3 lhj_f[10]=(l_tmpdate[3]/16)+0X30;
73 3 lhj_f[11]=(l_tmpdate[3]&0x0f)+0X30;
74 3
75 3 lhj_s[0]=(l_tmpdate[2]/16)+0X30;
76 3 lhj_s[1]=(l_tmpdate[2]&0x0f)+0X30;
77 3 if(i==0){ //每一秒钟转换显示(空-两点)
78 4 lhj_s[2]=0X3A;
79 4 i=1;
80 4 }
81 3 else{
82 4 lhj_s[2]=0x20;
83 4 i=0;
84 4 }
85 3 lhj_s[3]=(l_tmpdate[1]/16)+0X30;
86 3 lhj_s[4]=(l_tmpdate[1]&0x0f)+0X30;
87 3
88 3 tmpchange(); //温度转换
89 3 l_tmp=tmep();
90 3 lhj_s[10]=l_tmp/100+0X30;
91 3 l_tmp=l_tmp%100;
92 3 lhj_s[11]=l_tmp/10+0X30;//温度显示我们去掉了小数位,有兴趣的朋友可以加入
93 3 DisplayListChar(0, 0, lhj_f);
94 3 DisplayListChar(0, 5, lhj_s);
95 3 }
96 2 //}
97 2 }
98 1 }
99
100 /*********************LCD12232显示处理函数****************************/
101 //写数据
102 void WriteDataLCD(unsigned char WDLCD)
103 {
104 1 ReadStatusLCD(); //检测忙
105 1 LCD_RS = 1;
106 1 LCD_RW = 0;
107 1 LCD_Data = WDLCD;
108 1 LCD_E = 1;
109 1 LCD_E = 1;
110 1 LCD_E = 1;
111 1 LCD_E = 0;
112 1 }
113
114 //写指令
115 void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
116 {
117 1 if (BuysC) ReadStatusLCD(); //根据需要检测忙
C51 COMPILER V8.02 LCD12232 03/13/2009 19:43:48 PAGE 3
118 1 LCD_RS = 0;
119 1 LCD_RW = 0;
120 1 LCD_Data = WCLCD;
121 1 LCD_E = 1;
122 1 LCD_E = 1;
123 1 LCD_E = 1;
124 1 LCD_E = 0;
125 1 }
126
127 //读数据
128 unsigned char ReadDataLCD(void)
129 {
130 1 LCD_RS = 1;
131 1 LCD_RW = 1;
132 1 LCD_E = 0;
133 1 LCD_E = 0;
134 1 LCD_E = 1;
135 1 return(LCD_Data);
136 1 }
137
138 //读状态
139 unsigned char ReadStatusLCD(void)
140 {
141 1 LCD_Data = 0xFF;
142 1 LCD_RS = 0;
143 1 LCD_RW = 1;
144 1 LCD_E = 1;
145 1 while (LCD_Data & Busy); //检测忙信号
146 1 LCD_E = 0;
147 1 return(LCD_Data);
148 1 }
149
150 void LCDInit(void) //LCM初始化
151 {
152 1 WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
153 1 WriteCommandLCD(0x01,1); //显示清屏
154 1 WriteCommandLCD(0x06,1); // 显示光标移动设置
155 1 WriteCommandLCD(0x0C,1); // 显示开及光标设置
156 1 }
157 void LCDClear(void) //清屏
158 {
159 1 WriteCommandLCD(0x01,1); //显示清屏
160 1 WriteCommandLCD(0x34,1); // 显示光标移动设置
161 1 WriteCommandLCD(0x30,1); // 显示开及光标设置
162 1 }
163 void LCDFlash(void) //闪烁效果
164 {
165 1 WriteCommandLCD(0x08,1); //显示清屏
166 1 Delay400Ms();
167 1 WriteCommandLCD(0x0c,1); // 显示开及光标设置
168 1 Delay400Ms();
169 1 WriteCommandLCD(0x08,1); //显示清屏
170 1 Delay400Ms();
171 1 WriteCommandLCD(0x0c,1); // 显示开及光标设置
172 1 Delay400Ms();
173 1 WriteCommandLCD(0x08,1); //显示清屏
174 1 Delay400Ms();
175 1 }
176 //按指定位置显示一个字符
177 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
178 {
179 1 Y &= 0x1;
C51 COMPILER V8.02 LCD12232 03/13/2009 19:43:48 PAGE 4
180 1 X &= 0xF; //限制X不能大于15,Y不能大于1
181 1 if (Y) X |= 0x10; //当要显示第二行时地址码+0x10;
182 1 X |= 0x80; // 算出指令码
183 1 WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
184 1 WriteDataLCD(DData);
185 1 }
186
187 //按指定位置显示一串字符
188 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
189 {
190 1 unsigned char ListLength,X2;
191 1 ListLength = 0;
192 1 X2=X;
193 1 Y &= 0x01;
194 1 X &= 0x0F; //限制X不能大于15,Y不能大于1
195 1 if (Y) X2 |= 0x10; //当要显示第二行时地址码+0x10;
196 1 X2 |= 0x80; // 算出指令码
197 1 WriteCommandLCD(X2, 1); //这里不检测忙信号,发送地址码
198 1 while (DData[ListLength]>=0x20) //若到达字串尾则退出
199 1 {
200 2 if (X <= 0x0F) //X坐标应小于0xF
201 2 {
202 3 WriteDataLCD(DData[ListLength]); //
203 3 ListLength++;
204 3 X++;
205 3 }
206 2 }
207 1 }
208
209 //5ms延时
210 void Delay5Ms(void)
211 {
212 1 unsigned int TempCyc = 5552;
213 1 while(TempCyc--);
214 1 }
215
216 //400ms延时
217 void Delay400Ms(void)
218 {
219 1 unsigned char TempCycA = 5;
220 1 unsigned int TempCycB;
221 1 while(TempCycA--)
222 1 {
223 2 TempCycB=7269;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -