首页 > 其他分享 >V39按键分析

V39按键分析

时间:2022-11-08 11:05:17浏览次数:27  
标签:分析 AD V39 KEY1 key KEY 按键 define


说明

master的电视芯片V39的按键处理分析

不同的按键按下去读到不同的ad值,反过来根据按键值就可以得出是哪个按键。
ad值有一定范围。程序里一般是该值的容忍度,认为只要在容忍度范围内就是这个按键的值。

过程为为检测到按下 开始记录 检测到抬起后,检测记录的按键值是否一样。

探测到按键值后,全局标记g_bKeyDetect会被置位,handler处理函数处理后再清零。这就像生产者和消费者。

按键产生函数有BUG,可能产生串键。看着改吧

具体说明

1. AD值集合

下面代码是按键会触发的AD值集合。

BYTE code tADCKeyLevel[ADC_KEY_CHANNEL_NUM][8] =
{
{KEY1_AD_L0,KEY1_AD_L1,KEY1_AD_L2,KEY1_AD_L3,KEY1_AD_L4,KEY1_AD_L5,KEY1_AD_L6,KEY1_AD_L7},
{KEY2_AD_L0,KEY2_AD_L1,KEY2_AD_L2,KEY2_AD_L3,KEY2_AD_L4,KEY2_AD_L5,KEY2_AD_L6,KEY2_AD_L7},
};

#define KEY1_AD_L0                      0x01
#define KEY1_AD_L1 0x26
#define KEY1_AD_L2 0x4D
#define KEY1_AD_L3 0x74
#define KEY1_AD_L4 0x9B
#define KEY1_AD_L5 0xB9
#define KEY1_AD_L6 0xD8
#define KEY1_AD_L7 0xEF

2. AD值的容忍度

#define KEY_AD_DELTA                    0x05    // tolerance

3. AD值的获取

if (ucAdcLv < (tADCKeyLevel[ucAdcChannel][0] + KEY_AD_DELTA))
return tADCKeyLevel[ucAdcChannel][0];
else if ((tADCKeyLevel[ucAdcChannel][1]-KEY_AD_DELTA) < ucAdcLv && ucAdcLv < (tADCKeyLevel[ucAdcChannel][1]+KEY_AD_DELTA))
return tADCKeyLevel[ucAdcChannel][1];
...

4. 将AD值转换为按键

if(KeyValue<=KEY1_AD_L0)
KeyStatus |= tADCKeyFlag[0][0];
else if(KeyValue<=KEY1_AD_L1)
KeyStatus |= tADCKeyFlag[0][1];
...

按键定义如下

#define ADC_KEY_1_L0_FLAG               KEY_POWER       
#define ADC_KEY_1_L1_FLAG KEY_DOWN
#define ADC_KEY_1_L2_FLAG KEY_UP
#define ADC_KEY_1_L3_FLAG KEY_RIGHT
#define ADC_KEY_1_L4_FLAG KEY_LEFT
#define ADC_KEY_1_L5_FLAG KEY_MENU
#define ADC_KEY_1_L6_FLAG KEY_SOURCE
#define ADC_KEY_1_L7_FLAG KEY_PIP

typedef enum _KeyScanType
{
KEY_NOTHING = 0x00,
KEY_MENU = _BIT0,
KEY_UP = _BIT1,
KEY_DOWN = _BIT2,
KEY_LEFT = _BIT3,
KEY_RIGHT = _BIT4,
KEY_SOURCE = _BIT5,
KEY_PIP = _BIT6,
KEY_POWER = _BIT7,
//KEY_RELOAD_EEPROM = _BIT1 | _BIT2 | _BIT7
} KeyScanType;

5. 按键产生函数

