#include
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;
sbit wela = P2^7;
sbit key1= P3^4;
uchar code table []={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0//加这个0就是什么都不显示
};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan();//声明一下
//void display(uchar num1);//这里可以做个显示函数,但是我没做。
void main(){
num = 17;//让它显示0 什么都不显示。 因为函数返回num值
dula =1 ;
P0= 0;
dula =0;
wela = 1;
P0= 0xc0;
wela = 0;
//以上P0口控制数码管的一上电什么都不显示
while(1){
num1 = keyscan();//没按下返回17
dula =1;
P0= table[num1-1];//17-1 =16
dula = 0;
}
}
//用uchar keyscan() 带返回值的函数 代替整个矩阵键盘 当然显示就不要了 dula 那3行我注释掉了
uchar keyscan(){
P3= 0xfe; //高4位是f 等于写了1 1 1 1 也满足了先写1的要求
temp =P3;//读回来了
temp &= 0xf0;//因为我们只是读回来高4位
while (temp != 0xf0){ //下面的几个while循环判断可以用if好理解。只看到第一行就行了。
//这几个while 都是做判断用的
delay(5);//消除抖动的
temp=P3;
temp &= 0xf0;
while(temp != 0xf0){ //确实不等于0xf0有按键按下
temp = P3;//我们这个时候只是把P3口的值赋给了temp
switch (temp){ //检测P3口。
case 0xee:
num = 1;
break;
case 0xde:
num=2;
break;
case 0xbe:
num=3;
break;
case 0x7e:
num=4;
break;
}
while(temp != 0xf0)//有按键按下可能是不等于的 循环在这里面 松手检测
{
temp = P3;
temp = temp & 0xf0; //这个是松手检测 松手这里就等于了0xf0
}//下面就显示一下 退出整个一行的循环,不加松手检测会退不出去循环
//到这里是把第一行检测了。
}
}
//////以下下是其他几行检测的代码
P3= 0xfd; //高4位是f 等于写了1 1 1 1 也满足了先写1的要求
temp =P3;//读回来了
temp &= 0xf0;//因为我们只是读回来高4位
while (temp != 0xf0){
delay(5);//消除抖动的
temp=P3;
temp &= 0xf0;
while(temp != 0xf0){ //确实不等于0xf0有按键按下
temp = P3;//我们这个时候只是把P3口的值赋给了temp
switch (temp){ //检测P3口。
case 0xed:
num = 5;
break;
case 0xdd:
num=6;
break;
case 0xbd:
num=7;
break;
case 0x7d:
num=8;
break;
}
while(temp != 0xf0)//有按键按下可能是不等于的 循环在这里面 松手检测
{
temp = P3;
temp = temp & 0xf0; //这个是松手检测 松手这里就等于了0xf0
}//下面就显示一下 退出整个2行的循环。不加松手检测会退不出去循环
//到这里是把第2行检测了。
}
}
P3= 0xfb; //高4位是f 等于写了1 1 1 1 也满足了先写1的要求
temp =P3;//读回来了
temp &= 0xf0;//因为我们只是读回来高4位
while (temp != 0xf0){
delay(5);//消除抖动的
temp=P3;
temp &= 0xf0;
while(temp != 0xf0){ //确实不等于0xf0有按键按下
temp = P3;//我们这个时候只是把P3口的值赋给了temp
switch (temp){ //检测P3口。
case 0xeb:
num =9;
break;
case 0xdb:
num=10;
break;
case 0xbb:
num=11;
break;
case 0x7b:
num=12;
break;
}
while(temp != 0xf0)//有按键按下可能是不等于的 循环在这里面 松手检测
{
temp = P3;
temp = temp & 0xf0; //这个是松手检测 松手这里就等于了0xf0
}//下面就显示一下 退出整个3行的循环。 不加松手检测会退不出去循环
//到这里是把第3行检测了。
}
}
P3= 0xf7; //高4位是f 等于写了1 1 1 1 也满足了先写1的要求
temp =P3;//读回来了
temp &= 0xf0;//因为我们只是读回来高4位
while (temp != 0xf0){
delay(5);//消除抖动的
temp=P3;
temp &= 0xf0;
while(temp != 0xf0){ //确实不等于0xf0有按键按下
temp = P3;//我们这个时候只是把P3口的值赋给了temp
switch (temp){ //检测P3口。
case 0xe7:
num =13 ;
break;
case 0xd7:
num=14;
break;
case 0xb7:
num=15;
break;
case 0x77:
num=16;
break;
}
while(temp != 0xf0)//有按键按下可能是不等于的 循环在这里面 松手检测
{
temp = P3;
temp = temp & 0xf0; //这个是松手检测 松手这里就等于了0xf0
}//下面就显示一下 退出整个4行循环。不加松手检测会退不出去循环
//到这里是把第4行检测了。
}
}
return num; //其实键盘扫描就需要一个值。
}
|