📄 ad7492_keil.lst
字号:
C51 COMPILER V7.08 AD7492_KEIL 03/21/2008 14:18:07 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE AD7492_KEIL
OBJECT MODULE PLACED IN AD7492_keil.OBJ
COMPILER INVOKED BY: E:\Program Files\keil2\C51\BIN\C51.EXE AD7492_keil.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <intrins.h>
3 /*函数定义*/
4 #define uchar unsigned char
5 #define uint unsigned int
6 void long_delay(void); //长延时
7 void short_delay(void); //短延时
8 void delay10ms(unsigned char); //延时10ms
9 void write7279(unsigned char, unsigned char); //写入HD7279
10 void display7279(uchar X); //显示AD转换值到数码管上
11 unsigned char read7279(unsigned char); //读HD7279
12 void send_byte(unsigned char); //发送一个字节
13 unsigned char receive_byte(void); //接收一个字节
14 /*变量及I/O口定义*/
15 unsigned char digit[8];
16 unsigned int tmr,key_num;
17 unsigned char trans_byte,j,k;
18 sbit cs=P1^0; //cs连接P1.0
19 sbit clk=P1^1; //clk连接P1.1
20 sbit dat=P1^2; //dat连接P1.2
21 sbit key=P1^3; //key连接P1.3
22
23 sbit convst=P1^4; //convst连接P1.4
24 sbit rd=P1^5; //rd连接P1.5
25
26 sbit error=P0^4; //识别错误指示位
27
28 /****** HD7279A指令定义 ******/
29 #define CMD_RESET 0xa4 //复位指令
30 #define CMD_TEST 0xbf //测试指令
31 #define DECODE0 0x80 //方式0译码指令
32 #define DECODE1 0xc8 //方式1译码指令
33 #define CMD_READ 0x15 //读键盘指令
34 #define UNDECODE 0x90 //不译码指令
35 #define RTL_CYCLE 0xa3 //循环左移指令
36 #define RTR_CYCLE 0xa2 //循环右移指令
37 #define RTL_UNCYL 0xa1 //左移指令
38 #define RTR_UNCYL 0xa0 //右移指令
39 #define ACTCTL 0x98 //消隐控制指令
40 #define SEGON 0xe0 //段点亮指令
41 #define SEGOFF 0xc0 //段关闭指令
42 #define BLINKCTL 0x88 //闪烁控制指令
43
44 /********************* 长短延时程序 **********************/
45 void long_delay(void)
46 {
47 1 unsigned char i;
48 1 for (i=0;i<0x30;i++);
49 1 {}
50 1 }
51
52 void short_delay(void)
53 {
54 1 unsigned char i;
55 1 for (i=0;i<8;i++);
C51 COMPILER V7.08 AD7492_KEIL 03/21/2008 14:18:07 PAGE 2
56 1 {}
57 1 }
58 /********************* 延时子程序delay **********************/
59 void delay(uchar ms)
60 { // 延时子程序
61 1 uchar i;
62 1 while(ms--)
63 1 {
64 2 for(i = 0; i< 250; i++)
65 2 {
66 3 _nop_();
67 3 _nop_();
68 3 _nop_();
69 3 _nop_();
70 3
71 3 }
72 2 }
73 1 }
74 /********************* 延时n*10ms **********************/
75 void delay10ms(unsigned char time)
76 {
77 1 unsigned char i;
78 1 unsigned int j;
79 1 for (i=0;i<time;i++)
80 1 {
81 2 for(j=0;j<0x390;j++)
82 2 {
83 3 }
84 2 }
85 1 }
86 /********************* 写7279程序 **********************/
87 void write7279(unsigned char cmd, unsigned char dta)
88 {
89 1 send_byte (cmd);
90 1 send_byte (dta);
91 1 }
92 /********************* 读7279程序 **********************/
93 unsigned char read7279(unsigned char command)
94 {
95 1 send_byte(command);
96 1 return(receive_byte());
97 1 }
98 /********************* 发送字节程序 **********************/
99 void send_byte( unsigned char out_byte)
100 {
101 1 unsigned char i;
102 1 cs=0;
103 1 long_delay();
104 1 for (i=0;i<8;i++)
105 1 {
106 2 if (out_byte&0x80)
107 2 {
108 3 dat=1;
109 3 }
110 2 else
111 2 {
112 3 dat=0;
113 3 }
114 2 clk=1;
115 2 short_delay();
116 2 clk=0;
117 2 short_delay();
C51 COMPILER V7.08 AD7492_KEIL 03/21/2008 14:18:07 PAGE 3
118 2 out_byte=out_byte*2;
119 2 }
120 1 dat=0;
121 1 }
122 /*********************接收字节程序 **********************/
123 unsigned char receive_byte(void)
124 {
125 1 unsigned char i, in_byte;
126 1 dat=1; //设为输入状态
127 1 long_delay();
128 1 for (i=0;i<8;i++)
129 1 {
130 2 clk=1;
131 2 short_delay();
132 2 in_byte=in_byte*2;
133 2 if (dat)
134 2 {
135 3 in_byte=in_byte|0x01;
136 3 }
137 2 clk=0;
138 2 short_delay();
139 2 }
140 1 dat=0;
141 1 return (in_byte);
142 1 }
143 /********************* 键盘识别程序 **********************/
144 uint getch(void)
145 { uchar X,Y,Z,k;
146 1 P3=0xff;
147 1 P3=0x0f; //先对P3置数 行扫描
148 1 if(P3!=0x0f) //判断是否有键按下
149 1 {delay(10); //延时,软件去干扰
150 2 if(P3!=0x0f) //确认按键按下X = P3;
151 2 {
152 3 X=P3; //保存行扫描时有键按下时状态
153 3 P3=0xf0; //列扫描
154 3 Y=P3; //保存列扫描时有键按下时状态
155 3 Z=X|Y; //取出键值
156 3
157 3 switch ( Z ) //判断键值(那一个键按下)
158 3 {
159 4 case 0xee: k=4; break; //对键值赋值
160 4 case 0xde: k=3; break;
161 4 case 0xbe: k=2; break;
162 4 case 0x7e: k=1; break;
163 4 case 0xed: k=8; break;
164 4 case 0xdd: k=7; break;
165 4 case 0xbd: k=6; break;
166 4 case 0x7d: k=5; break;
167 4 case 0xeb: k=11; break;
168 4 case 0xdb: k=10; break;
169 4 case 0xbb: k=0;break;
170 4 case 0x7b: k=9;break;
171 4 case 0xe7: k=15;break;
172 4 case 0xd7: k=14;break;
173 4 case 0xb7: k=13;break;
174 4 case 0x77: k=12;break;
175 4 default : k=16;break;
176 4 }
177 3 }
178 2 }
179 1 return k;
C51 COMPILER V7.08 AD7492_KEIL 03/21/2008 14:18:07 PAGE 4
180 1 }
181 /********************* 键值判断程序for AD7492**********************/
182 void identify(uint key)
183 { uchar X;
184 1 uchar count_in,count;
185 1 switch(key)
186 1 {case 1:
187 2 case 2:
188 2 case 3:
189 2 case 4: error=0;
190 2 convst=1; //启动转换
191 2 short_delay();
192 2 rd=0;
193 2 short_delay();
194 2 convst=0;
195 2 short_delay();
196 2 convst=1;
197 2 X=P2;
198 2 X=P2;
199 2 X=P2;
200 2 X=P2;
201 2 X=P2;
202 2 display7279(X);
203 2 break;
204 2 case 5:
205 2 case 6:
206 2 case 7:
207 2 case 8: error=0;
208 2 for(count=0;count<0x200;count++)
209 2 for(count_in=0;count_in<0x200;count_in++)
210 2 {convst=1; //启动转换
211 3 short_delay();
212 3 rd=0;
213 3 short_delay();
214 3 convst=0;
215 3 short_delay();
216 3 convst=1;
217 3 X=P2;
218 3 X=P2;
219 3 X=P2;
220 3 X=P2;
221 3 X=P2;
222 3 display7279(X);}
223 2 break;
224 2 default:
225 2 error=1;
226 2 send_byte(CMD_RESET); //清除显示
227 2 /*************************************************
228 2 下载数据但不译码指令测试程序
229 2 *************************************************/
230 2 write7279(UNDECODE+7,0x49); //在第8位按不译码方式显示一字符'三'
231 2 delay10ms(80);
232 2 /*************************************************
233 2 循环左右移测试'三'字向右移动23次,再向左移动23次
234 2 *************************************************/
235 2 for (j=0;j<23;j++)
236 2 {
237 3 send_byte(RTR_CYCLE); //循环右移23次
238 3 delay10ms(12);
239 3 }
240 2 for (j=0;j<23;j++)
241 2 {
C51 COMPILER V7.08 AD7492_KEIL 03/21/2008 14:18:07 PAGE 5
242 3 send_byte(RTL_CYCLE); //循环左移23次
243 3 delay10ms(12);
244 3 }
245 2 }
246 1
247 1 }
248 /*********************7279显示转换值函数**********************/
249 void display7279(uchar X)
250 { uchar j;
251 1
252 1 for(j=0;j<8;j++)
253 1 {
254 2 digit[j]=((X>>j)&0x01);
255 2 write7279(DECODE0+j,digit[j]);
256 2 }
257 1 }
258
259 /*主程序*/
260 main()
261 {
262 1 error=1; //初始状态等待按键,指示灯灭
263 1 for (tmr=0;tmr<0x2000;tmr++); //上电延时
264 1 send_byte(CMD_RESET); //复位HD7279A
265 1 /**********************************************
266 1 闪烁指令指令
267 1 **********************************************/
268 1 send_byte(CMD_TEST); //测试指令
269 1 for (j=0;j<3;j++) //延时约3
270 1 {
271 2 delay10ms(100);
272 2 }
273 1 send_byte(CMD_RESET); //清除显示
274 1 while (1)
275 1 {
276 2 key_num=getch(); //取得键值,如果键仍旧没有按下,就把键值设为16
277 2 delay10ms(10);
278 2 identify(key_num); //如果键值不是1,2,3,4中一个,此时指示灯应该亮起;否则指示灯灭
279 2 delay10ms(10);
280 2 }
281 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 642 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 15 7
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 + -