问题描述:写了一个4*4小键盘的程序,硬件没有问题。只是输入键值上有问题,比如按下“1” 后,数码管显示“1”,再继续按别的键就没反应了。必须rest重置,才能继续输入。 更为奇葩的是:如果按最后一行键盘就能连续输入,即按键C~F能连续输入。这是什么问题。。。。也是醉了。。。问了实验室的学长他们也无法回答。。。。
ps:本人新手,程序写的比较凌乱,希望大家轻喷。。。
- #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;
复制代码
此帖出自
小平头技术问答
大神~麻烦你能否说的再详细一点呢,状态位、寄存器我并没有使用,是系统自动修改的么?
还望赐教~
#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);
}
}
} ;
}
恩恩,不过我的程序写的很乱,有不足之处,还请多加指点,不吝赐教。
一周热门 更多>