74HC165按键扫描

贴上百度百科74HC165的基本信息

 

 

 我们的方案是采用两个165芯片级联,读取16个按键信息

 

 

 

 

 

 

 1 UINT8 HAL_Btn_Read74HCT165(void)
 2 {
 3     UINT8 i;
 4     UINT16 ret=0; 
 6     KEY_SE_CLR;         
 8     KEY_SE_SET;    
10     ret |= KEY_QH_READ;    
12     for(i=0; i<15; i++)  
13     {        
14         ret <<= 1;      
16         KEY_CLK_SET;   
18         CD74HC165_Delay();
20         KEY_CLK_CLR;
22         ret |= KEY_QH_READ;       
23     }         
25     return ret;         
26 }

 

 ==================================================================================================================

优化下165的驱动

 1 UINT32 BtnRead74HCT165(void)
 2 {
 3     UINT8 i;
 4     UINT32 ret=0;
 5     
 6     KEY_SE_CLR;    //PL拉低,读取按键状态    
 7     delay_us(DELAY_TIME);      
 8     KEY_SE_SET; //PL拉高,停止按键读取
 9     
10     ret |= KEY_QH_READ; //读取最高位
11 
12     //bit9-24 按键,Bit1-8 触摸旋钮
13     for ( i = 0; i < FKEY_SCAN_DATA_WIDTH-1; i++ )
14     {
15         ret <<= 1;
16 
17         KEY_CLK_SET;            //HC165_CLK = 0 ——> HC165_CLK = 1 产生上升沿,次高位D(n-1)移到高位D(n)
18         delay_us(DELAY_TIME);   
19         KEY_CLK_CLR;            
20 
21         ret |= KEY_QH_READ;     //读取数据
22         delay_us(DELAY_TIME); 
23     }
24 
25     // ret = ret>>1;
26     g_BtnScanDataBuf[BTN_SCAN_ROW_LINE_NUM+2] = ret&0xFF;
27     g_BtnScanDataBuf[BTN_SCAN_ROW_LINE_NUM+1] = (ret>>8)&0xFF;
28     g_BtnScanDataBuf[BTN_SCAN_ROW_LINE_NUM+0] = (ret>>16)&0xFF;
29 
30     return ret;
31 }

每个IO的操作都添加延时,让其产生的波形稳定可靠,这样再开启优化至 -O fast + LTO就完全没问题了

 

 

 

参考:

1.http://www.elecfans.com/yuanqijian/yinjiaotu/20180202628718_2.html

2.https://blog.csdn.net/k1ang/article/details/87898554

posted @ 2021-12-23 16:37  xjxcxjx  阅读(1374)  评论(0)    收藏  举报