📄 lcd12864.lst
字号:
C51 COMPILER V8.05a LCD12864 01/16/2009 09:13:17 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE LCD12864
OBJECT MODULE PLACED IN lcd12864.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE lcd12864.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //proteus仿真论坛:http://proteus.5d6d.com
2
3 #include <reg52.H>
4 #include<intrins.h>
5 #include<math.h>
6 #include"lcd12864.h"
7 #include"cncode.h"
8 #include"encode.h"
9
10
11 uchar xdata dispbuf[8][128];//1024Byte用于存放显示数据
12
13 void LcdInit() //lcd初始化
14 {
15 1 cs1 = 1;
16 1 cs2 = 1;
17 1 WriteCmd(DISP_OFF);
18 1 WriteCmd(DISP_Y);
19 1 WriteCmd(DISP_ON);
20 1 }
21
22 void WriteCmd(uchar cmd) //lcd写命令
23 {
24 1 WaiteBusy();
25 1 e=0;
26 1 rw = 0;
27 1 rs = 0;
28 1 DBPort = cmd;
29 1 e = 1;
30 1 _nop_();
31 1 _nop_();
32 1 e = 0;
33 1 }
34
35 void WriteData(uchar wdata) //lcd写数据
36 {
37 1 WaiteBusy();
38 1 rs = 1;
39 1 rw = 0;
40 1 DBPort = wdata;
41 1 e = 1;
42 1 _nop_();
43 1 _nop_();
44 1 e = 0;
45 1 }
46 /****************************************
47 函数功能:将显示缓冲区所有数据送到12864显示
48 ****************************************/
49 void Show()
50 {
51 1 uchar i,j;
52 1 LcdInit();
53 1 for(j=0;j<8;j++)
54 1 {
55 2 cs1=1;
C51 COMPILER V8.05a LCD12864 01/16/2009 09:13:17 PAGE 2
56 2 cs2=0;
57 2 WriteCmd(DISP_PAGE+j);
58 2 WriteCmd(DISP_X);
59 2 for(i=0;i<64;i++)
60 2 WriteData(dispbuf[j][i]);
61 2 cs1=0;
62 2 cs2=1;
63 2 WriteCmd(DISP_PAGE+j);
64 2 WriteCmd(DISP_X);
65 2 for(i=64;i<128;i++)
66 2 WriteData(dispbuf[j][i]);
67 2 }
68 1 }
69
70 void ClearBuff()//清空显存,0x00
71 {
72 1 uchar i,j;
73 1 for(j=0;j<8;j++)
74 1 {
75 2 for(i=0;i<128;i++)
76 2 dispbuf[j][i] = 0x00;
77 2 }
78 1 }
79 void ClearScreen() //清屏
80 {
81 1 ClearBuff();
82 1 Show();
83 1 }
84 /*********************************************
85 函数功能:drawflag = 1:在12864任意位置画点
86 drawflag = 0:在12864任意位置清除点
87
88 *********************************************/
89 void DrawPixel(uchar x,uchar y,bit drawflag)
90 {
91 1 uchar a,b;
92 1 a = y/0x08;
93 1 b = y&0x07;
94 1 if(drawflag)
95 1 dispbuf[a][x] |= BIT(b);
96 1 else
97 1 dispbuf[a][x] &= ~BIT(b);
98 1 }
99
100 /********************************************************************************
101 **函数功能描述:画直函数,采用非浮点型变量计算,显著提高了运算速度
102 **输 入:x0,y0,x1,y1:起始,结束点(坐标)
103
104 ***注意坐标不要越界***
105 x:0-127
106 y:0-63
107
108
109 **输 出:无
110 坐标如图所示
111 ----------------------------
112 |(0,0) (127,0)|
113 | |
114 | |
115 | |
116 | |
117 | |
C51 COMPILER V8.05a LCD12864 01/16/2009 09:13:17 PAGE 3
118 | |
119 |(0,63) (127,63)|
120 ----------------------------
121
122 *******************************************************************************/
123
124 void Line(uchar x0,uchar y0,uchar x1,uchar y1)
125 {
126 1
127 1 //使用Bresenham算法画直线
128 1 char dx,dy,x_increase,y_increase;
129 1 int error;
130 1 uchar x,y;
131 1 uchar i;
132 1 dx = x1-x0;
133 1 dy = y1-y0;
134 1 if(dx>=0)//判断x增长方向
135 1 x_increase = 1;
136 1 else
137 1 x_increase = -1;
138 1 if(dy>=0)//判断y增长方向
139 1 y_increase = 1;
140 1 else
141 1 y_increase = -1;
142 1
143 1 x = x0;
144 1 y = y0;
145 1 dx = cabs(dx);
146 1 dy = cabs(dy);
147 1 if(dx > dy)
148 1 {
149 2 error = -dx;
150 2 for(i=0;i<dx+1;i++)
151 2 {
152 3 DrawPixel(x,y,1);
153 3 x += x_increase;
154 3 error += 2*dy;
155 3 if(error >= 0)
156 3 {
157 4 y += y_increase;
158 4 error -= 2*dx;
159 4 }
160 3 }
161 2 }
162 1 else
163 1 {
164 2 error = -dy;
165 2 for(i=0;i<dy+1;i++)
166 2 {
167 3 DrawPixel(x,y,1);
168 3 y += y_increase;
169 3 error += 2*dx;
170 3 if(error >= 0)
171 3 {
172 4 x += x_increase;
173 4 error -= 2*dy;
174 4 }
175 3 }
176 2 }
177 1 }
178
179 /*****************************************************
C51 COMPILER V8.05a LCD12864 01/16/2009 09:13:17 PAGE 4
180 函数功能:指定的位置按传入的数据画一条长度为len(len=<8)点的竖线
181 *****************************************************/
182 void DrawVerticalLine(uchar x,uchar y,uchar len,uchar d)
183 {
184 1 uchar i;
185 1 for(i=0;i<len;i++)
186 1 {
187 2 if(d&0x01)
188 2 DrawPixel(x,y+i,1);
189 2 d >>= 1;
190 2 }
191 1 }
192
193
194
195 /*********************************************
196 函数功能:指定的位置显示一个12x12汉字
197 x:0~127-12
198 y:0~63-12
199 *********************************************/
200 void Print12_12CHN(uchar x,uchar y,bit cpl,struct typFNT_GB12 a)
201 {
202 1 uchar i;
203 1 for(i=0;i<12;i++)
204 1 {
205 2 if(cpl)
206 2 DrawVerticalLine(x+i,y,8,~a.Msk[i]);
207 2 else
208 2 DrawVerticalLine(x+i,y,8,a.Msk[i]);
209 2 }
210 1
211 1 for(i=0;i<12;i++)
212 1 {
213 2 if(cpl)
214 2 DrawVerticalLine(x+i,y+8,4,~a.Msk[i+12]);
215 2 else
216 2 DrawVerticalLine(x+i,y+8,4,a.Msk[i+12]);
217 2 }
218 1 }
219 /*********************************************
220 函数功能:指定的位置显示一个12x6ASCII
221 x:0~127-6
222 y:0~63-12
223 *********************************************/
224 void Print12_6En(uchar x,uchar y,bit cpl,uchar asc)
225 {
226 1 uchar i,j;
227 1 for(j=0;j<2;j++)
228 1 {
229 2 for(i=0;i<6;i++)
230 2 {
231 3 if(cpl)
232 3 DrawVerticalLine(x+i,y+8*j,8-4*j,~AsciiDot[(asc-0x20)*12+i+6*j]);
233 3 else
234 3 DrawVerticalLine(x+i,y+8*j,8-4*j,AsciiDot[(asc-0x20)*12+i+6*j]);
235 3 }
236 2 }
237 1 }
238
239 /********************************************************************************
240 **函数功能描述:送显示数据到显存,显示12x12文字(中,英,标点,数字)
241 **输 入:ptr字符串首地址
C51 COMPILER V8.05a LCD12864 01/16/2009 09:13:17 PAGE 5
242 **输 出:无
243 **说明:在显示字符串中遇到 "\n" 输出换行;反显两个"~"中间的包括的字符如:~反显~
244 *******************************************************************************/
245 void BufferPrint12(uchar x,uchar y,uchar *ptr)
246 {
247 1 uchar c1,c2,i,j;
248 1 bit cpl = 0;
249 1 for(i=0;ptr[i] != '\0';i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -