本帖最后由 骓风91 于 2016-10-28 15:20 编辑
如题 矩阵扫描程序已经写好了 也能够输出对应的数值了 但是我需要连续输入两个数字并将这两个数字存下来用 哪位大神可以帮我指点一下代码如何写。
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
OLED_Init(); //初始化OLED
OLED_Clear();
while(1)
{
delay_ms(200);
OLED_Clear();
numSet = scanNum(); // 这个函数可以输出单个值
OLED_ShowNum(80,6,numSet,3,16);//显示按键值
}
}
char key = 0;
//延时消抖
void delays()
{
int v=1000;
while(v!=0)
v--;
}
//按键扫描
void keyScan(void)
{
char sccode,recode;
//将P9.0、P9.1、p9.2、p9.3、设置为输出方向 将P9.4、p9.5、p9.6、P9.7设置为输入方向
P9DIR = 0X0f;
//将所有输出置为低电平
P9OUT = 0X00;
if((P9IN & 0Xf0) != 0Xf0) //判断是否有有键按下(即输出全部置低 检测输入是否全部为高),若有 往下执行
{
delays();
if((P9IN&0xf0)!=0xf0) //再次判断列中是否是干扰信号,不是则向下执行
{
//从第1行进行扫描 将第一行置低 其他三行置高 检测输出是否全部是高电平 1111 1110
sccode=0xfe;
//行扫描完成(4行已全部扫描完)sccode为1110 1111 停止while程序
while((sccode&0X10) !=0)
{
P9OUT = sccode; // 行扫描码
if((P9IN&0xf0)!=0Xf0) //本行有键按下(即P1(真实的状态)的高四位不全为1)
{
recode=(P9IN&0xf0)|0x0f; //列(列处于高四位,低四位补1)
key=(sccode & recode); //行和列 (0表示行与列的位置)
break;
}
else
{
sccode=(sccode<<1)|0x01; ;//行扫描码左移一位
}
}
}
}
}
//将按键转换为对应数值
int transNum(void)
{
int num;
delays();
keyScan();
switch(key)
{
case 0xee: num = 0;break; // 1110 1110
case 0xde: num = 1;break; // 1101 1110
case 0xbe: num = 2;break; // 1011 1110
case 0x7e: num = 3;break; // 0111 1110
case 0xed: num = 4;break; // 1110 1101
case 0xdd: num = 5;break; // 1101 1101
case 0xbd: num = 6;break; // 1011 1101
case 0x7d: num = 7;break; // 0111 1101
case 0xeb: num = 8;break; // 1110 1011
case 0xdb: num = 9;break; // 1101 1011
// case 0xbb: num = 0;break; // 1011 1011
// case 0x7b: num = 0;break; // 0111 1011
//
// case 0xe7: num = 0;break; // 1110 0111
// case 0xd7: num = 0;break; // 1101 0111
// case 0xb7: num = 0;break; // 1011 0111
// case 0x77: num = 0;break; // 0111 0111
default: break;
}
return num;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这。。。
建议按键用中断做,如果按下再返回值 没按下就不执行num = transNum();这段代码
一周热门 更多>