- #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; //其实键盘扫描就需要一个值。
- }
|