配置输入
时钟
方向
下拉
本文使用的是矩阵按键 12 13 14 为物理上拉输入,48 49 50为输出;
可以考虑输入AQ滤波;里面没有加;
/** key.c** Created on: 2023年11月19日* Author: peng*/
#include"key.h"
#include"led1.h"
void key_init(void)
{EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK=1;GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;//输入GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;//输入GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;GpioCtrlRegs.GPADIR.bit.GPIO14 = 0;//输入GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0;//输出GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;//GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;//GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1;//GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0;EDIS;GpioDataRegs.GPBSET.bit.GPIO48 = 1;GpioDataRegs.GPBSET.bit.GPIO49 = 1;GpioDataRegs.GPBSET.bit.GPIO50 = 1;
}unsigned char read_row()
{unsigned char temp=0;temp=( GpioDataRegs.GPADAT.bit.GPIO12<<0| GpioDataRegs.GPADAT.bit.GPIO13<<1| GpioDataRegs.GPADAT.bit.GPIO14<<2);return temp;
}
unsigned char read_line()
{unsigned char temp=0;temp= (GpioDataRegs.GPBDAT.bit.GPIO48|((GpioDataRegs.GPBDAT.bit.GPIO49&0x01)<<1)|((GpioDataRegs.GPBDAT.bit.GPIO50&0x01)<<2));return temp;
}void _SCAN_line(char x)
{GpioDataRegs.GPBDAT.bit.GPIO48=~((long)0x01&x);GpioDataRegs.GPBDAT.bit.GPIO49=~(((long)0x02&x)>>1);GpioDataRegs.GPBDAT.bit.GPIO50=~(((long)0x04&x)>>2);
}
char SCAN_row ()
{return GpioDataRegs.GPADAT.bit.GPIO12<<0| GpioDataRegs.GPADAT.bit.GPIO13<<1| GpioDataRegs.GPADAT.bit.GPIO14<<2;
}char key_scan()
{char key = 0;unsigned char i = 0,tt=0x1;unsigned int temp=0;unsigned char p48=0,p49=0,p50=0;tt=~tt;static char key_up_flag = 0,key_breakup=0;for ( i = 0; i < 3; i++){switch (i)//列扫描{case 0: _SCAN_line(1);break;case 1: _SCAN_line(2);break;case 2: _SCAN_line(4);break;default:break;}if ( (temp=(SCAN_row() & 0x07) )!= 0x07 )//被按下{DELAY_US(10000);if ((temp=(SCAN_row() & 0x07)) != 0x07){key_up_flag = 1;switch (temp=( ~temp)&0x07 ){case 1: key = (temp - 1) * 3 + i+1; key_breakup = key;return 0;case 2: key = (temp- 1) * 3 + i+1 ; key_breakup = key;return 0;case 4: key = (temp - 1) * 3 + i+1; key_breakup = key;return 0;default:key = 0;break;}// key_breakup = key;}}else{if (key_up_flag == 1){key_up_flag = 0;return key_breakup;}}}return 0;
}void key_LED()//按键控制LED
{//char key = 0;switch (key_scan()){case 1: LED1_TOGGLE; break;case 2: LED2_TOGGLE; break;case 3: LED3_TOGGLE; break;default: break;}}