📄 k1-k4-move-shuma-c51.lst
字号:
C51 COMPILER V8.02 K1_K4_MOVE_SHUMA_C51 12/23/2006 12:19:09 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE K1_K4_MOVE_SHUMA_C51
OBJECT MODULE PLACED IN K1-K4-MOVE-SHUMA-C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE K1-K4-MOVE-SHUMA-C51.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************
2 * *
3 * ME500单片机开发系统演示程序 - 计按键次数 *
4 * *
5 * 8位数码管显示 *
6 * *
7 * 版本: V1.0 (2006/11/20) *
8 * 作者: gguoqing (Email: gguoqing@willar.com) *
9 * 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) *
10 * 时间: 2006/07/21 *
11 * *
12 *【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
13 *【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
14 * *
15 ********************************************************************
16 * *
17 * 对独立键进行按键次数计数,8位数码管显示。 *
18 * K1按下后,进行加1计数,逐个增加显示位。 *
19 * K2按下后,进行减1计数,逐个减少显示位。 *
20 * K3暂时没有定义功能。 *
21 * K4按下后,清计数单元,只有第一位数码管显示0。 *
22 * 数码管显示的位数随K1和K2按下的次数,增加与减少。 *
23 * *
24 *******************************************************************/
25
26 #include < reg52.h >
27 unsigned char k_scan();
28 unsigned char k_pro();
29 unsigned char k_new,k_old;
30 unsigned char k,num,x,n;
31 unsigned char k_count=0;
32
33 unsigned char k1_prog();
34 unsigned char k2_prog();
35 unsigned char k4_prog();
36
37 void delay(unsigned char m);
38 void disp_count();
39
40 sbit k1=P1^4; sbit k2=P1^5;
41 sbit k3=P1^6; sbit k4=P1^7;
42
43 unsigned char code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
44 0x80,0x90,0xff};
45
46 unsigned char data display[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
47
48 unsigned char code scan_bit[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
49
50 /********************************************************/
51 //主程序
52 /********************************************************/
53 void main(void)
54 {
55 1 P0=0xff;
C51 COMPILER V8.02 K1_K4_MOVE_SHUMA_C51 12/23/2006 12:19:09 PAGE 2
56 1 P1=0xff;
57 1 P2=0xff;
58 1 k_old=0x00;
59 1 k=0x00;
60 1
61 1 while(1)
62 1 {
63 2 disp_count();
64 2 k_new=k_scan();
65 2
66 2 if(k_new!=k_old)
67 2 {
68 3 for(num=0;num<10;num++) //调显示来做键延时,去抖动
69 3 disp_count();
70 3 }
71 2 if(k_new!=k_old)
72 2 {
73 3 k=k_pro();
74 3 }
75 2
76 2 switch(k)
77 2 {
78 3 case 1: k1_prog(); break;
79 3 case 2: k2_prog(); break;
80 3 case 3: break;
81 3 case 4: k4_prog(); break;
82 3
83 3 default: break;
84 3 }
85 2 k=0x00;
86 2 }
87 1 }
88 /********************************************************/
89 //K1键功能子程序
90 /********************************************************/
91 unsigned char k1_prog()
92 {
93 1 k_count++; //加计数
94 1
95 1 switch(k_count)
96 1 {
97 2 case 1: display[0]=0x01; break;
98 2 case 2: display[1]=0x02; break;
99 2 case 3: display[2]=0x03; break;
100 2 case 4: display[3]=0x04; break;
101 2 case 5: display[4]=0x05; break;
102 2 case 6: display[5]=0x06; break;
103 2 case 7: display[6]=0x07; break;
104 2 case 8: display[7]=0x08; break;
105 2
106 2 default:
107 2 k_count=8; break;
108 2 }
109 1 k=0x00;
110 1 return(k_count);
111 1 }
112
113 /********************************************************/
114 //K2键功能子程序
115 /********************************************************/
116 unsigned char k2_prog()
117 {
C51 COMPILER V8.02 K1_K4_MOVE_SHUMA_C51 12/23/2006 12:19:09 PAGE 3
118 1 if(k_count==0)
119 1 { ; }
120 1 else
121 1 {
122 2 switch(k_count)
123 2 {
124 3 case 1: display[0]=0x00; break;
125 3 case 2: display[1]=0x0a; break;
126 3 case 3: display[2]=0x0a; break;
127 3 case 4: display[3]=0x0a; break;
128 3 case 5: display[4]=0x0a; break;
129 3 case 6: display[5]=0x0a; break;
130 3 case 7: display[6]=0x0a; break;
131 3 case 8: display[7]=0x0a; break;
132 3
133 3 default:
134 3 k_count=0; //键计数单元清零
135 3 break;
136 3 }
137 2 k=0x00;
138 2 k_count--; //键计数
139 2 return(k_count);
140 2 }
141 1 }
142
143 /********************************************************/
144 //K4键功能子程序
145 /********************************************************/
146 unsigned char k4_prog()
147 {
148 1 display[0]=0x00; //第一位数码管显示0
149 1
150 1 for(n=1;n<8;n++)
151 1 {
152 2 display[n]=0x0a; //关闭7个数码管
153 2 }
154 1
155 1 k_count=0; //键计数单元清零
156 1
157 1 return(k_count);
158 1 }
159
160 /********************************************************/
161 //显示子程序
162 /********************************************************/
163 void disp_count()
164 {
165 1 for(n=0;n<8;n++)
166 1 {
167 2 for(x=1;x<8;x++) //如果高位为0,不显示
168 2 {
169 3 if(display[x]==0x00)
170 3 display[x]=0x0a;
171 3 }
172 2
173 2 P0 =LEDData[display[n]] ; //显示段码
174 2 P2 =scan_bit[n]; //输出位码
175 2 delay(1);
176 2 P2 = 0xff; //关闭显示
177 2 }
178 1 }
179
C51 COMPILER V8.02 K1_K4_MOVE_SHUMA_C51 12/23/2006 12:19:09 PAGE 4
180 /********************************************************/
181 //判键值子程序
182 /********************************************************/
183 unsigned char k_pro()
184 {
185 1 switch (k_new)
186 1 {
187 2 case 0x01: k=1; break; //K1按下
188 2 case 0x02: k=2; break; //K2按下
189 2 case 0x04: k=3; break; //K3按下
190 2 case 0x08: k=4; break; //K4按下
191 2
192 2 default: break;
193 2 }
194 1 return(k);
195 1 }
196
197 /********************************************************/
198 //扫描键子程序
199 /********************************************************/
200 unsigned char k_scan()
201 {
202 1 P1=0xff;
203 1 k_new=0x00;
204 1 k_new=(~P1 & 0xf0)>>4;
205 1
206 1 return(k_new); //无键按下
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -