📄 lcd12864.lst
字号:
C51 COMPILER V8.02 LCD12864 03/12/2009 22:02:27 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD12864
OBJECT MODULE PLACED IN Lcd12864.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Lcd12864.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "Reg52.h"
2 #include "intrins.h"
3 #include "Lcd12864.h"
4 /*************
5 测试LCD是否处于忙状态
6 如果忙则返回0x80,否则返回0
7 **************/
8 unsigned char Lcd_CheckBusy(void)
9 {
10 1 unsigned char Busy;
11 1 LcdData=0xff;
12 1 RS=0;
13 1 RW=1;
14 1 E=1;
15 1 _nop_();
16 1 Busy=LcdData&0x80;
17 1 E=0;
18 1 return Busy;
19 1 }
20
21 /*********************************
22 向LCD写入字节数据
23 **********************************/
24 void Lcd_WriteData(unsigned char Data)
25 {
26 1 while(Lcd_CheckBusy());
27 1 RS=1;
28 1 RW=0;
29 1 E=0;
30 1 _nop_();
31 1 _nop_();
32 1 LcdData=Data;
33 1 E=1;
34 1 _nop_();
35 1 _nop_();
36 1 E=0;
37 1 }
38
39 /***********************************
40 从LCD中读出数据
41 ************************************/
42 unsigned char Lcd_ReadData(void)
43 {
44 1 unsigned char Temp;
45 1 while(Lcd_CheckBusy());
46 1 LcdData=0xff;
47 1 RS=1;
48 1 RW=1;
49 1 E=1;
50 1 _nop_();
51 1 Temp=LcdData;
52 1 E=0;
53 1 return Temp;
54 1 }
55
C51 COMPILER V8.02 LCD12864 03/12/2009 22:02:27 PAGE 2
56 /*************************************
57 想LCD中写入指令代码
58 **************************************/
59 void Lcd_WriteCmd(unsigned char CmdCode)
60 {
61 1 while(Lcd_CheckBusy());
62 1 RS=0;
63 1 RW=0;
64 1 E=0;
65 1 _nop_();
66 1 _nop_();
67 1 LcdData=CmdCode;
68 1 _nop_();
69 1 _nop_();
70 1 E=1;
71 1 _nop_();
72 1 _nop_();
73 1 E=0;
74 1 }
75
76 /*************************************
77 向LCD指定起始位置写入一个字符串
78 *************************************/
79 void Lcd_WriteStr(unsigned char x,unsigned char y,unsigned char *Str)
80 {
81 1 if((y>3)||(x>7))
82 1 return;//如果指定位置不在显示区域内,则不做任何写入直接返回
83 1 EA=0;
84 1 switch(y)
85 1 {
86 2 case 0:
87 2 Lcd_WriteCmd(0x80+x);
88 2 break;
89 2 case 1:
90 2 Lcd_WriteCmd(0x90+x);
91 2 break;
92 2 case 2:
93 2 Lcd_WriteCmd(0x88+x);
94 2 break;
95 2 case 3:
96 2 Lcd_WriteCmd(0x98+x);
97 2 break;
98 2 }
99 1 while(*Str>0)
100 1 {
101 2 Lcd_WriteData(*Str);
102 2 Str++;
103 2 }
104 1 EA=1;
105 1 }
106
107 /**************************************
108 为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法
109 ***************************************/
110 code unsigned int MaskTab[]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
111 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};
112 /***************************************
113 向LCD指定坐标写入一个象素,象素颜色有两种,0代表白(无显示),1代表黑(有显示)
114 ****************************************/
115 void Lcd_PutPixel(unsigned char x,unsigned char y,unsigned char Color)
116 {
117 1 unsigned char z,w;
C51 COMPILER V8.02 LCD12864 03/12/2009 22:02:27 PAGE 3
118 1 unsigned int Temp;
119 1 if(x>=128||y>=64)
120 1 return;
121 1 Color=Color%2;
122 1 w=15-x%16;//确定对这个字的第多少位进行操作
123 1 x=x/16;//确定为一行上的第几字
124 1
125 1 if(y<32) //如果为上页
126 1 z=0x80;
127 1 else //否则如果为下页
128 1 z=0x88;
129 1
130 1 y=y%32;
131 1 EA=0;
132 1 Lcd_WriteCmd(0x36);
133 1 Lcd_WriteCmd(y+0x80); //行地址
134 1 Lcd_WriteCmd(x+z); //列地址
135 1 Temp=Lcd_ReadData();//先空读一次
136 1 Temp=(unsigned int)Lcd_ReadData()<<8;//再读出高8位
137 1 Temp|=(unsigned int)Lcd_ReadData();//再读出低8位
138 1 EA=1;
139 1 if(Color==1) //如果写入颜色为1
140 1 Temp|=MaskTab[w];//在此处查表实现加速
141 1 else //如果写入颜色为0
142 1 Temp&=~MaskTab[w];//在此处查表实现加速
143 1 EA=0;
144 1 Lcd_WriteCmd(y+0x80); //行地址
145 1 Lcd_WriteCmd(x+z); //列地址
146 1 Lcd_WriteData(Temp>>8);//先写入高8位,再写入低8位
147 1 Lcd_WriteData(Temp&0x00ff);
148 1 Lcd_WriteCmd(0x30);
149 1 EA=1;
150 1 }
151
152 /******************************************
153 从LCD指定坐标读取象素颜色值
154 *******************************************/
155 unsigned char Lcd_ReadPixel(unsigned char x,unsigned char y)
156 {
157 1 unsigned char z,w;
158 1 unsigned int Temp;
159 1 x=x%128;
160 1 y=y%64;
161 1 w=15-x%16;//确定对这个字的第多少位进行操作
162 1 x=x/16;//确定为一行上的第几字
163 1
164 1 if(y<32) //如果为上页
165 1 z=0x80;
166 1 else //否则如果为下页
167 1 z=0x88;
168 1
169 1 y=y%32;
170 1 Lcd_WriteCmd(0x36);
171 1 Lcd_WriteCmd(y+0x80); //行地址
172 1 Lcd_WriteCmd(x+z); //列地址
173 1 Temp=Lcd_ReadData();//先空读一次
174 1 Temp=(unsigned int)Lcd_ReadData()<<8;//再读出高8位
175 1 Temp|=(unsigned int)Lcd_ReadData();//再读出低8位
176 1
177 1 if((Temp&&MaskTab[w])==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -