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
本文来自博客园,作者:xjxcxjx,转载请注明原文链接:https://www.cnblogs.com/xjxcxjx/p/15724169.html,谢绝CSDN转载!
浙公网安备 33010602011771号