📄 340_lcd.lst
字号:
C51 COMPILER V7.05 340_LCD 10/23/2006 10:03:07 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE 340_LCD
OBJECT MODULE PLACED IN 340_lcd.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe 340_lcd.c DB OE
stmt level source
1 /******************************************************************************
2 由于LV595芯片片选引脚与以太网控制芯片CP2200中断引脚复用因些在此例程中加入了将
3 CP2200芯片中断关闭的代码。还要在建立工程文件时将CP220X_REG.C文件包含到工程中.
4 ******************************************************************************/
5
6
7 #include "C8051F340.h"
8 #include <intrins.h>
9 #include "cp220x_reg.h"
10
11 #define uchar unsigned char
12 #define uint unsigned int
13 #define BASE_ADDRESS 0x10
14 #define EMIF_TIMING 0x9E
15
16
17 //sbit spi_mosi=P0^0;
18 //sbit SPICLK=P0^1;
19 sbit LcdCs=P0^3;
20 sbit led=P2^4;
21 bit SPI_BUSY;
22
23
24 uchar xdata virt_port;
25 uchar xdata discode;//开关显示、光标、闪烁的命令字暂存单元
26 uint Count1ms;
27 signed char xdata tab1[16]={0x20,0x20,0x42,0x54,0x20,0x46,0x33,0x34,0x30,0x20,0x56,0x31,0x2e,0x30
28 ,0x20,0x20};
29 unsigned char xdata Netdata[16]={0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
30 0x6d,0x2e,0x63,0x6e,0x20,0x20};
31 void delay(uint timer);
32 void writelcd(uchar spi_data);
33 void writecode(uchar ins);
34 void writedata(uchar d);
35 void lcdinit();
36 void lcdchar (void);
37 void lcdaddr(uchar DDRAM);
38 void cursoropen(uchar position);//开光标,关闪烁
39 void displayopen(void); //开显示,光标、闪烁不变
40 void ether_reset_low();
41 void ether_reset_high (void);
42 void Delay1ms(uint T);
43 void EMIF_Init (void);
44
45 uint da;
46 void delay1us(void)
47 {
48 1 uchar xdata i;
49 1 for(i=10;i>0;i--);
50 1 }
51
52 void SPI_Init()
53 {
54 1 SPI0CFG = 0x70;
55 1 SPI0CN = 0x01;
C51 COMPILER V7.05 340_LCD 10/23/2006 10:03:07 PAGE 2
56 1 SPI0CKR = 0x3B;
57 1
58 1
59 1 }
60
61 void writelcd(uchar spi_data) //向LV595写数据以SPI方式
62 {
63 1
64 1 uint xdata i,j;
65 1 for(i=0;i<3;i++)
66 1 LcdCs=0;
67 1 SPI_BUSY=1;
68 1 delay1us();
69 1 SPI0DAT=spi_data;
70 1
71 1 for(j=0;j<500;j++)
72 1 {
73 2 if(!SPI_BUSY)break;
74 2 }
75 1 delay1us();
76 1 LcdCs=1;
77 1 delay1us();
78 1 delay1us();
79 1 delay1us();
80 1 delay1us();
81 1 delay1us();
82 1 delay1us();
83 1 delay1us();
84 1 for(j=0;j<5000;j++);
85 1
86 1 }
87
88 void writecode(uchar ins) //向液晶控制模块写命令
89 {
90 1 uchar xdata t;
91 1 uint xdata j;
92 1
93 1 for(j=0;j<500;j++);
94 1 virt_port|=ins&0xf0; //取高字节向1602写数据
95 1 writelcd(virt_port); //先写高4位后再写低4位 这是在选择四个数据线的时候
96 1
97 1 virt_port|=0x08;
98 1 writelcd(virt_port); //使能E脚为高电平
99 1 virt_port&=~0x08;
100 1 writelcd(virt_port); //使能E脚为低电平
101 1
102 1 t=ins<<4;
103 1 virt_port|=t&0xf0; //取低字节向1602写数据
104 1 writelcd(virt_port);
105 1 virt_port|=0x08; //使能E脚为高电平
106 1 writelcd(virt_port);
107 1 virt_port&=~0x08; //使能E脚为低电平
108 1 writelcd(virt_port);
109 1 virt_port=0;
110 1 writelcd(virt_port);
111 1 }
112
113 void writedata(uchar d) //写数据到1602
114 {
115 1 uchar xdata i,t;
116 1 uint xdata j;
117 1
C51 COMPILER V7.05 340_LCD 10/23/2006 10:03:07 PAGE 3
118 1 for(j=0;j<500;j++);
119 1 virt_port|=0x02; //光标返回指令
120 1 writelcd(virt_port);
121 1 virt_port|=d&0xf0; //取高字节数据给数据寄存器
122 1 writelcd(virt_port);
123 1 virt_port|=0x08; //使能E脚为高电平
124 1 writelcd(virt_port);
125 1 virt_port&=0xf7; //使能E脚为低电平
126 1 writelcd(virt_port);
127 1 virt_port&=0x07; //设置光标右移,文字也右移
128 1 writelcd(virt_port);
129 1
130 1 t=d&0x0f;
131 1 virt_port|=t<<4; //取低字节数据给数据寄存器
132 1 writelcd(virt_port);
133 1
134 1 virt_port|=0x08; //使能E脚为高电平
135 1 writelcd(virt_port);
136 1 for(i=3;i>0;i--);
137 1 virt_port&=0xf7; //使能E脚为低电平
138 1 writelcd(virt_port);
139 1 virt_port=0; //数据清零
140 1 writelcd(virt_port);
141 1 }
142 void lcdchar (void)
143 {
144 1 uint xdata i,j,k;
145 1 for(j=0;j<5000;j++); //数据读、写操作,画面不动
146 1 for(k=0;k<5000;k++);
147 1
148 1 for(i=0;i<16;i++){
149 2 writedata(tab1[i]);
150 2 for(j=0;j<1000;j++);
151 2 for(k=0;k<1000;k++);
152 2 for(k=0;k<5000;k++);
153 2 for(k=0;k<1000;k++);
154 2 }
155 1
156 1
157 1 writecode(0xb0); //换行指令
158 1 for(j=0;j<5000;j++);
159 1 for(k=0;k<5000;k++);
160 1 discode=0xb0;
161 1 for(i=0;i<16;i++){
162 2 writedata(Netdata[i]);
163 2 for(j=0;j<5000;j++);
164 2 for(k=0;k<5000;k++);
165 2 for(k=0;k<5000;k++);
166 2 };
167 1
168 1 }
169
170
171 void lcdinit()
172 {
173 1 uint xdata i;
174 1
175 1 virt_port=0x00;
176 1 writelcd(virt_port); //RS脚为零写指令寄存器 RW为低电平
177 1 virt_port|=0x08; //使能脚E=1
178 1 writelcd(virt_port);
179 1 virt_port&=0xf7; //使E=0使能脚发生跳变高--低
C51 COMPILER V7.05 340_LCD 10/23/2006 10:03:07 PAGE 4
180 1 writelcd(virt_port);
181 1 for(i=1000;i>0;i--); //3次延时,重要!
182 1 for(i=8000;i>0;i--); //用延时代替查询
183 1
184 1
185 1 virt_port=0; //写入20码,设置为4位总线方式,非常重要!!!!!
186 1 writelcd(virt_port);
187 1 virt_port|=0x20; //只写高字节
188 1 writelcd(virt_port);
189 1 virt_port|=0x08; //E=1
190 1 writelcd(virt_port);
191 1 for(i=20;i>0;i--); //使命令执行
192 1 virt_port&=0xf7; //E=0
193 1 writelcd(virt_port);
194 1 for(i=10;i>0;i--);
195 1 virt_port=0;
196 1 writelcd(virt_port);
197 1
198 1
199 1
200 1 writecode(0x38); //设两行显示,4线方式5*10字符显示
201 1 for(i=50;i>0;i--);
202 1 writecode(0x06); //光标右移
203 1 for(i=50;i>0;i--);
204 1
205 1
206 1 writecode(0x0c); //开显示指令
207 1 for(i=50;i>0;i--);
208 1
209 1
210 1 writecode(0x02); //光标返回指令
211 1 for(i=50;i>0;i--);
212 1
213 1
214 1
215 1 writecode(0x01); //清屏指令
216 1 for(i=50;i>0;i--);
217 1 }
218 void port_init()
219 {
220 1 P0MDOUT=0xff;
221 1 XBR0 = 0x02;
222 1 XBR1 = 0x40;
223 1 P1MDOUT |= 0xD8; // /WR and /RD are push-pull
224 1 P2MDOUT |= 0xFF;
225 1 P3MDOUT |= 0xFF;
226 1 P4MDOUT |= 0xFF;
227 1
228 1
229 1 }
230
231 void main(void)
232 {
233 1 uint j;
234 1 PCA0MD &= ~0x40; //关闭看门狗定时器
235 1 OSCICN |= 0x03; //内部高频振荡器12M晶振做为系统时钟
236 1 port_init(); //端口初始化
237 1 EMIF_Init ();
238 1 ether_reset_low();
239 1 for(j=0;j<5000;j++);
240 1 ether_reset_high ();
241 1 INT0EN = 0x00;
C51 COMPILER V7.05 340_LCD 10/23/2006 10:03:07 PAGE 5
242 1 INT1EN = 0x00;
243 1 SPI_Init();
244 1
245 1 IE = 0x40;
246 1 EA=1;
247 1
248 1
249 1 while(1)
250 1 {
251 2 lcdinit(); //液晶初始化
252 2 lcdchar();
253 2
254 2 }
255 1
256 1 }
257
258 void spi_isr(void) interrupt 6
259 {
260 1 if(SPIF)
261 1 {
262 2 SPIF=0;
263 2 SPI_BUSY=0;
264 2 }
265 1
266 1
267 1 if(WCOL)
268 1 {
269 2 WCOL=0;
270 2 }
271 1 }
272
273
274 void ether_reset_low()
275 {
276 1
277 1 P1 &= ~0x01; // Pull reset low
278 1
279 1 }
280 void ether_reset_high (void)
281 {
282 1
283 1 P1 |= 0x01; // Allow /RST to rise
284 1 while(!(P1 & 0x01)); // Wait for /RST to go high
285 1
286 1
287 1 }
288
289 void EMIF_Init (void)
290 {
291 1
292 1 EMI0CF = 0x1B; // non-muxed mode; split mode
293 1 // with bank select
294 1
295 1 EMI0TC = EMIF_TIMING; // This constant may be modified
296 1 // according to SYSCLK to meet the
297 1 // timing requirements for the CP2200
298 1
299 1 EMI0CN = BASE_ADDRESS; // Page of XRAM accessed by EMIF
300 1
301 1 }
C51 COMPILER V7.05 340_LCD 10/23/2006 10:03:07 PAGE 6
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1406 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 34 20
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -