📄 51
字号:
C51 COMPILER V8.09 液晶显示 07/06/2010 20:28:54 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE 液晶显示
OBJECT MODULE PLACED IN 液晶显示.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 液晶显示.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #define uint unsigned int
4 #define uchar unsigned char
5 #define DATA P0 //LCD12864数据线
6 sbit RS=P2^7; // 数据\指令 选择
7 sbit RW=P2^6; // 读\写 选择
8 sbit EN=P2^5; // 读\写使能
9 sbit cs1=P2^2; // 片选1
10 sbit cs2=P2^1; // 片选2
11 /*
12 sbit CS1=P2^2;
13 sbit CS2=P2^1;
14 sbit RST=P2^0;
15 sbit DI=P2^7;
16 sbit RW=P2^6;
17 sbit ALE=P2^5;
18 */
19 /********************************/
20 /* 定义中文字库 */
21 /********************************/
22 uchar code Hzk[]={
23 /*-- 文字: 相 --*/
24 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
25 0x10,0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
26 0x08,0x04,0x03,0x00,0xFF,0x00,0x03,0x00,0xFF,0x42,0x42,0x42,0x42,0xFF,0x00,0x00,
27
28 /*-- 文字: 信 --*/
29 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
30 0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x04,0x00,
31 0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xF9,0x49,0x49,0x49,0x49,0x49,0xF9,0x00,0x00,
32
33 /*-- 文字: 自 --*/
34 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
35 0x00,0x00,0x00,0xF8,0x88,0x8C,0x8A,0x89,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,
36 0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,0x00,
37
38 /*-- 文字: 己 --*/
39 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
40 0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
41 0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00,
42
43 /*-- 文字: 超 --*/
44 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
45 0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x42,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00,
46 0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,0x4F,0x48,0x48,0x48,0x48,0x4F,0x40,0x00,
47
48 /*-- 文字: 越 --*/
49 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
50 0x40,0x48,0x48,0xFF,0x48,0x48,0x00,0xF8,0x08,0x08,0xFF,0x08,0x89,0x6A,0x00,0x00,
51 0x80,0x7E,0x10,0x3F,0x44,0x44,0x40,0x4F,0x44,0x50,0x49,0x46,0x49,0x5C,0x40,0x00,
52
53 /*-- 文字: 自 --*/
54 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
55 0x00,0x00,0x00,0xF8,0x88,0x8C,0x8A,0x89,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,
C51 COMPILER V8.09 液晶显示 07/06/2010 20:28:54 PAGE 2
56 0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,0x00,
57
58 /*-- 文字: 己 --*/
59 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
60 0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
61 0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00,
62 /*-- 文字: ☆ --*/
63 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
64 0x40,0xC0,0x40,0x40,0x40,0x60,0x1C,0x03,0x1C,0x60,0x40,0x40,0x40,0xC0,0x40,0x00,
65 0x00,0x00,0x41,0x39,0x26,0x10,0x10,0x08,0x08,0x10,0x26,0x39,0x41,0x00,0x00,0x00,
66 /*-- 文字: * --*/
67 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
68 0x00,0x00,0x40,0x40,0x80,0x80,0x00,0xFC,0x00,0x80,0x80,0x40,0x40,0x00,0x00,0x00,
69 0x00,0x00,0x00,0x10,0x08,0x04,0x03,0x01,0x03,0x04,0x08,0x10,0x00,0x00,0x00,0x00,
70 };
71 /*状态检查,LCD是否忙*/
72 void CheckState()
73 {uchar dat;//状态信息(判断是否忙)
74 1 RS=0; // 数据\指令选择,D/I(RS)=“L” ,表示 DB7∽DB0 为显示指令数据
75 1 RW=1; //R/W=“H” ,E=“H”数据被读到DB7∽DB0
76 1 do{DATA=0x00;
77 2 EN=1; //EN下降沿
78 2 dat=DATA;
79 2 EN=0;
80 2 dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
81 2 }while(!(dat==0x00));
82 1 }
83 /*写命令到LCD中*/
84 SendCommandToLCD(uchar com)
85 {CheckState();//状态检查,LCD是否忙
86 1 RS=0; //向LCD发送命令。RS=0写指令,RS=1写数据
87 1 RW=0;//R/W=“L” ,E=“H→L”数据被写到 IR 或 DR
88 1 DATA=com; //com :命令
89 1 EN=1;//EN下降沿
90 1 EN=0;
91 1 }
92 /*设置页 0xb8是页的首地址*/
93 void SetLine(uchar page)
94 {page=0xb8|page; //1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页
95 1 SendCommandToLCD(page);
96 1 }
97 /*设定显示开始行,0xc0是行的首地址*/
98 void SetStartLine(uchar startline)
99 {startline=0xc0|startline; //1100 0000
100 1 SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示
101 1 }
102 /*设定列地址--Y 0-63 ,0x40是列的首地址*/
103 void SetColumn(uchar column)
104 {column=column &0x3f; //column最大值为64,越出 0=<column<=63
105 1 column= 0x40|column; //01xx xxxx
106 1 SendCommandToLCD(column);
107 1 }
108 /*开关显示,0x3f是开显示,0x3e是关显示*/
109 void SetOnOff(uchar onoff)
110 {onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1
111 1 SendCommandToLCD(onoff);
112 1 }
113 /*写显示数据 */
114 void WriteByte(uchar dat)
115 {CheckState();//状态检查,LCD是否忙
116 1 RS=1; //RS=0写指令,RS=1写数据
117 1 RW=0;////R/W=“L” ,E=“H→L”数据被写到 IR 或 DR
C51 COMPILER V8.09 液晶显示 07/06/2010 20:28:54 PAGE 3
118 1 DATA=dat;//dat:显示数据
119 1 EN=1; //EN下降源
120 1 EN=0;
121 1 }
122 /*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/
123 void SelectScreen(uchar screen)
124 {switch(screen)
125 1 {case 0: cs1=1;//全屏
126 2 cs2=1;
127 2 break;
128 2 case 1: cs1=1;//左屏
129 2 cs2=0;
130 2 break;
131 2 case 2: cs1=0;//右屏
132 2 cs2=1;
133 2 break;
134 2 }
135 1 }
136 /*清屏screen: 0-全屏,1-左屏,2-右屏*/
137 void ClearScreen(uchar screen)
138 {uchar i,j;
139 1 SelectScreen(screen);
140 1 for(i=0;i<8;i++) //控制页数0-7,共8页
141 1 {SetLine(i);
142 2 SetColumn(0);
143 2 for(j=0;j<64;j++) //控制列数0-63,共64列
144 2 {WriteByte(0x00);} //写点内容,列地址自动加1
145 2 }
146 1 }
147 /*延时程序*/
148 void delay(uint z)
149 {uint i,j;
150 1 for(i=0; i<z; i++)
151 1 for(j = 0; j < 110; j++);
152 1 }
153 /*初始化LCD*/
154 void InitLCD()
155 {CheckState();
156 1 SelectScreen(0);
157 1 SetOnOff(0); //关显示
158 1 SelectScreen(0);
159 1 SetOnOff(1); //开显示
160 1 SelectScreen(0);
161 1 ClearScreen(0);//清屏
162 1 SetStartLine(0); //开始行:0
163 1 }
164 /*显示全角汉字*/
165 void Display(uchar ss,uchar page,uchar column,uchar number)
166 {int i; //选屏参数,page选页参数,column选列参数,number选第几汉字输出
167 1 SelectScreen(ss);
168 1 column=column&0x3f;
169 1 SetLine(page); //写上半页
170 1 SetColumn(column); //控制列
171 1 for(i=0;i<16;i++) //控制16列的数据输出
172 1 {WriteByte(Hzk[i+32*number]);} //i+32*number汉字的前16个数据输出
173 1 SetLine(page+1); //写下半页
174 1 SetColumn(column); //控制列
175 1 for(i=0;i<16;i++) //控制16列的数据输出
176 1 {WriteByte(Hzk[i+32*number+16]);}//i+32*number+16汉字的后16个数据输出
177 1 }
178 /*显示半角汉字和数字和字母
179 void Displayen(uchar ss,uchar page,uchar column,uchar number)
C51 COMPILER V8.09 液晶显示 07/06/2010 20:28:54 PAGE 4
180 {uint i;//选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
181 SelectScreen(ss);
182 column=column&0x3f;
183 SetLine(page); //写上半页
184 SetColumn(column);
185 for(i=0;i<8;i++)
186 {WriteByte(Ezk[i+16*number]);}
187 SetLine(page+1); //写下半页
188 SetColumn(column);
189 for(i=0;i<8;i++)
190 {WriteByte(Ezk[i+16*number+8]);}
191 }*/
192 /*主函数*/
193 void main()
194 {uint i,j,n=0;
195 1 InitLCD();//初始12864
196 1 while(1)
197 1 {for(i=0;i<2;i++)//显示边上的☆和*
198 2 {for(j=1;j<3;j++)
199 3 {Display(j,0,i*32+n*16,8);
200 4 Display(j,6,i*32+(!n)*16,8);
201 4 Display(j,0,i*32+(!n)*16,9);
202 4 Display(j,6,i*32+n*16,9);
203 4 }
204 3 }
205 2 Display(1,4-2*n,0,8);
206 2 Display(2,2+2*n,48,8);
207 2 Display(1,2+2*n,0,9);
208 2 Display(2,2+2*(!n),48,9);
209 2 //显示汉字
210 2 for(i=0;i<2;i++)
211 2 {Display(1,2,32+i*16,i);/*Display(选屏参数(cs1,cs2),pagr选页参数,column选列参数,number选第几汉字输出)
-*/
212 3 Display(1,4,32+i*16,i+4);
213 3 Display(2,2,0+i*16,i+2);
214 3 Display(2,4,0+i*16,i+6);
215 3 }
216 2 n=!n;
217 2 delay(255);
218 2 delay(255);
219 2 }
220 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 717 ----
CONSTANT SIZE = 320 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
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 + -