📄 lcd12864.lst
字号:
C51 COMPILER V7.02a LCD12864 12/09/2008 21:38:29 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE LCD12864
OBJECT MODULE PLACED IN lcd12864.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE lcd12864.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <intrins.h>
3 //#include <at89x51.h>
4
5 sbit LCD_RS=P1^0;//定义引脚
6 sbit LCD_RW=P1^1;
7 sbit LCD_E=P1^2;
8 sbit PSB =P3^6; //PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
9 #define LCD_Data P2
10 #define Busy 0x80 //用于检测LCD状态字中的Busy标识
11
12
13
14 void WriteDataLCD(unsigned char WDLCD);
15 void WriteCommandLCD(unsigned char WCLCD,BuysC);
16 unsigned char ReadDataLCD(void);
17 unsigned char ReadStatusLCD(void);
18 void LCDInit(void);
19 void LCDClear(void);
20 void LCDFlash(void);
21 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
22 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
23 void Delay5Ms(void);
24 void Delay400Ms(void);
25
26 code unsigned char uctech[] = {"5 1 单片机实验板"};
27 code unsigned char net[] = {" www.lydz8.com "};
28 code unsigned char mcu[] = {"自学单片机的首选"};
29 code unsigned char qq[] = {" QQ: 52927029 "};
30
31 void main(void)
32 {
33 1 Delay400Ms(); //启动等待,等LCD讲入工作状态
34 1 LCDInit(); //LCM初始化
35 1 Delay5Ms(); //延时片刻(可不要)
36 1 while(1){
37 2 LCDClear();
38 2 DisplayListChar(0,1,uctech); //显示字库中的中文数字
39 2 DisplayListChar(0,2,net); //显示字库中的中文数字
40 2 DisplayListChar(0,3,mcu); //显示字库中的中文
41 2 DisplayListChar(0,4,qq); //显示字库中的中文数字
42 2 Delay400Ms();
43 2 Delay400Ms();
44 2 Delay400Ms();
45 2 Delay400Ms();
46 2 LCDFlash(); //闪烁效果
47 2 //}
48 2 }
49 1 }
50
51 //写数据
52 void WriteDataLCD(unsigned char WDLCD)
53 {
54 1 ReadStatusLCD(); //检测忙
55 1 LCD_RS = 1;
C51 COMPILER V7.02a LCD12864 12/09/2008 21:38:29 PAGE 2
56 1 LCD_RW = 0;
57 1 LCD_Data = WDLCD;
58 1 LCD_E = 1;
59 1 LCD_E = 1;
60 1 LCD_E = 1;
61 1 LCD_E = 0;
62 1 }
63
64 //写指令
65 void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
66 {
67 1 if (BuysC) ReadStatusLCD(); //根据需要检测忙
68 1 LCD_RS = 0;
69 1 LCD_RW = 0;
70 1 LCD_Data = WCLCD;
71 1 LCD_E = 1;
72 1 LCD_E = 1;
73 1 LCD_E = 1;
74 1 LCD_E = 0;
75 1 }
76
77 //读数据
78 unsigned char ReadDataLCD(void)
79 {
80 1 LCD_RS = 1;
81 1 LCD_RW = 1;
82 1 LCD_E = 0;
83 1 LCD_E = 0;
84 1 LCD_E = 1;
85 1 return(LCD_Data);
86 1 }
87
88 //读状态
89 unsigned char ReadStatusLCD(void)
90 {
91 1 LCD_Data = 0xFF;
92 1 LCD_RS = 0;
93 1 LCD_RW = 1;
94 1 LCD_E = 1;
95 1 while (LCD_Data & Busy); //检测忙信号
96 1 LCD_E = 0;
97 1 return(LCD_Data);
98 1 }
99
100 void LCDInit(void) //LCM初始化
101 {
102 1 WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
103 1 WriteCommandLCD(0x01,1); //显示清屏
104 1 WriteCommandLCD(0x06,1); // 显示光标移动设置
105 1 WriteCommandLCD(0x0C,1); // 显示开及光标设置
106 1 }
107 void LCDClear(void) //清屏
108 {
109 1 WriteCommandLCD(0x01,1); //显示清屏
110 1 WriteCommandLCD(0x34,1); // 显示光标移动设置
111 1 WriteCommandLCD(0x30,1); // 显示开及光标设置
112 1 }
113 void LCDFlash(void) //闪烁效果
114 {
115 1 WriteCommandLCD(0x08,1); //显示清屏
116 1 Delay400Ms();
117 1 WriteCommandLCD(0x0c,1); // 显示开及光标设置
C51 COMPILER V7.02a LCD12864 12/09/2008 21:38:29 PAGE 3
118 1 Delay400Ms();
119 1 WriteCommandLCD(0x08,1); //显示清屏
120 1 Delay400Ms();
121 1 WriteCommandLCD(0x0c,1); // 显示开及光标设置
122 1 Delay400Ms();
123 1 WriteCommandLCD(0x08,1); //显示清屏
124 1 Delay400Ms();
125 1 }
126 //按指定位置显示一个字符
127 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
128 {
129 1 if(Y<1)
130 1 Y=1;
131 1 if(Y>4)
132 1 Y=4;
133 1 X &= 0x0F; //限制X不能大于16,Y不能大于1
134 1 switch(Y){
135 2 case 1:X|=0X80;break;
136 2 case 2:X|=0X90;break;
137 2 case 3:X|=0X88;break;
138 2 case 4:X|=0X98;break;
139 2 }
140 1 WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
141 1 WriteDataLCD(DData);
142 1 }
143
144 //按指定位置显示一串字符
145 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
146 {
147 1 unsigned char ListLength,X2;
148 1 ListLength = 0;
149 1 X2=X;
150 1 if(Y<1)
151 1 Y=1;
152 1 if(Y>4)
153 1 Y=4;
154 1 X &= 0x0F; //限制X不能大于16,Y在1-4之内
155 1 switch(Y){
156 2 case 1:X2|=0X80;break; //根据行数来选择相应地址
157 2 case 2:X2|=0X90;break;
158 2 case 3:X2|=0X88;break;
159 2 case 4:X2|=0X98;break;
160 2 }
161 1 WriteCommandLCD(X2, 1); //发送地址码
162 1 while (DData[ListLength]>=0x20) //若到达字串尾则退出
163 1 {
164 2 if (X <= 0x0F) //X坐标应小于0xF
165 2 {
166 3 WriteDataLCD(DData[ListLength]); //
167 3 ListLength++;
168 3 X++;
169 3 Delay5Ms();
170 3 }
171 2 }
172 1 }
173
174 //5ms延时
175 void Delay5Ms(void)
176 {
177 1 unsigned int TempCyc = 5552;
178 1 while(TempCyc--);
179 1 }
C51 COMPILER V7.02a LCD12864 12/09/2008 21:38:29 PAGE 4
180
181 //400ms延时
182 void Delay400Ms(void)
183 {
184 1 unsigned char TempCycA = 5;
185 1 unsigned int TempCycB;
186 1 while(TempCycA--)
187 1 {
188 2 TempCycB=7269;
189 2 while(TempCycB--);
190 2 };
191 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 474 ----
CONSTANT SIZE = 68 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 7
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 + -