时钟
方向
下拉
本文使用的是矩阵按键 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;
- }
-
-
- }
-