新手一枚:4*4键盘无法连续输入的问题~求各大神赐教

2019-03-24 10:20发布

问题描述:写了一个4*4小键盘的程序,硬件没有问题。只是输入键值上有问题,比如按下“1” 后,数码管显示“1”,再继续按别的键就没反应了。必须rest重置,才能继续输入。   更为奇葩的是:如果按最后一行键盘就能连续输入,即按键C~F能连续输入。这是什么问题。。。。也是醉了。。。问了实验室的学长他们也无法回答。。。。
ps:本人新手,程序写的比较凌乱,希望大家轻喷。。。

  1. #include <msp430f1611.h>
  2. #define CPU_F                               ((double)8000000)
  3. #define delay_us(x)                       __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  4. #define delay_ms(x)                      __delay_cycles((long)(CPU_F*(double)x/1000.0))
  5. unsigned char key=0;                           //定义键值,保存要输出的字型码
  6. const char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//声明为const不可修改


  7. void getkey()                        //获得键值
  8. {
  9.   char recode;

复制代码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
chunyang
1楼-- · 2019-03-24 16:08
 精彩回答 2  元偷偷看……
zhangxiajoa
2楼-- · 2019-03-24 18:16
< :TI_MSP430_内容页_SA7 -->
chunyang 发表于 2015-4-15 22:26
显然是程序有错,注意检查有关状态位、寄存器的使用方法。

大神~麻烦你能否说的再详细一点呢,状态位、寄存器我并没有使用,是系统自动修改的么?
还望赐教~
zhangxiajoa
3楼-- · 2019-03-24 21:36

#include <msp430f1611.h>
#define CPU_F                               ((double)8000000)
#define delay_us(x)                       __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x)                      __delay_cycles((long)(CPU_F*(double)x/1000.0))
unsigned char key=0;                           //定义键值,保存要输出的字型码
const char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//声明为const不可修改


void getkey()                        //获得键值
{
  char recode;
//  P1DIR=0X0F;
//  P1OUT=0XFF;
//  recode=(P1IN&(0xf0))|0x0f;

P1OUT&=0xfe;                        //扫描第一行
   recode=(P1IN&(0xf0))|0x0f;
  if(recode==(0xef))
    key=0;
  if(recode==(0xdf))
    key=1;
  if(recode==(0xbf))
    key=2;
  if(recode==(0x7f))
    key=3;


   P1OUT|=0XFF;
    P1OUT=0XFD;                      //扫描第二行
  recode=(P1IN&(0xf0))|0x0f;        //每扫描一行都要加上这句话,才能正常输出
if(recode==(0xef))
    key=4;
  if(recode==(0xdf))
    key=5;
  if(recode==(0xbf))
    key=6;
  if(recode==(0x7f))
    key=7;


  P1OUT|=0XFF;
   P1OUT&=~BIT2;                      //扫描第三行
recode=(P1IN&(0xf0))|0x0f;
if(recode==(0xef))
    key=8;
  if(recode==(0xdf))
    key=9;
  if(recode==(0xbf))
    key=10;
  if(recode==(0x7f))
    key=11;

  P1OUT|=0XFF;
   P1OUT&=~BIT3;                        //扫描第四行
  recode=(P1IN&(0xf0))|0x0f;
   if(recode==(0xef))
    key=12;
  if(recode==(0xdf))
    key=13;
  if(recode==(0xbf))
    key=14;
  if(recode==(0x7f))
    key=15;
//  return key;
}
  
  
  
   
  
  

void display()                      //数码管显示函数
{

P4DIR|=0XFF;                             //P4定义为输出,到数码管
P3DIR|=0XFF;                             //位选通接口定义为输出,默认为输入!!!!
P3OUT=0XFF;
    P4OUT=tab[key];                      //P4输出字型码
    P3OUT=~(1);
}



void main(  )
{
  WDTCTL = WDTPW + WDTHOLD;
//P1DIR|=(BIT0+BIT1+BIT2+BIT3);          //定义p1.0--p1.3 out
P1DIR=0X0F;
//P1OUT &=~(BIT0+BIT1+BIT2+BIT3);             //定义行线1,2,3,4  ,输出低电平
P1OUT=0X00;

//display();
while(1)   
{
   
  if((P1IN&0XF0)!=0XF0)                        //判断按键是否按下,其中列线为4,5,6,7
  {
    delay_ms(10);
   // if(P1IN&~((BIT4+BIT5+BIT6+BIT7)))
    if((P1IN&0XF0)!=0XF0)
    {
     getkey() ;
       display();
       //while((P1IN&0XF0)!=0XF0);
    }   
  }  
} ;
}
chunyang
4楼-- · 2019-03-24 22:37
 精彩回答 2  元偷偷看……
qeqe123123
5楼-- · 2019-03-25 00:29
同进学习学习
zhangxiajoa
6楼-- · 2019-03-25 02:07
qeqe123123 发表于 2015-4-15 23:15
同进学习学习

恩恩,不过我的程序写的很乱,有不足之处,还请多加指点,不吝赐教。

一周热门 更多>

相关问题

    相关文章