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