📄 keyscan_led.lst
字号:
C51 COMPILER V7.20 KEYSCAN_LED 08/16/2007 19:40:59 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE KEYSCAN_LED
OBJECT MODULE PLACED IN keyscan_led.OBJ
COMPILER INVOKED BY: C:\Program File\Keil\C51\BIN\C51.EXE keyscan_led.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*4×4键盘扫描及6位LED显示程序*/
2 /*LED显示时,P2为位选码,P3为段选码*/
3 /*键盘扫描时,P0高四位(行线)为输出,低四位(列线)为输入*/
4 #include "reg51.h"
5 #define KEY P0
6
7 const unsigned char NUM_LED[17]= //共阴七段码,a为低位,dp为高位
8 {
9 0x3f,0x06,0x5b,0x4f,0x66,//0~4
10 0x6d,0x7d,0x07,0x7f,0x6f,//5~9
11 0x77,0x7c,0x39,0x5e,0x79,//a~e
12 0x71,0x00 //f,全不显示
13 };
14 unsigned char led_buf[4];
15 unsigned char key_get; //得到的键值
16 unsigned char key_cnt; //已得到的键数量
17 unsigned char key_press;
18 const unsigned char key_map[16]= //设置键盘的逻辑值与程序计算键值的映射
19 { //按手机键盘设置
20 1,2,3,0x0a,
21 4,5,6,0x0b,
22 7,8,9,0x0c,
23 0x0e,0,0x0f,0x0d
24 };
25
26 void init_key(void) /*初始化*/
27 {
28 1 unsigned char i;
29 1
30 1 key_get=0;key_cnt=0xff;//-1
31 1 key_press=0;//flag=0;
32 1 for(i=0;i<4;i++)
33 1 led_buf[i]=0;//led_buf[i]=16;//不显示
34 1 }
35
36 void display() /*LED显示*/
37 {
38 1 unsigned char ctr=0x04; //从第三个数码管显示(前两个不能用)
39 1 unsigned char i;
40 1 int j;
41 1
42 1 for(i=0;i<4;i++) //四位数码管只需移动3次
43 1 {
44 2 P2=ctr; //送位选码
45 2 P3=NUM_LED[led_buf[i]];//送段选码
46 2 for(j=0;j<1000;j++); //延时
47 2 ctr=ctr<<1;
48 2 }
49 1
50 1 P2=0; //可避免显示完最后一位后,延时较长造成显示亮度不均匀
51 1 }
52
53 void key_scan(void) /*键盘扫描*/
54 {
55 1 int i,j;
C51 COMPILER V7.20 KEYSCAN_LED 08/16/2007 19:40:59 PAGE 2
56 1 unsigned char scancode=0xef;//高位扫描
57 1
58 1 //KEY=0x0f;//00001111B
59 1 //for(i=0;i<1000;i++); //延时
60 1
61 1 if(KEY==0x0e) //00001110
62 1 j=0; //在第0列(列输入)
63 1 else if(KEY==0x0d) //00001101
64 1 j=1; //在第1列(列输入)
65 1 else if(KEY==0x0b) //00001011
66 1 j=2; //在第2列(列输入)
67 1 else if(KEY==0x07) //00000111
68 1 j=3; //在第3列(列输入)
69 1 KEY=scancode;//11101111B
70 1 for(i=0;i<4;i++) //在第i行
71 1 {
72 2 if(KEY!=scancode)
73 2 break;
74 2 else
75 2 {scancode=(scancode<<1)|0x0f;//扫描码左移一位,低四位为1
76 3 KEY=scancode;
77 3 }
78 2 }
79 1 key_get=key_map[i*4+j];
80 1 }
81
82 unsigned char key_event() /*确定键盘事件,能判断键盘是否松开*/
83 {
84 1 unsigned char flag=0;
85 1 int i;
86 1
87 1 KEY=0x0f;
88 1 for(i=0;i<50;i++); //延时去抖动
89 1
90 1 if((key_press==0)&&(KEY<0x0f))//有按键
91 1 {
92 2 key_press=1;
93 2 key_scan();
94 2 }
95 1 else if((key_press==1)&&(KEY==0x0f))//已松开按键
96 1 {
97 2 key_press=0;
98 2 flag=1;
99 2 }
100 1
101 1 return flag;
102 1 }
103
104 void main(void) /*主程序*/
105 {
106 1 int i;
107 1 init_key();
108 1
109 1 while(1)
110 1 {
111 2 if(key_event())//扫描到了按键
112 2 {
113 3 for(i=3;i>0;i--) //移位,保存
114 3 led_buf[i]=led_buf[i-1];
115 3 led_buf[0]=key_get;
116 3 //for(i=0;i<15000;i++); //延时去抖动
117 3
C51 COMPILER V7.20 KEYSCAN_LED 08/16/2007 19:40:59 PAGE 3
118 3 }
119 2 display();
120 2 }
121 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 243 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 40 ----
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 + -