这个按键是在视频的一层东西进行控制,也就是所谓的osd,所以算是基于寄存器的开发,控制相对应的地址,需要设定相对于的按键动作,每个按键动作用枚举来设定,枚举的成员表示相对应的地址,当按下某个按键时,按键动作就去实现相应的功能。下面来举个例子:
typedef enum
{
KEY_POWER = BIT0,
KEY_PLUS = BIT2,
KEY_MINUS = BIT3,
KEY_MENU = BIT1,
KEY_EXIT = BIT4,
KEY_SELECT = BIT6,
}KeypadMaskType;
#define BIT0 0x0001
#define BIT1 0x0002
#define BIT2 0x0004
#define BIT3 0x0008
#define BIT4 0x0010
#define BIT5 0x0020
#define BIT6 0x0040
那我们是不是直接像单片机那样直接拉低io口就能实现了呢?很显然不是,既然是通过寄存器就要通过串口去打印或者用相对于的寄存器工具去读,当按键按下时,按键在串口上打印的值或者是寄存器读出的值,假如读出来是0xEC或者是0xEB,这时候就要设定一个按键值的范围,这个范围要在0xEC和0xEB之间,我可以把值设定为0xE0至0xEF,这样子就能够保证按键值在范围内,并且对按键进行反转,最后实现实现功能的控制。如果不能控制就要查找自己所设定的GPIO口是不是自己所有控制的按键口,查找自己的板参即可代码如下
if(temp>=KEYPAD_ADC_A_1_STAR&&temp < KEYPAD_ADC_A_1_END)
{
keypad &= ~KEYPAD_ADC_A_1_KEYVALUE;
printData("KEYPAD_ADC_A_1_KEYVALUE==%d",KEYPAD_ADC_A_1_KEYVALUE);
}
#ifndef KEYPAD_ADC_A_1_STAR
#define KEYPAD_ADC_A_1_STAR 0xE0
#endif
#ifndef KEYPAD_ADC_A_1_END
#define KEYPAD_ADC_A_1_END 0xEF
#endif
#define SAR0_EN BIT0
#define SAR1_EN BIT1
#define SARKEY_EN (SAR0_EN|SAR1_EN)
#define KEYPAD_ADC_A KEYPAD_SAR00
#define KEYPAD_ADC_B KEYPAD_SAR01
osd菜单的开发就想是上位机的开发,有点像QT开发但是又不是,反正遇到什么干就完事了。
有什么问题可以评论区或者私聊我。