关于实验内容1
void matrixkey()
{
P3=smgwei[3];
P2=smgduan[1];
MTX_KEY=0x0f;
if(MTX_KEY!=0x0f)
{
delay(100);//按键消抖
if(MTX_KEY!=0x0f)
{
MTX_KEY=0x0f;
switch(MTX_KEY)
{
case 0x0e: keyvalue=1;break;
case 0x0d: keyvalue=1;break;
case 0x0b: keyvalue=1;break;
case 0x07: keyvalue=1;break;
}
MTX_KEY=0xf0;
switch(MTX_KEY)
{
case 0xe0: keyvalue=keyvalue,P3=smgwei[3];break;
case 0xd0: keyvalue=keyvalue,P3=smgwei[3];break;
case 0xb0: keyvalue=keyvalue,P3=smgwei[3];break;
case 0x70: keyvalue=keyvalue,P3=smgwei[3];break;
}
}
while(MTX_KEY!=0xf0)//消抖+没松手的时候数码管不变数字
{
delay(100);
}
}
P2=smgduan[0];
}
这是关于矩阵按键行列扫描的重要函数,其中遇到的问题是按键按下,数码管从0变1,
但是按键松开,数码管不会从1再变回0,此时我在子函数开头加了一个P3=smgwei[3];
和P2=smgduan[1];
的代码,因为keyvalue我设置的是全局变量且一开始赋给其0,所以我一开始设置让他在数码管从左数第一位显示0,且第一次按下案件如果没有P2=那个代码的话,第一次按键按下是没有数字变化的!!!!再在最后加了一个P2=smgduan[0];
的代码,以保证按键松开后使数字从1再变回0
void matrixkey()
{
u16 a=0;
MTX_KEY=0x0f;
if(MTX_KEY!=0x0f)
{
delay(100);//按键消抖
MTX_KEY=0x0f;//再确认以下按键有没有按下去
if(MTX_KEY!=0x0f)
{
MTX_KEY=0x0f;
switch(MTX_KEY)
{
case 0x0e: keyvalue=4;break;
case 0x0d: keyvalue=3;break;
case 0x0b: keyvalue=2;break;
case 0x07: keyvalue=1;break;
}
MTX_KEY=0xf0;
switch(MTX_KEY)
{
case 0xe0: keyvalue=keyvalue+12,P3=smgwei[0];break;
case 0xd0: keyvalue=keyvalue+8,P3=smgwei[1];break;
case 0xb0: keyvalue=keyvalue+4,P3=smgwei[2];break;
case 0x70: keyvalue=keyvalue,P3=smgwei[3];break;
}
}
while((a++<50)&&(MTX_KEY!=0xf0))//消抖+及时切换数字和位置
{
delay(100);
}
}
}
这是关于矩阵按键行列扫描的重要函数,主要是让对应位(1、2、3、4)对应显示1、2、3、4行的数字(对应实验内容2)。此代码加了个a=0;
和a++<50;
同时让后者工作在while循环里,是因为要及时切换数字和位置,不能发生位置变了数字还延迟着没变的现象,这就给人一种不严谨、瞎眼的感觉。
这个十六进制对应按键研究了好半天,其实仔细对应好就ok,具体的根据proteus上连线方式来对应即可!
2020.4.10
遇到一个新的问题,如果实验内容2中我想在按下按键再松开后数码管不显示任何值,该怎么做呢?目前没有思路,调试N遍也不行~