📄 lcdc_040.lst
字号:
C51 COMPILER V8.02 LCDC_040 03/02/2007 17:13:27 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCDC_040
OBJECT MODULE PLACED IN lcdc_040.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcdc_040.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "C8051F040.h"
2 #define uchar unsigned char
3 #define uint unsigned int
4
5 uchar xdata virt_port;
6 bit SPI_BUSY;
7 unsigned char xdata tab1[16]={0x20,0x20,0x42,0x54,0x20,0x46,0x30,0x34,0x30,0x20,0x56,0x31,0x2e,0x30
8 ,0x20,0x20};
9 unsigned char xdata Netdata[16]={0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
10 0x6d,0x2e,0x63,0x6e,0x20,0x20};
11 sbit LcdCs=P2^5;
12 void os_init();
13 void port_init();
14 void spi_init();
15 void writecode(uchar ins);
16 void writedata(uchar d);
17 void lcdchar (void);
18 void lcdinit();
19 void writelcd(uchar spi_data);
20 void main()
21 {
22 1 WDTCN = 0xDE; // 关闭看门狗
23 1 WDTCN = 0xAD;
24 1 os_init();
25 1 port_init();
26 1 spi_init();
27 1 SFRPAGE = CONFIG_PAGE;
28 1 EIE1 = 0x01;
29 1 EA=1;
30 1 while(1)
31 1 {
32 2
33 2
34 2 lcdinit();
35 2 lcdchar();
36 2 }
37 1
38 1 }
39 void os_init()
40 {
41 1 int i = 0;
42 1 SFRPAGE = CONFIG_PAGE;
43 1 OSCXCN = 0x67; //外部22.1184M晶振
44 1 for (i = 0; i < 3000; i++); //等待外部晶振稳定
45 1 while ((OSCXCN & 0x80) == 0);
46 1 CLKSEL = 0x01; //系统时钟不分频
47 1 }
48 void port_init()
49 {
50 1 SFRPAGE = CONFIG_PAGE;
51 1 P0MDOUT=0xff;
52 1 XBR0 = 0x06;
53 1 XBR2 = 0x40;
54 1
55 1 }
C51 COMPILER V8.02 LCDC_040 03/02/2007 17:13:27 PAGE 2
56 void spi_init()
57 {
58 1 SFRPAGE = SPI0_PAGE;
59 1 SPI0CFG = 0x40;
60 1 SPI0CN = 0x01;
61 1 SPI0CKR = 0x6D;
62 1
63 1
64 1 }
65
66
67
68 void delay1us(void)
69 {
70 1 uchar xdata i;
71 1 for(i=10;i>0;i--);
72 1 }
73
74 void writelcd(uchar spi_data) //向LV595写数据以SPI方式
75 {
76 1 uint xdata i,j,k;
77 1 for(i=0;i<9;i++);
78 1 LcdCs=0;
79 1 delay1us();
80 1 SPI_BUSY=1;
81 1 SFRPAGE = SPI0_PAGE;
82 1 SPI0DAT=spi_data;
83 1 for(j=0;j<500;j++)
84 1 {
85 2 if(!SPI_BUSY)break;
86 2 }
87 1 delay1us();
88 1
89 1 LcdCs=1;
90 1 delay1us();
91 1 delay1us();
92 1 delay1us();
93 1 delay1us();
94 1 delay1us();
95 1 delay1us();
96 1 for(k=0;k<5000;k++);
97 1
98 1 /* **************************************************************************
99 1 // 以下这段代码,是用IO口模拟SPI传输的程序
100 1 LcdCs=0;
101 1 for(i=0;i<8;i++)
102 1 { SPICLK=0;
103 1 if(spi_data&0x80)
104 1 spi_mosi=1;
105 1 else
106 1 spi_mosi=0;
107 1 spi_data<<=1;
108 1 SPICLK=1;
109 1 for(j=0;j<10;j++)
110 1 {_nop_();}
111 1 SPICLK=0;
112 1 }
113 1 LcdCs=1;
114 1 /***************************************************************************/
115 1 }
116 void writecode(uchar ins) //向液晶控制模块写命令
117 {
C51 COMPILER V8.02 LCDC_040 03/02/2007 17:13:27 PAGE 3
118 1 uchar xdata t;
119 1 uint xdata j;
120 1
121 1 for(j=0;j<500;j++);
122 1 virt_port|=ins&0xf0; //取高字节向1602写数据
123 1 writelcd(virt_port); //先写高4位后再写低4位 这是在选择四个数据线的时候
124 1
125 1 virt_port|=0x08;
126 1 writelcd(virt_port); //使能E脚为高电平
127 1 virt_port&=~0x08;
128 1 writelcd(virt_port); //使能E脚为低电平
129 1
130 1 t=ins<<4;
131 1 virt_port|=t&0xf0; //取低字节向1602写数据
132 1 writelcd(virt_port);
133 1 virt_port|=0x08; //使能E脚为高电平
134 1 writelcd(virt_port);
135 1 virt_port&=~0x08; //使能E脚为低电平
136 1 writelcd(virt_port);
137 1 virt_port=0;
138 1 writelcd(virt_port);
139 1 }
140
141 void writedata(uchar d) //写数据到1602
142 {
143 1 uchar xdata i,t;
144 1 uint xdata j;
145 1
146 1 for(j=0;j<500;j++);
147 1 virt_port|=0x02; //光标返回指令
148 1 writelcd(virt_port);
149 1 virt_port|=d&0xf0; //取高字节数据给数据寄存器
150 1 writelcd(virt_port);
151 1 virt_port|=0x08; //使能E脚为高电平
152 1 writelcd(virt_port);
153 1 virt_port&=0xf7; //使能E脚为低电平
154 1 writelcd(virt_port);
155 1 virt_port&=0x07; //设置光标右移,文字也右移
156 1 writelcd(virt_port);
157 1
158 1 t=d&0x0f;
159 1 virt_port|=t<<4; //取低字节数据给数据寄存器
160 1 writelcd(virt_port);
161 1
162 1 virt_port|=0x08; //使能E脚为高电平
163 1 writelcd(virt_port);
164 1 for(i=3;i>0;i--);
165 1 virt_port&=0xf7; //使能E脚为低电平
166 1 writelcd(virt_port);
167 1 virt_port=0; //数据清零
168 1 writelcd(virt_port);
169 1 }
170
171 void lcdchar (void)
172 {
173 1 uint xdata i,j,k;
174 1 for(j=0;j<5000;j++); //数据读、写操作,画面不动
175 1 for(k=0;k<5000;k++);
176 1
177 1 for(i=0;i<16;i++)
178 1 {
179 2 writedata(tab1[i]);
C51 COMPILER V8.02 LCDC_040 03/02/2007 17:13:27 PAGE 4
180 2 for(j=0;j<1000;j++);
181 2 for(k=0;k<1000;k++);
182 2 for(k=0;k<5000;k++);
183 2 for(k=0;k<1000;k++);
184 2 for(k=0;k<5000;k++);
185 2 for(k=0;k<5000;k++);
186 2 for(k=0;k<5000;k++);
187 2
188 2 }
189 1
190 1
191 1 writecode(0xb0); // 换行
192 1 for(j=0;j<5000;j++);
193 1 for(k=0;k<5000;k++);
194 1
195 1 for(i=0;i<16;i++)
196 1 {
197 2 writedata(Netdata[i]);
198 2 for(j=0;j<5000;j++) delay1us();
199 2 for(k=0;k<5000;k++);
200 2 for(k=0;k<5000;k++);
201 2 for(k=0;k<5000;k++);
202 2 for(k=0;k<5000;k++);
203 2
204 2
205 2 };
206 1
207 1 }
208
209
210 void lcdinit()
211 {
212 1 uint xdata i;
213 1
214 1 virt_port=0x00;
215 1 writelcd(virt_port); //RS脚为零写指令寄存器 RW为低电平
216 1 virt_port|=0x08; //使能脚E=1
217 1 writelcd(virt_port);
218 1 virt_port&=0xf7; //使E=0使能脚发生跳变高--低
219 1 writelcd(virt_port);
220 1 for(i=1000;i>0;i--); //3次延时,重要!
221 1 for(i=8000;i>0;i--); //用延时代替查询
222 1
223 1
224 1 virt_port=0; //写入20码,设置为4位总线方式,非常重要!!!!!
225 1 writelcd(virt_port);
226 1 virt_port|=0x20; //只写高字节
227 1 writelcd(virt_port);
228 1 virt_port|=0x08; //E=1
229 1 writelcd(virt_port);
230 1 for(i=20;i>0;i--); //使命令执行
231 1 virt_port&=0xf7; //E=0
232 1 writelcd(virt_port);
233 1 for(i=10;i>0;i--);
234 1 virt_port=0;
235 1 writelcd(virt_port);
236 1
237 1
238 1
239 1 writecode(0x38); //设两行显示,4线方式5*10字符显示
240 1 for(i=50;i>0;i--);
241 1 writecode(0x06); //光标右移
C51 COMPILER V8.02 LCDC_040 03/02/2007 17:13:27 PAGE 5
242 1 for(i=50;i>0;i--);
243 1
244 1
245 1 writecode(0x0c); //开显示指令
246 1 for(i=50;i>0;i--);
247 1
248 1
249 1 writecode(0x02); //光标返回指令
250 1 for(i=50;i>0;i--);
251 1
252 1
253 1
254 1 writecode(0x01); //清屏指令
255 1 for(i=50;i>0;i--);
256 1 }
257
258 void spi_srs () interrupt 6
259 {
260 1 if(SPIF)
261 1 {
262 2 SFRPAGE = SPI0_PAGE;
263 2 SPIF=0;
264 2
265 2 SPI_BUSY=0;
266 2 }
267 1
268 1
269 1 if(WCOL)
270 1 {
271 2 SFRPAGE = SPI0_PAGE;
272 2 WCOL=0;
273 2 }
274 1
275 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1557 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 33 22
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -