📄 lcd_040.lst
字号:
C51 COMPILER V7.50 LCD_040 10/08/2006 13:29:10 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LCD_040
OBJECT MODULE PLACED IN lcd_040.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd_040.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "C8051F040.h"
2 #include <intrins.h>
3
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 void writelcd(uchar spi_data);
8 void writecode(uchar ins);
9 void writedata(uchar d);
10 void lcdinit();
11 void lcdchar (void);
12 void Oscillator_Init();
13 void port_init();
14
15 sbit spi_mosi=P0^4;
16 sbit SPICLK=P0^2;
17 sbit LcdCs=P1^1;
18
19 uchar xdata virt_port;
20 uchar xdata discode;//开关显示、光标、闪烁的命令字暂存单元
21
22 signed char xdata tab1[16]={0x20,0x20,0x42,0x54,0x20,0x46,0x33,0x34,0x30,0x20,0x56,0x31,0x2e,0x30
23 ,0x20,0x20};
24 unsigned char xdata Netdata[16]={0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
25 0x6d,0x2e,0x63,0x6e,0x20,0x20};
26
27 /****************************************************************************
28 *
29 *主函数中执行显示
30 *****************************************************************************/
31 void main()
32 {
33 1 WDTCN = 0xDE; // 关看门狗定时器
34 1 WDTCN = 0xAD;
35 1 Oscillator_Init(); //时钟初始化
36 1 port_init(); //端口初始化
37 1 // lcdinit(); //液晶初始化
38 1
39 1 while(1)
40 1 {
41 2 // LcdCs=1;
42 2 // SPICLK=1;
43 2 // spi_mosi=1;
44 2 writelcd(0x03);
45 2 //lcdchar(); //显示字符
46 2 }
47 1 }
48 /*****************************************************************************
49 *
50 *初始化时钟选择外22.1184Mhz 晶振做
51 ******************************************************************************/
52 void Oscillator_Init()
53 {
54 1 int i = 0;
55 1 SFRPAGE = CONFIG_PAGE;
C51 COMPILER V7.50 LCD_040 10/08/2006 13:29:10 PAGE 2
56 1 OSCXCN = 0x67;
57 1 for (i = 0; i < 3000; i++); // 初始化时等待1毫秒
58 1 while ((OSCXCN & 0x80) == 0);
59 1 CLKSEL = 0x01;
60 1 }
61 /*****************************************************************************
62 *
63 *向LV595写数据以SPI方式
64 *****************************************************************************/
65 void writelcd(uchar spi_data)
66 {
67 1 uchar xdata i;
68 1
69 1 LcdCs=0;
70 1 for(i=0;i<8;i++)
71 1 {
72 2 SPICLK=0;
73 2 if(spi_data&0x80)
74 2 spi_mosi=1;
75 2 else
76 2 spi_mosi=0;
77 2 spi_data<<=1;
78 2 SPICLK=1;
79 2 SPICLK=0;
80 2 }
81 1 LcdCs=1;
82 1 }
83
84 /*****************************************************************************
85 *
86 * 向液晶控制模块写命令
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 *
114 * 写数据到1602控制模块
115 *******************************************************************************/
116 void writedata(uchar d)
117 {
C51 COMPILER V7.50 LCD_040 10/08/2006 13:29:10 PAGE 3
118 1 uchar xdata i,t;
119 1 uint xdata j;
120 1
121 1 for(j=0;j<500;j++);
122 1 virt_port|=0x02; //光标返回指令
123 1 writelcd(virt_port);
124 1 virt_port|=d&0xf0; //取高字节数据给数据寄存器
125 1 writelcd(virt_port);
126 1 virt_port|=0x08; //使能E脚为高电平
127 1 writelcd(virt_port);
128 1 virt_port&=0xf7; //使能E脚为低电平
129 1 writelcd(virt_port);
130 1 virt_port&=0x07; //设置光标右移,文字也右移
131 1 writelcd(virt_port);
132 1
133 1 t=d&0x0f;
134 1 virt_port|=t<<4; //取低字节数据给数据寄存器
135 1 writelcd(virt_port);
136 1
137 1 virt_port|=0x08; //使能E脚为高电平
138 1 writelcd(virt_port);
139 1 for(i=3;i>0;i--);
140 1 virt_port&=0xf7; //使能E脚为低电平
141 1 writelcd(virt_port);
142 1 virt_port=0; //数据清零
143 1 writelcd(virt_port);
144 1 }
145 /***************************************************************************
146 *
147 * 显示字符到液晶上
148 ****************************************************************************/
149 void lcdchar (void)
150 {
151 1 uint xdata i,j,k;
152 1 for(j=0;j<5000;j++); //数据读、写操作,画面不动
153 1 for(k=0;k<5000;k++);
154 1
155 1 for(i=0;i<16;i++){
156 2 writedata(tab1[i]);
157 2 for(j=0;j<1000;j++);
158 2 for(k=0;k<1000;k++);
159 2 for(k=0;k<5000;k++);
160 2 for(k=0;k<1000;k++);
161 2 }
162 1
163 1
164 1 writecode(0xb0); //
165 1 for(j=0;j<5000;j++);
166 1 for(k=0;k<5000;k++);
167 1 discode=0xb0;
168 1 for(i=0;i<16;i++){
169 2 writedata(Netdata[i]);
170 2 for(j=0;j<5000;j++);
171 2 for(k=0;k<5000;k++);
172 2 for(k=0;k<5000;k++);
173 2 };
174 1
175 1 }
176
177 /*******************************************************************************
178 *
179 *液晶初始化程序
C51 COMPILER V7.50 LCD_040 10/08/2006 13:29:10 PAGE 4
180 ********************************************************************************/
181 void lcdinit()
182 {
183 1 uint xdata i;
184 1
185 1 virt_port=0x00;
186 1 writelcd(virt_port); //RS脚为零写指令寄存器 RW为低电平
187 1 virt_port|=0x08; //使能脚E=1
188 1 writelcd(virt_port);
189 1 virt_port&=0xf7; //使E=0使能脚发生跳变高--低
190 1 writelcd(virt_port);
191 1 for(i=1000;i>0;i--); //3次延时,重要!
192 1 for(i=8000;i>0;i--); //用延时代替查询
193 1
194 1
195 1 virt_port=0; //写入20码,设置为4位总线方式,非常重要!!!!!
196 1 writelcd(virt_port);
197 1 virt_port|=0x20; //只写高字节
198 1 writelcd(virt_port);
199 1 virt_port|=0x08; //E=1
200 1 writelcd(virt_port);
201 1 for(i=20;i>0;i--); //使命令执行
202 1 virt_port&=0xf7; //E=0
203 1 writelcd(virt_port);
204 1 for(i=10;i>0;i--);
205 1 virt_port=0;
206 1 writelcd(virt_port);
207 1 writecode(0x38); //设两行显示,4线方式5*10字符显示
208 1 for(i=50;i>0;i--);
209 1 writecode(0x06); //光标右移
210 1 for(i=50;i>0;i--);
211 1
212 1
213 1 writecode(0x0c); //开显示指令
214 1 for(i=50;i>0;i--);
215 1
216 1
217 1 writecode(0x02); //光标返回指令
218 1 for(i=50;i>0;i--);
219 1
220 1
221 1
222 1 writecode(0x01); //清屏指令
223 1 for(i=50;i>0;i--);
224 1 }
225 /******************************************************************************
226 *
227 *引脚初始化
228 *******************************************************************************/
229 void port_init()
230 {
231 1 SFRPAGE = CONFIG_PAGE;
232 1 P1MDOUT = 0xff;
233 1 XBR2 = 0x40;
234 1
235 1 }
236
237
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1232 ----
C51 COMPILER V7.50 LCD_040 10/08/2006 13:29:10 PAGE 5
CONSTANT SIZE = ---- ----
XDATA SIZE = 34 16
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -