📄 lcddisplay.lst
字号:
C51 COMPILER V7.06 LCDDISPLAY 07/11/2009 15:39:00 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE LCDDISPLAY
OBJECT MODULE PLACED IN LcdDisplay.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE LcdDisplay.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /**********************************Copyright (c)**************************************************
2 ** 浙 江 师 范 大 学
3 **
4 **--------------文件信息---------------------------------------------------------------------------
5 功能:在LCD上显示汉字信息
6 作者:陈希
7 时间:2008-08-20
8 版本:V1.0
9 注:
10
11 **--------------当前版本修订-----------------------------------------------------------------------
12 ** 修改人:
13 ** 日 期:
14 ** 描 述:
15 **
16 **-------------------------------------------------------------------------------------------------
17 ***************************************************************************************************/
18
19 #include <c8051f020.h> // SFR declarations
20 #include <intrins.h>
21 #include <stdio.h>
22
23 #define uchar unsigned char
24 #define uint unsigned int
25 #define _Nop() _nop_()
26
27 #define LCM_Data P5
28 #define SYSCLK 22118400 // SYSCLK frequency in Hz
29
30 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
31
32 unsigned char code c8051info[] = "C8051F-Support";
33 unsigned char code supportinfo[] = "QQ:45248052";
34
35 //-----------------------------------------------------------------------------
36 // 液晶接口定义
37 //-----------------------------------------------------------------------------
38 #define LCDRSLow P6&=~0x80;
39 #define LCDRSHigh P6|=0x80; //DI
40
41 #define LCDRWLow P6&=~0x40;
42 #define LCDRWHigh P6|=0x40; //RW
43
44 #define LCDELow P6&=~0x20;
45 #define LCDEHigh P6|=0x20; //E
46
47 //--------------------------------------------------------------------
48 // 函数原型
49 //--------------------------------------------------------------------
50 void SYSCLK_Init (void);
51 void PORT_Init (void);
52
53 void WriteDataLCM(unsigned char WDLCM);
54 void WriteCommandLCM(unsigned char WCLCM,BuysC);
55 unsigned char ReadDataLCM(void);
C51 COMPILER V7.06 LCDDISPLAY 07/11/2009 15:39:00 PAGE 2
56 unsigned char ReadStatusLCM(void);
57 void LCMInit(void);
58 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
59 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
60 void DelayMs(uchar t);
61 void Delay(uint k);
62
63 //-----------------------------------------------------------------------------
64 // 延时
65 //-----------------------------------------------------------------------------
66 void DelayMs(uchar t)
67 {
68 1 uchar i,j;
69 1 uchar Y=11;
70 1 uchar X=200;
71 1 do
72 1 {
73 2 j=Y;
74 2 do
75 2 {
76 3 i=X;
77 3 do
78 3 {
79 4 _Nop();_Nop();//n个NOP
80 4 }while(--i);
81 3 }while(--j);
82 2 }while( --t );
83 1 }
84 //-----------------------------------------------------------------------------
85 // 延时
86 //-----------------------------------------------------------------------------
87 void Delay(uint k)
88 {
89 1 do
90 1 {
91 2
92 2 }while( --k );
93 1 }
94
95 //-----------------------------------------------------------------------------
96 //写数据
97 //-----------------------------------------------------------------------------
98
99 void WriteDataLCM(unsigned char WDLCM)
100 {
101 1 ReadStatusLCM(); //检测忙
102 1 LCM_Data = WDLCM;Delay(10);
103 1 LCDRSHigh;Delay(10);
104 1 LCDRWLow; Delay(10);
105 1 LCDELow; //若晶振速度太高可以在这后加小的延时
106 1 Delay(200);
107 1 LCDEHigh; Delay(10);
108 1 }
109 //-----------------------------------------------------------------------------
110 //写指令
111 //-----------------------------------------------------------------------------
112
113 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
114 {
115 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
116 1 LCM_Data = WCLCM;Delay(10);
117 1 LCDRSLow; Delay(10);
C51 COMPILER V7.06 LCDDISPLAY 07/11/2009 15:39:00 PAGE 3
118 1 LCDRWLow; Delay(10);
119 1 LCDELow;
120 1 Delay(200);
121 1 LCDEHigh; Delay(10);
122 1
123 1 }
124 //-----------------------------------------------------------------------------
125 //读数据
126 //-----------------------------------------------------------------------------
127
128 unsigned char ReadDataLCM(void)
129 {
130 1 LCDRSHigh; Delay(10);
131 1 LCDRWHigh; Delay(10);
132 1 LCDELow;
133 1 Delay(200);
134 1 LCDEHigh; Delay(10);
135 1 return(LCM_Data);
136 1 }
137 //-----------------------------------------------------------------------------
138 //读状态
139 //-----------------------------------------------------------------------------
140
141 unsigned char ReadStatusLCM(void)
142 {
143 1 LCM_Data = 0xFF;
144 1 LCDRSLow; Delay(10);
145 1 LCDRWHigh;Delay(10);
146 1 LCDELow;
147 1 Delay(200);
148 1 LCDEHigh; Delay(10);
149 1 while (LCM_Data & Busy); //检测忙信号
150 1 return(LCM_Data);
151 1 }
152 //-----------------------------------------------------------------------------
153 //LCM初始化
154 //-----------------------------------------------------------------------------
155 void LCMInit(void)
156 {
157 1 LCM_Data = 0;
158 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
159 1 DelayMs(10);
160 1 WriteCommandLCM(0x38,0);
161 1 DelayMs(10);
162 1 WriteCommandLCM(0x38,0);
163 1 DelayMs(10);
164 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
165 1 WriteCommandLCM(0x08,1); //关闭显示
166 1 WriteCommandLCM(0x01,1); //显示清屏
167 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
168 1 WriteCommandLCM(0x0C,1); // 显示开及光标设置
169 1 }
170 //-----------------------------------------------------------------------------
171 //按指定位置显示一个字符
172 //-----------------------------------------------------------------------------
173
174 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
175 {
176 1 Y &= 0x1;
177 1 X &= 0xF; //限制X不能大于15,Y不能大于1
178 1 if (Y) X |= 0x40; //当要显示第二行时地址码 0x40;
179 1 X |= 0x80; // 算出指令码
C51 COMPILER V7.06 LCDDISPLAY 07/11/2009 15:39:00 PAGE 4
180 1 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
181 1 WriteDataLCM(DData);
182 1 }
183 //-----------------------------------------------------------------------------
184 //按指定位置显示一串字符
185 //-----------------------------------------------------------------------------
186
187 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
188 {
189 1 unsigned char ListLength;
190 1 ListLength = 0;
191 1 Y &= 0x1;
192 1 X &= 0xF; //限制X不能大于15,Y不能大于1
193 1 while (DData[ListLength]>0x20) //若到达字串尾则退出
194 1 {
195 2 if (X <= 0xF) //X坐标应小于0xF
196 2 {
197 3 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
198 3 ListLength++;
199 3 X++;
200 3 }
201 2 }
202 1 }
203
204 //-----------------------------------------------------------------------------
205 // 通用I/O口及交叉开关初始化
206 //-----------------------------------------------------------------------------
207 void PORT_Init (void)
208 {
209 1
210 1 XBR2 = 0x40; // 交叉开关使能
211 1
212 1 }
213 //-----------------------------------------------------------------------------
214 // 系统时钟初始化
215 //-----------------------------------------------------------------------------
216
217 void SYSCLK_Init (void)
218 {
219 1 int i; // delay counter
220 1
221 1 OSCXCN = 0x67; // start external oscillator with
222 1 // 22.1184MHz crystal
223 1 for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
224 1
225 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
226 1
227 1 OSCICN = 0x88; // select external oscillator as SYSCLK
228 1 // source and enable missing clock
229 1 // detector
230 1 }
231 //-----------------------------------------------------------------------------
232 // 主程序
233 //-----------------------------------------------------------------------------
234
235 void main()
236 {
237 1
238 1 WDTCN = 0xde;
239 1 WDTCN = 0xad; //禁止看门狗定时器
240 1
241 1 SYSCLK_Init ();
C51 COMPILER V7.06 LCDDISPLAY 07/11/2009 15:39:00 PAGE 5
242 1 PORT_Init();
243 1
244 1 LCMInit(); //LCM初始化
245 1 DisplayListChar(1, 0, c8051info);
246 1 DisplayListChar(2, 1, supportinfo);
247 1
248 1
249 1
250 1 while(1);
251 1
252 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 405 ----
CONSTANT SIZE = 27 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -