STM32 4*4矩阵键盘程序

2019-08-16 19:08发布

u8 check_Key(void) {     u16 cord_h,cord_l;//行列值中间变量  高位为行 ,低位为列; u8 Val = 0xFF; //i=(GPIOG->ODR)&0xFFFF; GPIOG->CRL=0x33888844;  GPIOG->CRH=0x44444433;      Delay_1us(); GPIOG->ODR = 0xFC3F;            //行线输出全为0  //1111 1100 0011 1111 Delay_1us(); cord_h = GPIOG->IDR & 0x003C;     //读入列线值   //0000 0000 0011 1100 if(cord_h != 0x003C)    //先检测有无按键按下     //1111 1100 0011 1111 { Delay_Nms(100);        //去抖 if(cord_h != 0x003C)  // 0000 0000 0000 0000 //1111 1100 0011 1111 {                                               cord_h = GPIOG->IDR&0x003C;  //读入列线值// GPIOG->CRL=0x88333344;   GPIOG->CRH=0x44444488;   Delay_1us(); GPIOG->ODR = cord_h|0xFFC3;  //输出当前列线值1111 1111 1100 0011 Delay_Nms(2);// 此延时比不可少; cord_l = GPIOG->IDR&0x03C0;  //读入行线值    0000 0011 1100 0000 Delay_1us(); cord_h>>=2; cord_l>>=2; Val = (cord_h+cord_l)&0xff; return Val;                  //键盘最后组合码值  } } return 0xFF;     //返回该值
}

本人一行行写出来的.适用于寄存器写和库版本写都可以用,反转法循环扫描;由于本人接的是GPIOG PIN2 - PIN 9 所以字节都是左移了两位的 后面移回来了. 输出的时候要 推挽输出 输入的时候要上拉输入;如果直接从pin0-pin7 那就更容易了.
键盘直接接的IO口 没其他外拉了.







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
maninman1981
1楼-- · 2019-08-16 22:40
回复【楼主位】a4615800:
---------------------------------
你的设计如果有多个按键同时按下,会不会有输出短路的情况。
郭震2009
2楼-- · 2019-08-17 02:11
延时消抖以后 还要再读一下吧..  要不消抖也没意义了..
郭震2009
3楼-- · 2019-08-17 02:39
 精彩回答 2  元偷偷看……
bjtmh
4楼-- · 2019-08-17 05:12
如果IO不是连续的,比如用的pb2-pb6,pG12-PG14,怎么处理?
黄伟达
5楼-- · 2019-08-17 08:45
写按键程序,延时我觉得一点不好,最好是定时器定时去扫描
a18270826679
6楼-- · 2019-08-17 12:58
你这个程序第三行没有用?  按键没反映  还是按键松没做检测

一周热门 更多>