📄 5 4x4 key.lst
字号:
C51 COMPILER V8.08 5_4X4_KEY 10/28/2008 16:11:59 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 5_4X4_KEY
OBJECT MODULE PLACED IN 5 4X4 KEY.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 5 4X4 KEY.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //4*4 键盘检测程序,按下键后相应的代码显示在数码管上
2 #include<reg51.h>
3 sbit beep=P2^3; //蜂鸣器接口
4 sbit dula=P2^6; //控制数码管段选的锁存器锁存端
5 sbit wela=P2^7; //控制数码管位选的锁存器锁存端
6 unsigned char i=100;
7 unsigned char j,k,temp,key;
8 void delay(unsigned char i) //可自定义延时长短的延时函数
9 { //当 i=10 时大约为 10 毫秒
10 1 for(j=i;j>0;j--)
11 1 for(k=125;k>0;k--);
12 1 }
13 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
14 0x6d,0x7d,0x07,0x7f,0x6f,
15 0x77,0x7c,0x39,0x5e,0x79,0x71}; // 0-F编码
16 display(unsigned char num) // 显示子函数
17 {
18 1 P0=table[num]; //将第 num 个显示编码送 P0 口
19 1 dula=1; //一个下降沿将数据锁存
20 1 dula=0;
21 1 P0=0xc0; //位选通全部的数码管
22 1 wela=1; //一个下降沿将数据锁存
23 1 wela=0;
24 1
25 1
26 1
27 1 }
28 void main()
29 { dula=0; //先关闭两个锁存器
30 1 wela=0;
31 1 while(1) //进入检测总循环
32 1 { P3=0xfe; //给 P3.0 送低电平,其余为高电平
33 2 temp=P3; //把 P3 口数据读回来
34 2 temp=temp&0xf0; //把 P3 口与 11110000 相与
35 2 if(temp!=0xf0) //如果有键按下刚一定不相等,于是进入下一步检测
36 2 { delay(10); //延时去抖动
37 3 if(temp!=0xf0) //再次判断是否有键按下
38 3 { temp=P3; //判断为有,再次读 P3 口数据
39 4 switch(temp) //因为我们刚才是将第一行置的低
40 4 { //在这里再判断是第几列
41 5 case 0xee: //如果 temp=0xee 则为第一行和第一列
42 5 key=0; //的交叉点,由此我们知道是矩阵键盘
43 5 break; //上的第一个键被按下,我们给 key=0。
44 5 case 0xde: //以后依此类推
45 5 key=1;
46 5 break;
47 5 case 0xbe:
48 5 key=2;
49 5 break;
50 5 case 0x7e:
51 5 key=3;
52 5 break;
53 5 }
54 4 while(temp!=0xf0) //这段程序是检测按键是否被释放
55 4 { temp=P3; //如果没有释放就一直等待并且
C51 COMPILER V8.08 5_4X4_KEY 10/28/2008 16:11:59 PAGE 2
56 5 temp=temp&0xf0;
57 5 beep=0; //蜂鸣器一直响
58 5 }
59 4 beep=1; //释放后关闭蜂鸣器
60 4 display(key); //显示按下相应键值的数据
61 4 P1=0xfe; //将第一个发光二极管点亮(我写
62 4 } //程序的时候测试用的)
63 3 }
64 2 P3=0xfd;
65 2 temp=P3;
66 2 temp=temp&0xf0;
67 2 if(temp!=0xf0)
68 2 {
69 3 delay(10);
70 3 if(temp!=0xf0)
71 3 {
72 4 temp=P3;
73 4 switch(temp)
74 4 {
75 5 case 0xed:
76 5 key=4;
77 5 break;
78 5 case 0xdd:
79 5 key=5;
80 5 break;
81 5 case 0xbd:
82 5 key=6;
83 5 break;
84 5 case 0x7d:
85 5 key=7;
86 5 break;
87 5 }
88 4 while(temp!=0xf0)
89 4 {
90 5 temp=P3;
91 5 temp=temp&0xf0;
92 5 beep=0;
93 5 }
94 4 beep=1;
95 4 display(key);
96 4 P1=0xfc;
97 4 }
98 3 }
99 2 P3=0xfb;
100 2 temp=P3;
101 2 temp=temp&0xf0;
102 2 if(temp!=0xf0)
103 2 {
104 3 delay(10);
105 3 if(temp!=0xf0)
106 3 {
107 4 temp=P3;
108 4 switch(temp)
109 4 {
110 5 case 0xeb:
111 5 key=8;
112 5 break;
113 5 case 0xdb:
114 5 key=9;
115 5 break;
116 5 case 0xbb:
117 5 key=10;
C51 COMPILER V8.08 5_4X4_KEY 10/28/2008 16:11:59 PAGE 3
118 5 break;
119 5 case 0x7b:
120 5 key=11;
121 5 break;
122 5 }
123 4 while(temp!=0xf0)
124 4 {
125 5 temp=P3;
126 5 temp=temp&0xf0;
127 5 beep=0;
128 5 }
129 4 beep=1;
130 4 display(key);
131 4 P1=0xf8;
132 4 }
133 3 }
134 2 P3=0xf7;
135 2 temp=P3;
136 2 temp=temp&0xf0;
137 2 if(temp!=0xf0)
138 2 {
139 3 delay(10);
140 3 if(temp!=0xf0)
141 3 {
142 4 temp=P3;
143 4 switch(temp)
144 4 {
145 5 case 0xe7:
146 5 key=12;
147 5 break;
148 5 case 0xd7:
149 5 key=13;
150 5 break;
151 5 case 0xb7:
152 5 key=14;
153 5 break;
154 5 case 0x77:
155 5 key=15;
156 5 break;
157 5 }
158 4 while(temp!=0xf0)
159 4 {
160 5 temp=P3;
161 5 temp=temp&0xf0;
162 5 beep=0;
163 5 }
164 4 beep=1;
165 4 display(key);
166 4 P1=0xf0;
167 4 }
168 3 }
169 2 }
170 1 }
171
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 404 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
C51 COMPILER V8.08 5_4X4_KEY 10/28/2008 16:11:59 PAGE 4
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 + -