📄 pwm.lst
字号:
C51 COMPILER V7.06 PWM 11/20/2007 10:10:04 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PWM
OBJECT MODULE PLACED IN pwm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE pwm.c BROWSE DEBUG OBJECTEXTEND TABS(8)
stmt level source
1 #include <reg52.h>
2 #include <intrins.h>//包含_nop()函数
3
4
5
6 #define uchar unsigned char
7 #define uint unsigned int
8
9 sbit Dat=P1^0; //595数据输入端
10 sbit Sclk=P1^2; //595上升沿输出端
11 sbit Lclk=P1^1;//595存储寄存器输入
12
13 sbit output=P3^5;
14 sfr P3M0=0xb1;//STC单片机强上拉推挽模式,在此模式下,系统自动设置为强上拉
15 sfr P3M1=0Xb2;
16 /*SFR0xb0为特殊功能寄存器的P3口地址,0xb1,0xb2为功能设置位*/
17
18 uchar code BitTab[4]={0x0e,0x0d,0x0b,0x07};//数码管位选择(00001110,00001101,00001011,00000111)
19 uchar code DispTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
20 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //数码管字符显示
21
22 uchar temp1=0;
23 uchar temp2=0;
24 uchar keyvalue;
25 uchar scanf=0;
26 uchar chuli=0;
27 uchar keyci=0;
28 uchar DispT1=0;
29 uchar DispT2=0;
30 uchar DispT3=0;
31 uchar scanT=0x88;
32 uchar ydc=0;
33 uchar yfc=0;
34 uchar yec=0;
35 uchar shezhi=0;
36 uchar shezhif;
37 uchar timeflag;
38 uchar time;
39 uchar Aba=0;
40 uchar Abb=0;
41 uchar Bbb=8;
42 uchar Cbb=1;
43 uchar aim1=0;
44 uchar aim2=0;
45 uchar aim3=0;
46 uchar ain1=0;
47 uchar ain2=0;
48 uchar ain3=0;
49 uchar Hpl=0;
50 uchar Lpl=0;
51 uchar Hf=0;
52 uchar Lf=0;
53 uchar Hcishu=0;
54 uchar Lcishu=0;
55 uchar yhc=0;yic=0;yjc=0;ykc=0;ylc=0;ymc=0; //变量定义
C51 COMPILER V7.06 PWM 11/20/2007 10:10:04 PAGE 2
56
57 void SendData(uchar SendDat1,uchar SendDat2) //595发送数据
58 {
59 1 uchar i;
60 1 uchar j;
61 1 Lclk=0;//低电平时,数据更新
62 1 for(i=0;i<8;i++)
63 1 {
64 2 Sclk=0;//低电平时,读数据
65 2 for(j=8;j>0;j--);//短延时
66 2 if((SendDat1&0x80)==0)
67 2 Dat=0;
68 2 else Dat=1;
69 2 Sclk=1;//数据更新完成
70 2 for(j=8;j>0;j--);
71 2 SendDat1=SendDat1<<1;
72 2 }
73 1
74 1 for(i=0;i<8;i++)
75 1 {
76 2 Sclk=0;
77 2 for(j=8;j>0;j--);
78 2 if((SendDat2&0x80)==0)
79 2 Dat=0;
80 2 else Dat=1;
81 2 Sclk=1;
82 2 for(j=8;j>0;j--);
83 2 SendDat2=SendDat2<<1;
84 2
85 2 }
86 1 Lclk=1;//上升沿数据发送
87 1
88 1 for(j=8;j>0;j--);
89 1 Lclk=0;
90 1 }
91
92 void Disp1()
93 {
94 1 if(temp1<50)
95 1 {
96 2 SendData(BitTab[keyci-1],DispT1);
97 2 }
98 1 if(temp1>=50)
99 1 {
100 2 SendData(0xff,0xc0);
101 2 }
102 1 if(temp1==100)
103 1 {
104 2 temp1=0;
105 2 }//字符闪烁
106 1 SendData(BitTab[keyci],DispT2);
107 1 SendData(BitTab[keyci+1],DispT3);//修改后不闪烁位字符不变
108 1 }
109 void Disp2()
110 {
111 1 if(temp1<50)
112 1 {
113 2 SendData(BitTab[keyci-1],DispT2);
114 2 }
115 1 if(temp1>=50)
116 1 {
117 2 SendData(0xff,0xc0);
C51 COMPILER V7.06 PWM 11/20/2007 10:10:04 PAGE 3
118 2 }
119 1 if(temp1==100)
120 1 {
121 2 temp1=0;
122 2 }
123 1 SendData(BitTab[keyci-2],DispT1);
124 1 SendData(BitTab[keyci],DispT3);
125 1 }
126 void Disp3()
127 {
128 1 if(temp1<50)
129 1 {
130 2 SendData(BitTab[keyci-1],DispT3);
131 2 }
132 1 if(temp1>=50)
133 1 {
134 2 SendData(0xff,0xc0);
135 2 }
136 1 if(temp1==100)
137 1 {
138 2 temp1=0;
139 2 }
140 1 SendData(BitTab[keyci-3],DispT1);
141 1 SendData(BitTab[keyci-2],DispT2);
142 1 }
143 void Disp4()
144 {
145 1 if(timeflag==0)
146 1 {
147 2 SendData(BitTab[0],DispTab[Abb]);
148 2 SendData(BitTab[1],DispTab[Bbb]);
149 2 SendData(BitTab[2],DispTab[Cbb]);
150 2 }//倒计时结束或者停止键按下后数码管显示当前值。
151 1 if(timeflag==1)
152 1 {
153 2 SendData(BitTab[Aba],DispTab[Abb]);
154 2 SendData(BitTab[Aba+1],DispTab[Bbb]);
155 2 SendData(BitTab[Aba+2],DispTab[Cbb]);
156 2 SendData(BitTab[Aba+3],0x88);
157 2 if(time==200)//倒计时,5ms扫描一次,200次为一秒
158 2 {
159 3 time=0;//每1秒更新数据
160 3 if(Abb==0)
161 3 {
162 4 Abb=10;
163 4 if(Bbb==0)
164 4 {
165 5 Bbb=10;
166 5 Cbb=0;
167 5 }
168 4 Bbb--;
169 4 }
170 3 Abb--;
171 3 if((Abb==0)&&(Bbb==0)&&(Cbb==0)) //数码管全为0后置停止标志位
172 3 {
173 4 timeflag=0;
174 4 }
175 3 }
176 2 }
177 1 }
178 void scan()
179 {
C51 COMPILER V7.06 PWM 11/20/2007 10:10:04 PAGE 4
180 1 uchar key;
181 1 if(shezhi!=0)//设置键按下后才可以扫描光标和+,-键
182 1 {
183 2 SendData(0x67,scanT); //矩阵键盘扫描方法,发第一行01100111,重要的是第四个0
184 2 P1=P1|0x18;
185 2 key=P1;
186 2 key=key&0x18;//保护现场,读键值
187 2 if(key!=0x18)
188 2 {
189 3 temp2++;
190 3 if((temp2==50)&&(key!=0x18))//去键盘抖动
191 3 {
192 4 temp2=0;
193 4 if(key==0x08)
194 4 {
195 5 chuli=1;
196 5 keyvalue=1;//光标键
197 5 }
198 4 if(key==0x10)
199 4 {
200 5 chuli=1;
201 5 keyvalue=2;//+键
202 5 }
203 4 }
204 3 }
205 2 }
206 1 SendData(0x57,scanT);//扫描第二行01010111,重要的是第三个0
207 1 key=P1|0xe7;
208 1 key=key&0x18;
209 1 if(key!=0x18)
210 1 {
211 2 temp2++;
212 2 if((temp2==50)&&(key!=0x18))
213 2 {
214 3 temp2=0;
215 3 if(shezhi!=0)
216 3 {if(key==0x08)
217 4 {
218 5 chuli=1;
219 5 keyvalue=3;//-键
220 5 }
221 4 }
222 3 if(timeflag==0)
223 3 {
224 4 if(key==0x10)
225 4 {
226 5 chuli=1;
227 5 keyvalue=4;//设置键
228 5 }
229 4 }
230 3 }
231 2 }
232 1 SendData(0x37,scanT);//扫描第三行00110111,重要的是第二个0
233 1 key=P1|0xe7;
234 1 key=key&0x18;
235 1 if(key!=0x18)
236 1 {
237 2 temp2++;
238 2 if((temp2==50)&&(key!=0x18))
239 2 {
240 3 temp2=0;
241 3 if(key==0x08)
C51 COMPILER V7.06 PWM 11/20/2007 10:10:04 PAGE 5
242 3 {
243 4 chuli=1;
244 4 keyvalue=5;//启动键
245 4 }
246 3 if(key==0x10)
247 3 {
248 4 chuli=1;
249 4 keyvalue=6;//停止键
250 4 }
251 3 }
252 2 }
253 1 }
254
255 void deal()//按键处理程序
256 {
257 1 if(keyvalue==1)//光标键处理
258 1 {
259 2 keyci++;
260 2 if(keyci==1)//第一位
261 2 {
262 3 if(shezhi==1)//高电平时间
263 3 {
264 4 DispT1=DispTab[aim1];
265 4 DispT2=DispTab[aim2];
266 4 DispT3=DispTab[aim3];
267 4 Disp1();
268 4 }
269 3 if(shezhi==2)//低电平时间
270 3 {
271 4 DispT1=DispTab[ain1];
272 4 DispT2=DispTab[ain2];
273 4 DispT3=DispTab[ain3];
274 4 Disp1();
275 4 }
276 3 if(shezhi==3)//倒计时时间
277 3 {
278 4 DispT1=DispTab[Abb];
279 4 DispT2=DispTab[Bbb];
280 4 DispT3=DispTab[Cbb];
281 4 Disp1();
282 4 }
283 3 }
284 2 if(keyci==2)//第二位
285 2 {
286 3 if(shezhi==1)
287 3 {
288 4 DispT2=DispTab[aim2];
289 4 }
290 3 if(shezhi==2)
291 3 {
292 4 DispT2=DispTab[ain2];
293 4 }
294 3 if(shezhi==3)
295 3 {
296 4 DispT2=DispTab[Bbb];
297 4 }
298 3 Disp2();
299 3 }
300 2 if(keyci==3)//第三位
301 2 {
302 3 if(shezhi==1)
303 3 {
C51 COMPILER V7.06 PWM 11/20/2007 10:10:04 PAGE 6
304 4 DispT3=DispTab[aim3];
305 4 }
306 3 if(shezhi==2)
307 3 {
308 4 DispT3=DispTab[ain3];
309 4 }
310 3 if(shezhi==3)
311 3 {
312 4 DispT3=DispTab[Cbb];
313 4 }
314 3 Disp3();
315 3 }
316 2 if(keyci==4)
317 2 {keyci=1;}
318 2 }
319 1 if(keyvalue==2)//+键处理程序
320 1 {
321 2 if(keyci==1)
322 2 {
323 3 if(shezhi==1)
324 3 {
325 4 yhc++;//按一次字符值+1
326 4 if(yhc==10)
327 4 {
328 5 yhc=0;
329 5 }
330 4 aim1=yhc;
331 4 DispT1=DispTab[yhc];
332 4 Disp1();
333 4 }
334 3 if(shezhi==2)
335 3 {
336 4 yic++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -