?? 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 + -