3149|9

60

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

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

问题描述:写了一个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;

复制代码

最新回复

同进学习学习  详情 回复 发表于 2015-4-15 23:15
 
点赞 关注

回复
举报

1万

帖子

141

TA的资源

版主

沙发
 
显然是程序有错,注意检查有关状态位、寄存器的使用方法。
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 

回复

60

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
chunyang 发表于 2015-4-15 22:26
显然是程序有错,注意检查有关状态位、寄存器的使用方法。

大神~麻烦你能否说的再详细一点呢,状态位、寄存器我并没有使用,是系统自动修改的么?
还望赐教~

点评

系统不会修改什么,完全由代码控制。不用寄存器那是不可能的,在你的程序中表现为变量,好好的检查代码吧,一个优秀的习惯是写出细化的程序流程,源代码则不值一看。  详情 回复 发表于 2015-4-15 22:44
 
 
 

回复

60

帖子

1

TA的资源

一粒金砂(中级)

4
 

#include
#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);
    }   
  }  
} ;
}
 
 
 

回复

1万

帖子

141

TA的资源

版主

5
 
zhangxiajoa 发表于 2015-4-15 22:35
大神~麻烦你能否说的再详细一点呢,状态位、寄存器我并没有使用,是系统自动修改的么?
还望赐教~

系统不会修改什么,完全由代码控制。不用寄存器那是不可能的,在你的程序中表现为变量,好好的检查代码吧,一个优秀的习惯是写出细化的程序流程,源代码则不值一看。

点评

好的,知道了,我会再努力调试的,谢谢啦  详情 回复 发表于 2015-4-15 23:22
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

6
 
同进学习学习
 
 
 

回复

60

帖子

1

TA的资源

一粒金砂(中级)

7
 

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

回复

60

帖子

1

TA的资源

一粒金砂(中级)

8
 
chunyang 发表于 2015-4-15 22:44
系统不会修改什么,完全由代码控制。不用寄存器那是不可能的,在你的程序中表现为变量,好好的检查代码吧,一个优秀的习惯是写出细化的程序流程,源代码则不值一看。

好的,知道了,我会再努力调试的,谢谢啦
 
 
 

回复

60

帖子

1

TA的资源

一粒金砂(中级)

9
 
 
 
 

回复

60

帖子

1

TA的资源

一粒金砂(中级)

10
 
问题已解决,谢谢@chunyang 大神指点。确实是寄存器的问题。表述如图,大家引以为戒!

QQ截图20150417165627.png (42.85 KB, 下载次数: 0)

QQ截图20150417165627.png
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表