void keyDetectPoll(void)
{
KeyScanType ucStatusBff; // status buffer

if (g_ucKeyCounter == 0) // check counter
{


#if 0// KEY_USE_INTERRUPT
ucStatusBff = IsrKeyScanStatus(); // scan key status
#else
ucStatusBff = keyScanStatus(); // scan key status
#endif
if (ucStatusBff == g_LastKeyStatus) // match last
{
if (g_bKeyDetect) // check key busy
;
else if (g_LastKeyStatus) // check key pressed
{
if (g_KeyCode == g_LastKeyStatus) // check repeat
{
if (g_bKeyCheckRepeat) // need to repeat
{
if (g_bKey1stRepeat)
{
g_ucKeyDebounce++;
if (g_ucKeyDebounce==KEY_DEBOUNCE_REPEAT)
{
g_ucKeyDebounce = 0;
g_bKey1stRepeat = 0;
g_bKeyDetect = 1; // detect key
}
}
else
{
g_bKeyRepeat = 1;
g_ucKeyDebounce++;
if ((!g_bKeypad_FastRepeat && g_ucKeyDebounce==KEY_DEBOUNCE_REPEAT)
|| (g_bKeypad_FastRepeat && g_ucKeyDebounce==KEY_DEBOUNCE_FAST))
{
g_ucKeyDebounce = 0;
g_bKeyDetect = 1; // detect key
}
}
}
}
else // new key pressed
{
g_KeyCode = g_LastKeyStatus;
g_bKeyDetect = 1; // detect key
g_bKeyRepeat = 0;
g_bKey1stRepeat = 1;
g_bKeyCheckRepeat = 0;
g_ucKeyDebounce = 0;
g_bKeypad_FastRepeat = 0;
#if ENABLE_MEDIA
if(ucStatusBff == KEY_MENU)
g_bJPKeyEventFlag = 1;
#endif
}
}
else // no key pressed
{
g_KeyCode = KEY_NOTHING; // reset key code
}
}
else // different
{
g_LastKeyStatus = ucStatusBff; // refresh key status
g_bKeyRepeat = 0;
g_bKey1stRepeat = 1;
g_bKeyCheckRepeat = 0;
g_ucKeyDebounce = 0;
g_bKeypad_FastRepeat = 0;
#if ENABLE_MEDIA
if(ucStatusBff == KEY_MENU)
g_bJPKeyEventFlag =1;
#endif
}
g_ucKeyCounter = KEY_DEBOUNCE_TIME; // next time counter
}
}


标签:分析,AD,V39,KEY1,key,KEY,按键,define
From: https://blog.51cto.com/u_13316945/5832277

相关文章

  • 阿里云E-HPC+i4p大内存实例,加速寻因生物单细胞数据分析效率
    寻因生物是一家专注于单细胞技术的生物科技企业,拥有自主研发的微孔芯片与油包水双技术单细胞捕获平台,致力于通过国产高通量单细胞全链条产品及服务,将单细胞技术普适化应用......
  • TS流分析-packet header
    ts流是由ts包构成的,ts包的长度固定为188或者204,后者是加上校验的长度。对应的官方描述文档为:iso-13818-1.pdf,下载地址:ts数据包的包头占4个字节,其构成如下:/***PacketHe......
  • TS流分析-PES包头实例分析
    下面的字节是从ts文件中读取的一个ts包。并包含有PES头。负载单元开始标志附加区域控制 知道。负载单元开始标志:第二个字节的第二位知道:负载单元开......
  • TS流分析-PES中扩展头部的判断
    根据流类型判断(流类型是PES包头第四字节),扩展头部有三种。0xBC 0XBE  0xBF 0xF0 0xF1 0xF2 0xF8),这类可能又PTS/DTS信息一种是(0xBC  0xBF 0xF......
  • TS流分析-PMT包
    PMT即节目映射表,ProgramMapTable。节目相关表PAT中可能包含多个PMT,PMT中又包含音视频对应的包PID及音视频类型的定义。   0000   47 40 62 38 8......
  • TS流分析-PAT包
    TS流是由ts数据包构成的。ts的数据包如果PID为0,那么该包就是PAT包。下面的数据是从ts流中找到的PAT类型的ts数据包。长度为188字节。有自适应域。自适应域应该就是为......
  • vlc-解码一个RTP数据包函数分析
    函数与解析解码RTP包主要完成的是从RTP包队列中取走一个RTP包,解析是否丢弃,并初始化时间戳,显示时间戳,负载类型,忽略字节等信息,更新包队列信息,并把解析后的该包传递给负载类型......
  • 资源管理应用平台租赁需求分析之北京博奥智源
    1.1.1.本地资源建设深度融合的主要瓶颈在集团层面,针对教学资源建设方面,现可访问资源类型单一,不能为教师备授课提供更多有力支持;在教师研修方面,目前未建教研资源体系,不利于......
  • 【单片机/嵌入式】【梁山派】学习日志09:按键
    一、独立按键1.1独立按键基础知识1.1.1独立按键结构组成独立按键实际上是一个非自锁的轻触开关,有左右两个触点,当按下时左右两个触点闭合,当松开时左右两个触点断开。1.1......
  • LLVM IR与OpenCL分析
    LLVMIR与OpenCL分析参考文献链接https://mp.weixin.qq.com/s/G36IllLOTXXbc4LagbNH9Qhttp://t.zoukankan.com/wujianming-110117-p-14939733.htmlhttps://www.......