lcmdrv.lst
来自「51单片机在lcd上实现zlg gui,希望好的请多加点分数」· LST 代码 · 共 489 行 · 第 1/2 页
LST
489 行
C51 COMPILER V7.50 LCMDRV 09/11/2007 21:56:41 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LCMDRV
OBJECT MODULE PLACED IN .\OBJ\lcmdrv.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcmdrv.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\LST\lcmdrv.lst) OBJECT(.\O
-BJ\lcmdrv.obj)
line level source
1 /****************************************************************************
2 * 文件名:LCMDRV.C
3 * 功能:MG12864图形液晶模块驱动程序。使用LPC2131的GPIO口控制操作。
4 * 用于ZLG/GUI用户图形界面。
5 * 液晶模块与LPC2131的连接如下所示:
6 * D0 (7) -- P0.4
7 * . -- .
8 * . -- .
9 * . -- .
10 * D7 (14) -- P0.11
11 *
12 * CS1 -- P0.12
13 * CS2 -- P0.13
14 *
15 * RST -- P0.14
16 * D/I -- P0.15
17 * R/W -- GND
18 * E -- P0.16
19 *
20 * R/W为0进行写操作,为1时进行读操作;
21 * D/I为1表示数据传送, 为0表示命令传送;
22 * E读写脉冲;
23 * CS1和CS2为左右半屏选择,高电平选中;
24 * RST为复位控制,低电平复位。
25 *
26 * 作者:黄绍斌
27 * 日期:2005/3/7
28 ****************************************************************************/
29 #include "config.h"
30 #define LCM_BUS P1
31 #define LCM_DI P3_0
32 #define LCM_RW P3_1
33 #define LCM_E P3_2
34 #define LCM_CS1 P3_4
35 #define LCM_CS2 P3_3
36 #define LCM_RST P3_5
37 //================================================================
38 // KS0108指令代码定义
39 //================================================================
40 //#define Set_Disp_On 0x3F
41 //#define Set_Disp_Off 0x3E
42 //#define Set_Column 0x40
43 //#define Set_Page 0xB8
44 //#define Set_Start_Line 0xC0
45
46
47
48
49 /* 定义显示缓冲区 */
50 TCOLOR gui_disp_buf[GUI_LCM_YMAX/8][GUI_LCM_XMAX];
51
52
53 /* 定义总线起始的GPIO,即D0对应的GPIO值(P0.4) */
54 #define BUS_NO 4
C51 COMPILER V7.50 LCMDRV 09/11/2007 21:56:41 PAGE 2
55
56 /* 输出总线数据宏定义 */
57 #define OutData(dat) LCM_BUS= dat
58
59
60 /* 定义CS1控制 */
61 #define SCS1() LCM_CS1=1
62 #define CCS1() LCM_CS1=0
63
64 /* 定义CS2控制 */
65 #define SCS2() LCM_CS2=1
66 #define CCS2() LCM_CS2=0
67
68 /* 定义RST控制 */
69
70 #define SRST() LCM_RST=1
71 #define CRST() LCM_RST=0
72
73
74 /* 定义DI控制 */
75 #define SDI() LCM_DI=1
76 #define CDI() LCM_DI=0
77
78
79 /* 定义E控制 */
80
81 #define SE() LCM_E=1
82 #define CE() LCM_E=0
83
84 /*定义RW控制*/
85 #define SRW() LCM_RW=1;
86 #define CRW() LCM_RW=0;
87 /* 定义LCM操作的命令字 */
88 #define LCM_DISPON 0x3F /* 打开LCM显示 */
89 #define LCM_DISPOFF 0x3E /* 关闭LCM显示 */
90 #define LCM_STARTROW 0xc0 /* 显示起始行0,可以用LCM_STARTROW+x设置起始行。(x<64) */
91 #define LCM_ADDRSTRX 0xb8 /* 页起始地址,可以用LCM_ADDRSTRX+x设置当前页(即X)。(x<8) */
92 #define LCM_ADDRSTRY 0x40 /* 列起始地址,可以用LCM_ADDRSTRY+x设置当前列(即Y)。(x<64) */
93
94
95 /*********************************************************************************
96 * 名称:DELAY5()
97 * 功能:软件延时函数。用于LCM显示输出时序控制。
98 * 入口参数:无
99 * 出口参数:无
100 **********************************************************************************/
101 void DELAY5(void)
102 { int i;
103 1
104 1 for(i=0; i<10; i++);
105 1 }
106
107
108 /***********************************************************************
109 * 名称:LCM_WrCommand()
110 * 功能:写命令子程序
111 * 入口参数:command 要写入LCM的命令字
112 * 注:数据口为P0口(作IO口)
113 ***********************************************************************/
114 void LCM_WrCommand(uint8 command)
115 {
116 1 CE(); // 先将E置为低
C51 COMPILER V7.50 LCMDRV 09/11/2007 21:56:41 PAGE 3
117 1 CDI(); // DI=0,表示发送命令
118 1 CRW();
119 1
120 1 OutData(command);
121 1 // DELAY5();
122 1 SE();
123 1 // DELAY5();
124 1 CE();
125 1 // DELAY5();
126 1
127 1 }
128
129
130 /***********************************************************************
131 * 名称:LCM_WrData()
132 * 功能:写数据子程序
133 * 入口参数:wrdata 要写入LCM的数据
134 ***********************************************************************/
135 void LCM_WrData(uint8 wrdata)
136 {
137 1 CE(); // 先将E置为低
138 1 SDI(); // DI=1,表示发送数据
139 1 CRW();
140 1 OutData(wrdata);
141 1 //DELAY5();
142 1 SE();
143 1 //DELAY5();
144 1 CE();
145 1 //DELAY5();
146 1
147 1 }
148
149
150 /***********************************************************************
151 * 名称:LCM_WriteByte()
152 * 功能:向指定点写数据(一字节)。
153 * 入口参数:x x坐标值(0-127)
154 * y y坐标值(0-63)
155 * wrdata 所要写的数据
156 * 说明:会重新设置CS1/CS2,及其内部指针
157 ***********************************************************************/
158 void LCM_WriteByte(uint8 x, uint8 y, uint8 wrdata)
159 { x = x&0x7f; // 参数过滤
160 1 y = y&0x3f;
161 1
162 1 CCS1();
163 1 CCS2();
164 1
165 1 //更新显示缓冲区
166 1 y = y>>3;
167 1 gui_disp_buf[y][x] = wrdata;
168 1
169 1 // 更新LCD显示
170 1 if(x<64) // 选择液晶控制芯片(即CS1--控制前64个点,CS2--控制后64个点)
171 1 { SCS1();
172 2 }
173 1 else
174 1 { SCS2();
175 2 x = x-64;
176 2 }
177 1 LCM_WrCommand(LCM_ADDRSTRY+x); // 设置当前列地址,即x坐标
178 1 LCM_WrCommand(LCM_ADDRSTRX+y); // 设置当前页地址,即y坐标
C51 COMPILER V7.50 LCMDRV 09/11/2007 21:56:41 PAGE 4
179 1
180 1 LCM_WrData(wrdata);
181 1 }
182
183
184 /***********************************************************************
185 * 名称:LCM_ReadByte()
186 * 功能:读取指定点上的数据。
187 * 入口参数:x x坐标值(0-127)
188 * y y坐标值(0-63)
189 * 出口参数:返回该点上的字节数据。
190 ***********************************************************************/
191 uint8 LCM_ReadByte(uint8 x, uint8 y)
192 { x = x&0x7f; // 参数过滤
193 1 y = y&0x3f;
194 1
195 1 y = y>>3;
196 1 return(gui_disp_buf[y][x]);
197 1 }
198
199
200
201 /////////////////////////////////////////////////////////////////////////
202
203
204 /***********************************************************************
205 * 名称:LCM_DispFill()
206 * 功能:向显示缓冲区填充数据
207 * 入口参数:filldata 要写入LCM的填充数据
208 * 注:此函数会设置显示起始行为0,且会自动选中CS1有效
209 ***********************************************************************/
210 void LCM_DispFill(uint8 filldata)
211 { uint8 x,y;
212 1
213 1 SCS1(); // 选中两个控制芯片
214 1 CCS2();
215 1
216 1 LCM_WrCommand(LCM_STARTROW); // 设置显示起始行为0
217 1
218 1 for(x=0; x<8; x++)
219 1 { LCM_WrCommand(LCM_ADDRSTRX+x); // 设置页地址,即X
220 2 LCM_WrCommand(LCM_ADDRSTRY); // 设置列地址,即Y
221 2 for(y=0; y<64; y++)
222 2 { LCM_WrData(filldata);
223 3 }
224 2 }
225 1
226 1 SCS2();
227 1 CCS1();
228 1 LCM_WrCommand(LCM_STARTROW); // 设置显示起始行为0
229 1
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?