键盘扫描程序不知道错到哪了,帮忙指点一下

2019-03-24 18:08发布

/*键盘功能和扫描值对应关系(前面是功能,后面是扫描键号)
|--------|--------|--------|---------|
|1         (0)|2  (1)|3  (2)|选择(3)|
|--------|--------|--------|---------|
|4        (4) |5  (5)|6  (6)|确认(7)|
|--------|--------|--------|---------|
|7        (8) |8  (9)|9 (10)|删除(11 |
|--------|--------|--------|---------|
|。(12)|0 (13)| (14) |  (15) |
|--------|--------|--------|---------|


*/

/***********************键盘用外部中断0 *****************************************************/

#include"reg52.h"
//#include"main.h"
//#include"st7565.h"
//#include"keyscan.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char code DIG_PLACE[8] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制
void delayms(uint);
uchar keyscan();
uchar keypad_zh(uchar);


void main()
{  uchar jh,num;

  while(1)
    {
        jh=keyscan();
     num=keypad_zh(jh);
         
         P0=DIG_PLACE[4];
         P2=DIG_CODE[num];//发送段码
         
         delayms(10);
         P2=0x00;
          }
  }





/************************************键盘扫描得到返回0—F编号******/

uchar keyscan(void)////要注意返回值
{ uchar jh=0,hx=4,sm=0xfe,lie=0;    /*jh为按键号,hx为扫描行数,sm为行扫描值,lie为读取的列值,*/
  // bit select=0;                          /*select为1时输入的为每克卡路里值,为0时输入的为编号*/                  
  // float cli=0,cli_out=0;                /*cli每克卡路里值,cli_out为最终的卡路里总值输出*/
//  uchar  xsd=0,xsd_0=0,xsd_1=0;          /*xsd为小数点,xsd_0为小数点之前的位数,xsd_1为小数点之后的位数*/
//  uint  delete=0,i=0,f2int=0;           /*delete为删除操作后的数*/
//  float code str1[100]={1.2,1.3,1.4,1.5,2.3,2.6};  /*放在外部用code,这是定义的一串用于查询的卡路里的数组*/
  
   //        P1=0xff;
        for(hx=4;hx>0;hx--)
         {P1=sm;
          lie=P1&0xf0;
           if(lie!=0xf0)
                  {delayms(10);
                  lie=P1&0xf0;
                  if(lie!=0xf0)
                   {CY=1;
                             lie=lie<<4;                //加了这一句
                           do
                 {lie=lie<<1;                      ////////可能有问题
                     if(CY==1){jh=jh+1;}
                      }
                     while(CY);
                   }
                 }
          else                  //if(lie==0xf0)
           { delayms(10);
                  lie=P1&0xf0;
                  if(lie==0xf0)
                       {CY=1;
                         sm=sm<<1;
                 jh=jh+4;
                  hx--;
                     }
           }         
        }
        return (jh);
}
/**************************************************************************/



/****************将0-F编号转换成键盘上对应的功能键*******/
uchar keypad_zh(uchar jh)
         { uchar num;
          switch(jh)                          //要把键号转换为对应的数字(0--9)
                  {
                case 13:num=0;break;
                case 0:num=1;break;
                case 1:num=2;break;          
                case 2:num=3;break;               
                case 4:num=4;break;
                case 5:num=5;break;
                case 6:num=6;break;
                case 8 :num=7;break        ;
                case 9:num=8;break;
                case 10:num=9;break;

                default: break;
                }
           return (num);
         }

/********************延时程序****************/
void delayms(uint xms)
   {uint i,j;
    for(i=xms;i>0;i--)
                     for(j=110;j>0;j--);
   } 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
dll_epdc
2019-03-25 09:31
if(lie!=0xf0)
{
     delayms(10);
     lie=(P3&0xf0);
     if(lie!=0xf0)
      {
          CY=1;
         lie=(lie>>4);  //加了这一句,把原先的左移改成了右移
      do
          {
               lie=(lie>>1);               ////////改成了右移
          if(CY==1) jh++;
         }
        while(CY);//CY被你赋值为1了,不就成死循环了么?????
      }
    }
还得去研究扫描法的原理啊,你程序根本就没看到扫描代码部分。

一周热门 更多>