📄 12.lst
字号:
C51 COMPILER V8.02 12 10/10/2008 16:05:55 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 12
OBJECT MODULE PLACED IN 12.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 12.c COMPACT BROWSE DEBUG OBJECTEXTEND CODE
line level source
1 /**********************************************
2 显示和键盘都已经正常,键盘采用的是中断方式
3
4 2008.7.2
5
6 **************************************/
7 #include <P89V51.h>
8 #include <absacc.h>
9 #include <intrins.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #define uchar unsigned char
13 //SYSTEM ADDRESS ALLOCATION ******************
14 #define KEYCOLUM XBYTE[0xEFFF]
15 #define KEYROW XBYTE[0xDFFF]
16 #define ALARM XBYTE[0xCFFF]
17 #define HC245C1 XBYTE[0xBFFF]
18 #define HC245C2 XBYTE[0xAFFF]
19 #define HC573C1 XBYTE[0x9FFF]
20 #define HC573C2 XBYTE[0x8FFF]
21 #define HC573C3 XBYTE[0x7FFF]
22 #define ADCS XBYTE[0x6FFF]
23 #define DACS XBYTE[0x5FFF]
24 #define DACLOAD XBYTE[0x4FFF]
25 //***************************************
26
27 //static unsigned char keyin=0;
28
29
30 /*-------------LCD1602 definitions and functions--------------*/
31 #define nops() {_nop_();_nop_();_nop_();}
32 typedef bit BOOL;
33
34 #define FALSE (bit)0
35 #define TRUE (bit)1
36
37 sbit lcd_cs = P2^0; //控制位
38 sbit lcd_rw = P2^1;
39 sbit lcd_rs = P2^2;
40 #define DataPort P0
41 #define DataDirPort P0
42 #define StatePort P0
43
44 #define Busy 0x80 // 忙判别位
45 uchar keystate,keyin=0;
46 char n=0,i,flag=0,c_2;
47 unsigned int a, ADs,ch;
48 char ADval[10];
49 //**************时间变量**********************
50 unsigned int tick=0,second=0,second_1=0,minute=0,b_out,c_0,c_1,mid,mid2,ch,ch_0=0,ch_no=0;
51
52 //*****************控制变量*********************
53 unsigned int step=0,t_1=0,t_2,t_3,t_no=0,co_2;
54
55 float co_1;
C51 COMPILER V8.02 12 10/10/2008 16:05:55 PAGE 2
56
57 void delay(long t)
58 {
59 1 while(t)
60 1 t--;
61 1 }
62
63 code unsigned char* WrtieLcdErr = "Display char outof range.";
64
65 // ------ Private function prototypes --------------------------
66 static BOOL WaitTillNotBusy();
67 static BOOL LocateXY(unsigned char posx, unsigned char posy);
68 static BOOL LcdWData(unsigned char dataW);
69 static BOOL LcdWCMD(unsigned char CMD);
70 BOOL LCDInit() ;
71 BOOL DisplayOneChar(unsigned char x ,unsigned char y ,unsigned char Wdata) ;
72 BOOL DisplayString(unsigned char posx, unsigned char posy, unsigned char* str);
73 unsigned char keyscan(void);
74 unsigned char Gatkey(char keystate);
75
76 BOOL WaitTillNotBusy()
77 {
78 1 unsigned int delay = 0xffff;
79 1
80 1 DataDirPort = 0xff;
81 1
82 1 lcd_cs = 1;
83 1 lcd_rs = 0;
84 1 lcd_rw = 1;
85 1 while( (StatePort & Busy) && delay)
86 1 delay--;
87 1 lcd_cs = 0;
88 1 if (!delay)
89 1 return FALSE ;
90 1
91 1 return TRUE;
92 1 }
93
94 BOOL LocateXY( unsigned char posx,unsigned char posy)
95 {
96 1 posy &= 0x01;
97 1 if (posy == 1)
98 1 posx |= 0x40;
99 1 posx |= 0x80;
100 1
101 1 return LcdWCMD(posx);
102 1 }
103
104
105 BOOL LcdWCMD(unsigned char CMD)
106 {
107 1 unsigned char i=1;
108 1
109 1 if (!WaitTillNotBusy()) // 检测忙信号?
110 1 return FALSE;
111 1
112 1 DataPort = CMD;
113 1 lcd_rs = 0;
114 1 lcd_rw = 0;
115 1 lcd_cs = 1;
116 1 while(i++);
117 1 lcd_cs = 0;
C51 COMPILER V8.02 12 10/10/2008 16:05:55 PAGE 3
118 1
119 1 return TRUE;
120 1 }
121
122
123 BOOL LcdWData( unsigned char dataW )
124 {
125 1
126 1 unsigned char i = 1;
127 1
128 1 if (!WaitTillNotBusy()) // 检测忙信号?
129 1 return FALSE;
130 1
131 1
132 1 DataPort = dataW;
133 1 lcd_rs = 1;
134 1 lcd_rw = 0;
135 1 lcd_cs = 1;
136 1 while(i++);
137 1 lcd_cs = 0;
138 1
139 1 return TRUE;
140 1 }
141
142 // LCD输出用函数
143 //LCDInit--LCD初始化
144 //DisplayOneChar(x,y,char) --在指定x,y显示一个字符
145 //DisplayString(x,y,str)--在指定位置x,y开始显示一个字符串
146
147 BOOL LCDInit()
148 {
149 1
150 1 // 显示模式设置,光标移动设置,显示开及光标设置,显示清屏
151 1 return (LcdWCMD( 0x38) && LcdWCMD( 0x06) && LcdWCMD( 0x0c) && LcdWCMD( 0x01));
152 1
153 1 }
154
155 BOOL DisplayOneChar(unsigned char x ,unsigned char y ,unsigned char Wdata)
156 {
157 1
158 1 if( (x >= 0 && x < 16) && (y >= 0 && y < 2) )
159 1 return (LocateXY( x, y ) && LcdWData( Wdata )) ;// 定位显示地址,写字符
160 1 else
161 1 return ( LCDInit() && DisplayString(0, 0, WrtieLcdErr)); //显示越界消息
162 1 }
163
164 BOOL DisplayString(unsigned char posx, unsigned char posy, unsigned char* str)
165 {
166 1 while ( (*str) != '\0' )
167 1 {
168 2 if (!DisplayOneChar(posx, posy, (*str)))
169 2 return FALSE;
170 2 str++;
171 2 posx++;
172 2 if( posx == 16 )
173 2 {
174 3 posx = 0;
175 3 posy++;
176 3
177 3 }
178 2 }
179 1
C51 COMPILER V8.02 12 10/10/2008 16:05:55 PAGE 4
180 1 return TRUE;
181 1 }
182 /*--------------End of LCD1602 macros and functions------------------*/
183
184 /*-------------- ----SPI protocols----------------------------------- */
185
186 void SpiInit(void)
187 {
188 1 SPCR = 0x51;
189 1 SPSR = 0x00;
190 1 }
191
192 void SpiClose(void) {SPCR = 0x00;}
193
194 /*----------------End of SPI protocols---------------------------*/
195
196 //-----------ADC MCP3208 functions--------------------
197 // ReadAD(chx)读AD,chx为通道号
198 //chx=0x00----0x07对应AD0---AD7通道
199 unsigned int ReadAD(unsigned char chx)
200 {
201 1
202 1 unsigned int lsb,msb;
203 1 char sbuf;
204 1 lsb=0;msb=0;
205 1
206 1 ADCS = 0x00;
207 1 sbuf = 0x06 | (chx>>2);
208 1 SPDAT = sbuf;
209 1 while(!(SPSR&0x80) );
210 1 SPSR = 0x00;
211 1 sbuf = SPDAT;
212 1
213 1 sbuf = (chx&0x03)<<6;
214 1 SPDAT = sbuf;
215 1 while(!(SPSR&0x80) );
216 1 SPSR = 0x00;
217 1 sbuf = SPDAT;
218 1 msb = sbuf&0x0F;
219 1
220 1 sbuf = 0x00;
221 1 SPDAT = sbuf;
222 1 while(!(SPSR&0x80) );
223 1 SPSR = 0x00;
224 1 lsb = SPDAT;
225 1
226 1 XBYTE[0xFFFF] = 0x00;
227 1
228 1 return msb*256+lsb;
229 1
230 1 }
231 //------------End ADC MCP3208 functions-----------------
232
233 //-----------------DAC MCP4922 functions----------------------
234 void DACout( unsigned char DACH, unsigned int DAValue)
235 {
236 1 unsigned char msb,lsb,temp;
237 1
238 1 XBYTE[0xFFFF] = 0;
239 1
240 1 DAValue&=0x0FFF;
241 1
C51 COMPILER V8.02 12 10/10/2008 16:05:55 PAGE 5
242 1 temp = (DAValue/256)&0x0F;
243 1
244 1 DACS = 0x00;
245 1
246 1 if(DACH==1)
247 1 {
248 2 msb =0x70|temp;
249 2 lsb = (unsigned char)(DAValue & 0xFF) ;
250 2 }
251 1 else if(DACH==2)
252 1 {
253 2 msb =0xF0|temp;
254 2 lsb = (unsigned char)(DAValue & 0xFF) ;
255 2 }
256 1 else
257 1 { }
258 1
259 1
260 1 SPDAT = msb;
261 1 while(!(SPSR&0x80) );
262 1 SPSR = 0x00;
263 1
264 1 SPDAT = lsb;
265 1 while(!(SPSR&0x80) );
266 1 SPSR = 0x00;
267 1
268 1 XBYTE[0xFFFF] = 0;
269 1 DACLOAD = 0x00;
270 1 nops();
271 1 XBYTE[0xFFFF] = 0;
272 1
273 1 }
274
275
276
277 //**********************按键中断响应**********************
278
279 void Int1_keyscan( ) interrupt 0
280 {
281 1 unsigned char ucSKey;
282 1 unsigned int uiI;
283 1 EA=0;
284 1 for (uiI=0;uiI<100;uiI++); //延时,去掉抖动
285 1 if(INT1==1)
286 1 goto end01;
287 1 for (uiI=0;uiI<100;uiI++); //延时,去掉抖动
288 1 if(INT1==1)
289 1 goto end01; //关闭外部中断
290 1 //LcdWCMD( 0x01) ; //显示清屏
291 1 keyscan(); //获取按键状态
292 1 Gatkey(keystate);
293 1 DisplayOneChar(0,1,keyin); //显示按键对应的字符
294 1
295 1
296 1 //delay(500);
297 1 while(P3_2==0){;}
298 1 delay(100);
299 1 while(P3_2==0){;}
300 1 end01:;
301 1 EA=1; // 开启中断
302 1 KEYROW=0x00;
303 1 }
C51 COMPILER V8.02 12 10/10/2008 16:05:55 PAGE 6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -