📄 14-1.lst
字号:
C51 COMPILER V6.20c 14_1 09/02/2001 15:12:55 PAGE 1
C51 COMPILER V6.20c, COMPILATION OF MODULE 14_1
OBJECT MODULE PLACED IN 14-1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 14-1.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.H>
2 #include <absacc.H>
3 #include <stdio.h>
4
5 #define LCD_COMMAND 0x9000
6 #define LCD_DATA_R 0x9C00
7 #define LCD_DATA_W 0x9400
8 #define DA_ADDRESS 0xC000
9 #define AD_ADDRESS 0xA000
10 /*-------------------------LCD 驱动部分函数声明----------------------------*/
11 void DelayL();
12 void DelayS();
13 void WriteCommand(unsigned char c);
14 void WriteData(unsigned char c);
15 unsigned char ReadData();
16 void ShowChar(unsigned char pos,unsigned char c);
17 void ShowString(unsigned char line,char *ptr);
18 void InitLcd();
19 void InitInterupt();
20 /*----------------------------全局变量--------------------------------------*/
21 static unsigned char flag1; //启动功能标志
22 static unsigned char flag2; //功能号标志
23 static unsigned int address; //RAM地址
24 static unsigned char chip; //RAM片选
25 static unsigned char intflag; //中断标志
26 static unsigned int count; //串行数据计数
27
28 void main (void) {
29 1 char code str1[] =" Designed by HGR ";
30 1 char code str2[] =" 2002-8-26 ";
31 1 char code Menu[] =" Menu Item ";
32 1 char code Item[] ="1 Sample voice 2 Play sound 3 Download data 4 Upload data ";
33 1 char data str3[] =" ";
34 1 unsigned char i,j;
35 1
36 1 SP=0x50; //堆栈指针
37 1 DelayL();
38 1 InitLcd(); //初始化LCD
39 1 DelayL();
40 1 ShowString(0,str1); //显示启动屏幕
41 1 ShowString(1,str2);
42 1 DelayL();
43 1 DelayL();
44 1 DelayL();
45 1 DelayL();
46 1 for(i=0;i<17;i++) //字幕滚动
47 1 {
48 2 ShowString(0,str1+i);
49 2 ShowString(1,str2+i);
50 2 for(j=0;j<120;j++)
51 2 DelayS();
52 2 }
53 1 InitInterupt(); //初始化中断设置
54 1
55 1 flag1=0; //功能启动标志置0
C51 COMPILER V6.20c 14_1 09/02/2001 15:12:55 PAGE 2
56 1 flag2=0; //功能号置0
57 1 chip=0; //RAM片选置0
58 1 address=0; //RAM地址置0
59 1 intflag=0; //中断标志置0
60 1 count =0; //下载计数置0
61 1 P1=chip; //写RAM片选
62 1 enter:
63 1 if(flag1==0) //未启动任何功能
64 1 {
65 2 ShowString(0,Menu); //第一行显示Menu头
66 2 ShowString(1,Item+flag2*16); //第二行显示功能项
67 2 }
68 1 else //已经启动功能
69 1 {
70 2 ShowString(0,Item+flag2*16); //第一行显示功能项
71 2 switch(flag2) //第二行显示对应操作界面
72 2 {
73 3 case 0: //功能0,显示正在采样
74 3 sprintf(str3,"Now sampling.. ");
75 3 break;
76 3 case 1:
77 3 sprintf(str3,"Now playing.. "); //功能1,显示正在播放
78 3 break;
79 3 case 2: //功能2,显示下载计数
80 3 sprintf(str3,"down %d bytes ",count);
81 3 break;
82 3 case 3: //功能3,上传RAM数据
83 3 while(1)
84 3 {
85 4 SBUF=XBYTE[address++]; //读取RAM数据发送,地址自加
86 4 while(!TI);
87 4 TI=0;
88 4 count++;
89 4 if(address==0x8000) //到了RAM片内最大地址
90 4 {
91 5 address=0; //片内地址复0
92 5 chip=chip+1; //片选加1
93 5 P1=chip; //选通RAM
94 5 if(chip==32) //到达RAM最大容量
95 5 {
96 6 chip=0; //片选复0
97 6 flag1=0; //功能关闭
98 6 goto enter; //返回显示上级菜单
99 6 }
100 5 }
101 4 sprintf(str3,"up %d bytes ",count);
102 4 }
103 3 break;
104 3 default:
105 3 break;
106 3 }
107 2 ShowString(1,str3);
108 2 }
109 1 while(!intflag); //等待中断触发
110 1 intflag=0; //中断标志复0
111 1 goto enter; //返回修改菜单显示
112 1 }
113
114 /*-----------------------------中断处理-------------------------------------*/
115 Int0_process() interrupt 0 using 0 //外部中断0,对应1键
116 {
117 1 EA=0;
C51 COMPILER V6.20c 14_1 09/02/2001 15:12:55 PAGE 3
118 1 DelayL();
119 1
120 1 if(flag1==0) //若功能未启动,则功能号加1
121 1 {
122 2 flag2++;
123 2 flag2=flag2%4; //达到最大,则功能号复0
124 2 }
125 1 else //功能已启动则该键为关闭功能
126 1 {
127 2 flag1=0;
128 2 TR0=0; //关闭定时、复位RAM地址
129 2 chip=0;
130 2 address=0;
131 2 count=0;
132 2 }
133 1
134 1 EA=1;
135 1 intflag=1;
136 1 }
137
138 Int1_process() interrupt 2 using 0 //外部中断1,对应2键
139 {
140 1 char code blank[]=" ";
141 1 EA=0;
142 1 DelayL();
143 1
144 1 if(flag1==0) //若功能未启动,则2键启动该功能
145 1 {
146 2 flag1=1;
147 2 ShowString(1,blank);
148 2 if(flag2==0||flag2==1) //功能号为0、1,则开启定时
149 2 TR0=1;
150 2 }
151 1
152 1 EA=1;
153 1 intflag=1;
154 1 }
155
156 Timer0_process() interrupt 1 using 0 //定时中断,开启功能0、1时启动
157 {
158 1 unsigned char c;
159 1 EA=0;
160 1 TR0=0; //先关闭定时
161 1 TL0=0x80; //重新设置定时参数
162 1 TH0=0xFB;
163 1
164 1 if(flag2==0) //如果为功能0,则采样存入RAM
165 1 {
166 2 XBYTE[AD_ADDRESS]=0; //启动AD转换
167 2 while(P1&0x80); //等待转换完成
168 2 c=XBYTE[AD_ADDRESS]; //读取采样数据
169 2 XBYTE[address++]=c; //存入RAM
170 2 }
171 1 else //否则为播放声音
172 1 {
173 2 c=XBYTE[address++]; //读取RAM数据
174 2 XBYTE[DA_ADDRESS]=c; //写DA
175 2 }
176 1
177 1 if(address==0x8000) //RAM地址处理
178 1 {
179 2 address=0;
C51 COMPILER V6.20c 14_1 09/02/2001 15:12:55 PAGE 4
180 2 chip=chip+1;
181 2 P1=chip;
182 2 }
183 1 if(chip==32) //若到达RAM最大地址,则结束功能
184 1 {
185 2 chip=0;
186 2 flag1=0;
187 2 }
188 1 else //否则,重新开始定时
189 1 TR0=1;
190 1
191 1 EA=1;
192 1 intflag=1;
193 1 }
194
195 Rs232() interrupt 4 using 0 //串行接受中断
196 {
197 1 unsigned char c;
198 1 EA=0;
199 1 c=SBUF;
200 1 RI=0;
201 1
202 1 if(flag1==1) //若功能已经开启
203 1 {
204 2 if(flag2==2) //若功能号为2(下载)
205 2 {
206 3 XBYTE[address++]=c; //写入RAM
207 3 count++; //计数加1
208 3 }
209 2 if(address==0x8000) //RAM地址处理
210 2 {
211 3 chip=chip+1;
212 3 address=0;
213 3 P1=chip;
214 3 if(chip==32)
215 3 {
216 4 chip=0;
217 4 flag1=0;
218 4 }
219 3 }
220 2 }
221 1 EA=1;
222 1 intflag=1;
223 1 }
224
225 void InitInterupt()
226 {
227 1 TMOD=0x21; //初始化串口和定时器设置
228 1 TL1=0xFD;
229 1 TH1=0xFD;
230 1 EA=1;
231 1 ES=1;
232 1 PCON=0;
233 1 TR1=1;
234 1 SCON=0x50;
235 1
236 1 EX0=1; //外部中断0初始化
237 1 IT0=1;
238 1 EX1=1; //外部中断0初始化
239 1 IT1=1;
240 1
241 1 TL0=0x80; //定时125us
C51 COMPILER V6.20c 14_1 09/02/2001 15:12:55 PAGE 5
242 1 TH0=0xFB;
243 1
244 1 ET0=1;
245 1 }
246
247 /*--------------------------------LCD驱动部分----------------------------*/
248 void DelayL()
249 {unsigned char i,j;
250 1 i=0xA0;
251 1 j=0xFF;
252 1 while(i--)
253 1 while(j--);
254 1 }
255
256 void DelayS()
257 {unsigned char i;
258 1 i=0x1F;
259 1 while(i--);
260 1 }
261
262 void WriteCommand(unsigned char c)
263 {
264 1 DelayS();
265 1 XBYTE[LCD_COMMAND]=c;
266 1 }
267
268 void WriteData(unsigned char c)
269 {
270 1 DelayS();
271 1 XBYTE[LCD_DATA_W]=c;
272 1 }
273
274 void ShowChar(unsigned char pos,unsigned char c)
275 {
276 1 unsigned char p;
277 1 if(pos>=0x10)
278 1 p=pos+0xB0;
279 1 else
280 1 p=pos+0x80;
281 1 WriteCommand(p);
282 1 WriteData(c);
283 1 }
284
285 void ShowString(unsigned char line,char *ptr)
286 {
287 1 unsigned char l,i;
288 1 l=line<<4;
289 1 for(i=0;i<16;i++)
290 1 ShowChar(l++,*(ptr+i));
291 1 }
292
293 void InitLcd()
294 {
295 1 DelayL();
296 1 WriteCommand(0x38);
297 1 WriteCommand(0x38);
298 1 WriteCommand(0x06);
299 1 WriteCommand(0x0C);
300 1 WriteCommand(0x01);
301 1 WriteCommand(0x80);
302 1 }
303
C51 COMPILER V6.20c 14_1 09/02/2001 15:12:55 PAGE 6
304 unsigned char ReadData()
305 {
306 1 unsigned char i;
307 1 DelayS();
308 1 P0=0xFF;
309 1 i=XBYTE[LCD_DATA_R];
310 1 return i;
311 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 938 ----
CONSTANT SIZE = 250 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 24
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 + -