?? 340_ad.lst
字號:
C51 COMPILER V7.50 340_AD 10/23/2006 13:29:41 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 340_AD
OBJECT MODULE PLACED IN 340_ad.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 340_ad.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 例程說明,本程序是對電位器產生的電壓值進行采樣,可以在寄存器觀察AD的
3 也可以通過LCD將值顯示出來,由于LV595芯片片選引腳與以太網控制芯片CP2200
4 中斷引腳復用因些在此例程中加入了將CP2200芯片中斷關閉的代碼。還要在建立
5 工程文件時將CP220X_REG.C文件包含到工程中.
6 ********************************************************************/
7
8 #include "C8051F340.h"
9 #include "cp220x_reg.h"
10
11 #define uchar unsigned char
12 #define uint unsigned int
13 #define BASE_ADDRESS 0x10
14 #define EMIF_TIMING 0x9E
15
16 sfr16 TMR2RL = 0xca;
17 sfr16 TMR2 = 0xcc;
18 sbit LcdCs=P0^3;
19 sbit led=P2^4;
20 bit SPI_BUSY;
21
22
23 uchar xdata virt_port;
24 uchar xdata discode;//開關顯示、光標、閃爍的命令字暫存單元
25 uint Count1ms;
26 uint temp,ams,temp_l; // 存儲ADC的變量
27 uchar xdata tab1[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44
28 ,0x45,0x46};
29 void ADC0_Init(void); //ADC初始化
30 void Timer2_Init(void); //定時器初始化
31 void Delay(void); //延時程序
32 void PORT_Init(void); //端口初始化
33 void delay(uint timer);
34 void writelcd(uchar spi_data);
35 void writecode(uchar ins);
36 void writedata(uchar d);
37 void lcdinit();
38 void lcdchar (void);
39 void lcdaddr(uchar DDRAM);
40 void cursoropen(uchar position);//開光標,關閃爍
41 void displayopen(void); //開顯示,光標、閃爍不變
42 void ether_reset_low();
43 void ether_reset_high (void);
44 void Delay1ms(uint T);
45 void EMIF_Init (void);
46 void SPI_Init();
47 /*********************************************************************/
48 // 主程序
49 /*********************************************************************/
50 void main()
51 {
52 1 uint j;
53 1 PCA0MD &= ~0x40; //關閉看門狗
54 1 OSCICN |= 0x03; //使用內部12M晶振
55 1 ADC0_Init(); //ADC初始化
C51 COMPILER V7.50 340_AD 10/23/2006 13:29:41 PAGE 2
56 1 Timer2_Init(); //定時器初始化
57 1 PORT_Init(); //端口初始化
58 1 EMIF_Init ();
59 1 ether_reset_low();
60 1 for(j=0;j<5000;j++);
61 1 ether_reset_high ();
62 1 INT0EN = 0x00;
63 1 INT1EN = 0x00;
64 1 SPI_Init();
65 1 lcdinit();
66 1 IE = 0x40;
67 1 EA=1; //開中斷
68 1 while(1)
69 1 { lcdinit();
70 2 lcdchar();
71 2 } //取值此處加顯示
72 1
73 1 }
74 /*********************************************************************/
75 // 延時程序
76 /*********************************************************************
77 void Delay(void)
78 {
79 int x;
80 for(x = 0;x < 500;x)
81 x++;
82 }
83 /*********************************************************************/
84 // 定時器2中斷程序
85 /*********************************************************************/
86 void Timer2_ISR(void) interrupt 5
87 {
88 1
89 1 TF2H = 0; // 清除定時器2的中斷標志
90 1 }
91 /*********************************************************************/
92 // ADC初始化程序
93 /*********************************************************************/
94 void ADC0_Init(void)
95 {
96 1 REF0CN = 0x0F; //使用內部參考電壓VREF
97 1 AMX0P = 0x04; // P2.5為輸入端
98 1 AMX0N = 0x1F; // 單端輸入
99 1
100 1 ADC0CF = 0xFC; // 采樣值右對齊,如左對齊其值為FC
101 1
102 1 ADC0CN = 0xC2; //采用定時器2溢出后3個SAR時鐘開轉換
103 1 // 這時MCU功耗比較低
104 1
105 1 EIE1 |= 0x08; //使能ADC中斷
106 1 }
107
108 /*********************************************************************/
109 // ADC中斷程序
110 /*********************************************************************/
111 void ADC0_ConvComplete_ISR(void) interrupt 10
112 {
113 1 temp= ADC0H; //高字節
114 1 ams=ADC0L; //低字節
115 1 // temp_l=temp<<8+ams;
116 1 AD0INT = 0; //清中斷
117 1 }
C51 COMPILER V7.50 340_AD 10/23/2006 13:29:41 PAGE 3
118 /*********************************************************************/
119 // 端口初始化程序
120 /*********************************************************************/
121 void PORT_Init(void)
122 {
123 1 P2MDIN = 0xDF; // P2.5 為模擬輸入
124 1 P2SKIP = 0x20; // P2.5 跳過
125 1 XBR0 = 0x02;
126 1 XBR1 = 0x40; // 允許交叉開關
127 1 P0MDOUT =0xff;
128 1 P1MDOUT |= 0xD8; // /WR and /RD are push-pull
129 1 P3MDOUT |= 0xFF;
130 1 P4MDOUT |= 0xFF;
131 1 }
132
133 /*********************************************************************/
134 // 定時器2初始化程序
135 /*********************************************************************/
136 void Timer2_Init(void)
137 {
138 1 TMR2CN = 0x00; //清定時器2標志
139 1
140 1 CKCON &= ~0xF0; //選擇時基
141 1 TMR2RL = 0; // 重載值
142 1 TMR2 = 0xffff; //
143 1
144 1 ET2 = 1; // 使能定時器2 中斷
145 1 TR2 = 1; // 開啟定時器2
146 1 }
147
148 void delay1us(void)
149 {
150 1 uchar xdata i;
151 1 for(i=10;i>0;i--);
152 1 }
153
154 void SPI_Init()
155 {
156 1 SPI0CFG = 0x70;
157 1 SPI0CN = 0x01;
158 1 SPI0CKR = 0x3B;
159 1
160 1
161 1 }
162
163 void writelcd(uchar spi_data) //向LV595寫數據以SPI方式
164 {
165 1
166 1 uint xdata i,j;
167 1 for(i=0;i<3;i++)
168 1 LcdCs=0;
169 1 SPI_BUSY=1;
170 1 delay1us();
171 1 SPI0DAT=spi_data;
172 1
173 1 for(j=0;j<500;j++)
174 1 {
175 2 if(!SPI_BUSY)break;
176 2 }
177 1 delay1us();
178 1 LcdCs=1;
179 1 delay1us();
C51 COMPILER V7.50 340_AD 10/23/2006 13:29:41 PAGE 4
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -