📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 06/10/2007 21:20:07 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN C:\WAVE6000\BIN\WWY_BYSJ\MAIN.OBJ
COMPILER INVOKED BY: C:\C51\BIN\C51.EXE C:\WAVE6000\BIN\WWY_BYSJ\MAIN.C DB SB OE
stmt level source
1 #include<reg52.h>
2
3 unsigned code ledmod[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
4 0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x00,0x00}; //显示段代码
5 unsigned code ledsel[4]={0xfe,0xfd,0xfb,0xf7}; //显示位选代码
6 unsigned char data led[4];//显示缓冲,用于主程序和定时中断显示数据传递
7
8 sbit key_set = P3^4;//设定键
9 sbit key_clr = P3^5;//清除键(退出键)
10 sbit key_add = P3^6;//加数键
11 sbit key_mov = P3^7;//移位键
12
13 /****************************************************************************
14 * 函数原型: void function wait_5ms(void);
15 * 功 能: 提供5ms延时(时钟频率为12MHz)。
16 ****************************************************************************/
17 void wait_5ms( void ) {
18 1 register int i ;
19 1 for ( i=0 ; i<2000 ; i++ )
20 1 ;
21 1
22 1 }
23 /***********************************************************************/
24 void delay( unsigned int ki )
25 {for(;ki>0;ki--)
26 1 {wait_5ms();}
27 1 }
28
29 /***************************************************/
30 //键盘扫描程序,
31 //返回键值,无键按下返回0
32 //******************************************************/
33 char key(void)
34 {
35 1 //*********扫描set键****************************
36 1 key_set=1;wait_5ms();//把按键口线置高设为输入,延时等待稳定
37 1 if(key_set==0)//初判断
38 1 {
39 2 key_set=1;wait_5ms();
40 2 if(key_set==0);//再次确定按下
41 2 {
42 3 while(key_set==0)key_set=1;//等待按键释放
43 3 }
44 2 return 1; //返回键值
45 2 }
46 1 //*********扫描clr键****************************
47 1 key_clr=1;wait_5ms();//把按键口线置高设为输入,延时等待稳定
48 1 if(key_clr==0)//初判断
49 1 {
50 2 key_clr=1;wait_5ms();
51 2 if(key_clr==0);//再次确定按下
52 2 {
53 3 while(key_clr==0)key_clr=1;//等待按键释放
54 3 }
55 2 return 2;//返回键值
C51 COMPILER V7.06 MAIN 06/10/2007 21:20:07 PAGE 2
56 2 }
57 1 //*********扫描add键**********************
58 1 key_add=1;wait_5ms();//把按键口线置高设为输入,延时等待稳定
59 1 if(key_clr==0)//初判断
60 1 {
61 2 key_add=1;wait_5ms();
62 2 if(key_add==0);//再次确定按下
63 2 {
64 3 while(key_add==0)key_add=1;//等待按键释放
65 3 }
66 2 return 3; //返回键值
67 2 }
68 1 //*********扫描clr键******************************
69 1 key_mov=1;wait_5ms();//把按键口线置高设为输入,延时等待稳定
70 1 if(key_mov==0)//初判断
71 1 {
72 2 key_mov=1;wait_5ms();
73 2 if(key_mov==0); //再次确定按下
74 2 {
75 3 while(key_mov==0)key_mov=1;//等待按键释放
76 3 }
77 2 return 4;//返回键值
78 2 }
79 1
80 1 return 0;//无键按下返回0
81 1
82 1 }
83
84 // ******************************
85 //把dat拆成BCD码送显示缓冲
86 void set_disp(unsigned int dat)
87 {
88 1 if(dat<9999)
89 1 {
90 2 led[3]=dat/1000;dat=dat%1000;
91 2 led[2]=dat/100;dat=dat%100;
92 2 led[1]=dat/10;led[0]=dat%10;
93 2 }
94 1 }
95 //*****************************
96 //设定琐相环输出频率
97 void setF(unsigned int dat)
98 {
99 1 //使用 MOV @R0,A使PLL的分频器的分频系数高低8位数据同时输出
100 1 //最大限度降低频率设定切换过程中的影响
101 1 //参数传递时,dat的高8位在R6,低8位在R7
102 1 #pragma ASM
*** ERROR C272 IN LINE 102 OF C:\WAVE6000\BIN\WWY_BYSJ\MAIN.C: 'asm/endasm' requires src-control to be active
103 1 MOV A,R7
104 1 MOV R0,A
105 1 MOV A,R6
106 1 MOV @R0,A
107 1 #pragma endasm
*** ERROR C272 IN LINE 107 OF C:\WAVE6000\BIN\WWY_BYSJ\MAIN.C: 'asm/endasm' requires src-control to be active
108 1 }
109
110 /*================================== */
111
112
113 void main(void)
114 {
115 1 unsigned char i=0,counter,set_S=255;
C51 COMPILER V7.06 MAIN 06/10/2007 21:20:07 PAGE 3
116 1 unsigned int temp,tempf=500;
117 1 unsigned char data ledbuf[4];//显示缓冲备份
118 1 //counter为主程序循环次数计数器,
119 1 //set_S为当前的设定操作状态,为255时为非设定状态,为0、1、2、3时分别表示当前设定的位
120 1 //tempf为当前的频率值,
121 1 //i和temp是在程序运行时的辅助变量
122 1 TMOD=0x01;TH0=0xfe;TL0=0x18; TR0=1;ET0=1;EA=1;
123 1 //初始定时器,16位定时模式
124 1 setF(tempf);//设置PLL产生的频率
125 1 set_disp(tempf);//刷新显示
126 1 loop:
127 1 for(;;)
128 1 {
129 2 i=key();//扫描键盘
130 2
131 2 switch(i)
132 2 {
133 3 case 1 : //设定键按下
134 3 if (set_S==255)//如果原来为非设定状态
135 3 {
136 4 set_S=0;//进入设定状态
137 4 ledbuf[3]=led[3];//备份显示值,用于设定
138 4 ledbuf[2]=led[2];
139 4 ledbuf[1]=led[1];
140 4 ledbuf[0]=led[0];
141 4 }
142 3 else //如果原来为设定状态
143 3 {
144 4 temp=ledbuf[3]*1000+ledbuf[2]*100+ledbuf[1]*10+ledbuf[0]; //转换设定值
145 4 if((temp>=500)&&(temp<=1000))//判断设定值是否合法
146 4 {
147 5 tempf=temp;//记录新的频率值
148 5 setF(temp);//设置PLL产生新的频率
149 5 set_disp(temp);//刷新显示
150 5 }
151 4 set_S=255;//退出设定状态
152 4 }
153 3 break;
154 3 case 2 ://退出键按下
155 3 set_S=255;//退出设定状态
156 3 set_disp(tempf);//显示回原来的频率值
157 3 break;
158 3 case 3 ://加值键按下
159 3 if(++ledbuf[set_S]>9)//设定值加1并判断是否大于9,
*** ERROR C187 IN LINE 159 OF C:\WAVE6000\BIN\WWY_BYSJ\MAIN.C: not an lvalue
160 3 {
161 4 ledbuf[set_S]=0;//大于9,变为0
162 4 }
163 3 break;
164 3 case 4: //移位键按下
165 3 if(++set_S>3)//指向下一位,如果超过最后一位,指回第一位
166 3 {
167 4 set_S=0;
168 4 }
169 3 break;
170 3 }
171 2
172 2 wait_5ms();
173 2
174 2 if(set_S<4)//如果处于设定状态,控制当前显示位闪烁
175 2 {
176 3 if(++counter==100)//主程序运行了一百遍,约为100个wait_5ms()的时间
C51 COMPILER V7.06 MAIN 06/10/2007 21:20:07 PAGE 4
177 3 {
178 4 led[set_S]=16;//不显示
179 4 }
180 3 if(++counter==200)//主程序运行了2百遍,约为200个wait_5ms()的时间
181 3 {
182 4 counter=0;//重新计数
183 4 led[set_S]=ledbuf[set_S];//显示
184 4 }
185 3 }
186 2
187 2 }
188 1 goto loop;//避免程受干扰,跳出主循环
189 1 goto loop;
190 1 goto loop;
191 1 goto loop;
192 1 }
193
194 /*================TIME0显示=====================*/
195 void timer0 (void) interrupt 1 using 1
196 {static unsigned char k;//显示的位
197 1 TH0=0xfc;TL0=0x18;//重装定时值
198 1 P3=P3|0x0f; //灭显
199 1 if(k==2)//是否应该显示小数点
200 1 {
201 2 P1=ledmod[led[k]]|0x80;//送段代码并点亮小数点 (|0x80点亮小数点)
202 2 }
203 1 else
204 1 {
205 2 P1=ledmod[led[k]];//送段代码
206 2 }
207 1 P3=P3&ledsel[k];//送位选信号
208 1 k=(++k)&3;// 限制
209 1 }
210
211
C51 COMPILATION COMPLETE. 0 WARNING(S), 3 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -