找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2109|回复: 3
收起左侧

5*4键盘扫描程序,按键值扫出来少一行~!请高手解答下。谢谢~!

[复制链接]
ID:186564 发表于 2017-7-1 10:39 | 显示全部楼层 |阅读模式
#ifndef _key_H_
#define _key_H_
#include<reg51.h>
unsigned char num[5][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}};        //5行4列
#define uint unsigned int
unsigned char KEY;
sbit H5=P3^0;


keybord()
{
unsigned char H,L,tmp1,tmp2;           //行是j  列是i
     while(1)
    {P2=0x0f;
         H5=0;                      //P2口输出      0 0 0 0 1 1 1 1        ,读低4位
     if(P2!=0x0f);
         delay_ms(10);
          if(P2!=0x0f);        //读取P2口的值,如果不等于00001111,证明有键按下
             {tmp1=P2;       //按下后,P2口的值给temp1      
                   switch(tmp1)
                    {                         //     P2.7  P2.6   P2.5  P2.4  P2.3  P2.2   P2.1   P2.0
                     case 0x07:L=4;break;    //如果   0      0     0      0     0     1     1       1  为第4列
                     case 0x0b:L=3;break;    //如果   0      0     0      0     1     0     1       1  为第3列
                     case 0x0d:L=2;break;    //如果   0      0     0      0     1     1     0       1  为第2列
                     case 0x0e:L=1;break;   // 如果   0      0     0      0     1     1     1       0  为第1列
                    }

                                          
                                            P2=0xf0;
                                                H5=1;
                                                if(P2!=0xf0);            //P2口输1111 0000  读高4位
                        delay_ms(5);
                                                if(P2!=0xf0);     
                        tmp2=P2;            // P2口的值给tmp2   
                            switch(tmp2)
                            {                     //       p3.0 P2.7  P2.6   P2.5  P2.4  P2.3  P2.2   P2.1   P2.0
                            case 0x70:H=4;break;  //如果    1      0      1     1      1     0     0     0       0           为第1行
                            case 0xb0:H=3;break;  //如果    1      1      0     1      1     0     0     0       0           为第2行
                            case 0xd0:H=2;break;  //如果    1      1      1     0      1     0     0     0       0           为第3行
                            case 0xe0:H=1;break; // 如果    1      1      1     1      0     0     0     0       0           为第4行
                                                        case 0xf0:if(H5!=1){H=5;};break;  // 如果   0      1      1     1      1     0     0     0       0           为第5行
                             }                 
                              KEY=num[H][L];     
                                                }
                                                     return KEY;
      }
                               
}
                                 
KEY_display(uint k)
{
        switch(k)
        {        case 1: disp_cn_2(NO_0,6,32);break;
                 case 2: disp_cn_2(NO_1,6,32); break;
                 case 3: disp_cn_2(NO_2,6,32); break;
                 case 4: disp_cn_2(NO_1,6,32); break;
                 case 5: disp_cn_2(NO_7,6,32); break;
                 case 6: disp_cn_2(NO_8,6,32); break;
                 case 7: disp_cn_2(NO_6,6,32); break;
                 case 8: disp_cn_2(NO_3,6,32); break;
                 case 9: disp_cn_2(NO_2,6,32); break;
                 case 10: disp_cn_2(NO_9,6,32); break;
                 case 11:disp_cn_2(NO_9,6,32); break;
                 case 12:disp_cn_2(NO_2,6,32); break;
                 case 13:disp_cn_2(NO_4,6,32); break;
                 case 14:disp_cn_2(NO_13,6,32); break;
                 case 15:disp_cn_2(NO_4,6,32); break;
                 case 16:disp_cn_2(NO_1,6,32); break;
                 case 17:disp_cn_2(NO_8,6,32); break;
                 case 18:disp_cn_2(NO_17,6,32); break;
                 case 19:disp_cn_2(NO_8,6,32); break;
                 case 20:disp_cn_2(NO_6,6,32); break;
        default: break;
        }

}
       

#endif               

回复

使用道具 举报

ID:123289 发表于 2017-7-1 13:35 | 显示全部楼层
走单步找一下,不难。
回复

使用道具 举报

ID:213173 发表于 2017-7-1 20:29 | 显示全部楼层
通常模块化编程都是一个C文件对应一个H文件,你这胡子眉毛一把抓,即不是C文件也不像H文件,搞不清是小白一枚还是顶级高手。
回复

使用道具 举报

ID:111634 发表于 2017-7-1 20:52 | 显示全部楼层
你的键扫描程序少一行,看样子,这个程序是抄来的。读懂这个程序,加上一行扫描就行!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表