问题描述
按下第一个按键使步进电机可以正转、第二个反转反转、第三个按键停止
矩阵按键控制
画了张矩阵按键的内部电路图:
矩阵按键实物图:
ABC
按键右边的就是步进电机。
按键第一行连接的是寄存器GPFDAT0
的端口
第二行连接的是寄存器GPFDAT2
的端口
第三行连接的是寄存器GPGDAT3
的端口
第四行连接的是寄存器GPGDAT11
的端口
GPF寄存器是8个位;GPG、GPE寄存器是16位。每种寄存器还对应有GPCON控制寄存器和GPUP上拉电阻寄存器。这里可以不用配置GP*UP上拉电阻。
GP*CON控制寄存器:00输入,01输出,10中断,11保留
思路
将行配置为输入,列配置为输出。因为行连接电源,在按键没被按下时是高电平,按下后行的电平变为列电平值。
//按键,列的地址,低四位控制 #define KEY_LINE (*(volatile unsigned short*)0x38001002)
检测分三步:
1、将行配置为输入,列配置为输出。
2、首先将列全部置0,检测行是否位0,是则说明这一行有按键被按下;
3、再将一列置0,其余三列置1,检测行是否位0,是则说明这行这列的按键被按下。若不是,再将第二列置0,其余三列置1,再检测行是否为0。剩余两列也一样。
配置输入输出
void KeyInit() //按键初始化
{
//00为输入,01为输出
//输入
GPFCON=(GPECON & (~(0x3<<0)));//初始化GPF0为输入
GPFCON=(GPECON & (~(0x3<<4)));//初始化GPF2为输入
GPGCON=(GPGCON & (~(0x3<<6)));//初始化GPG3、GPG11为输入
GPGCON=(GPGCON & (~(0x3<<22)));
//输出
GPECON=(GPECON & (~(0x3<<6)));
GPECON=(GPECON | (0x1<<6));//初始化GPE3为输出
GPECON=(GPECON & (~(0x3<<22)));
GPECON=(GPECON | (0x1<<22));//初始化GPE11为输出
GPGCON=(GPGCON & (~(0x3<<4)));
GPECON=(GPECON | (0x1<<4));//初始化GPG2为输出
GPGCON=(GPGCON & (~(0x3<<12)));
GPECON=(GPECON | (0x1<<12));//初始化GPG6为输出
}
按键扫描
//*
*按键扫描函数
*/
unsigned int KeyNum()
{
//初始化不为0~15就都行
//0000
column(0);
if((GPFDAT & 0X01) == 0)
{
delay_ms(20);//消抖
//0111
column(1);
if((GPFDAT & 0X01) == 0) // key7被按下
{
delay_ms(20);
return Key = SEVEN;
}
else
column(2); //1011
if((GPFDAT & 0X01) == 0) //key8被按下
{
delay_ms(20);
return Key = EIGHT;
}
else
column(3);//1101
if((GPFDAT & 0X01) == 0) //key9 被按下
{
delay_ms(20);
return Key= NINE;
}
else