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