目前我只用CH455H做为3X5 的键盘扫描 启动键盘扫描后 键按下的中断信号为低后一直保持为低或者隔很长一段时间才被拉高 有时候又是很快就高了 反正感觉就是很不稳定 这是为什么呢 键值读出来的都是乱的 求助各位前辈帮忙解决一下这个问题 MCU是STM32F103 但是不用中断 直接读一次键值都是对的 但是循环去读又出乱了
/********************************************************************* * INCLUDES */ #include "CH455.H"
/********************************************************************* * FUNCTIONS */ void CH455_Init( void ) { CH455_MCU_IO_INIT();
CH455_IO_SDA_TG_OUTPUT(); CH455_IO_SDA_SET_HI(); CH455_IO_SCL_SET_HI(); }
static void CH455_BusStart( void ) { CH455_IO_SDA_TG_OUTPUT(); CH455_IO_SDA_SET_HI(); CH455_IO_SCL_SET_HI(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SDA_SET_LO(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SCL_SET_LO(); }
static void CH455_BusStop( void ) { CH455_IO_SDA_TG_OUTPUT(); CH455_IO_SDA_SET_LO(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SCL_SET_HI(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SDA_SET_HI(); }
static void CH455_WriteByte( unsigned char wByte ) { unsigned char i = 0;
CH455_IO_SDA_TG_OUTPUT(); for ( i = 0x80; i >= 0x01; i >>= 1 ) { if ( i & wByte ) CH455_IO_SDA_SET_HI(); else CH455_IO_SDA_SET_LO(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SCL_SET_HI(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SCL_SET_LO(); } //Recieve ACK CH455_IO_SDA_SET_HI(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SCL_SET_HI(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SCL_SET_LO(); }
void CH455_Write( unsigned char byte1, unsigned char byte2 ) { CH455_BusStart(); CH455_WriteByte( byte1 );
CH455_WriteByte( byte2 );
CH455_BusStop(); }
void CH455_Read( unsigned char wByte, unsigned char *rByte ) { unsigned char i = 0, readByte = 0;
CH455_BusStart();
CH455_WriteByte( wByte );
CH455_IO_SDA_TG_INPUT();
for ( i = 0x80; i >= 0x01; i >>= 1 ) { CH455_IO_MCU_WAIT_NS(100); CH455_IO_SCL_SET_HI(); CH455_IO_MCU_WAIT_NS(100); CH455_IO_SCL_SET_LO(); if ( CH455_IO_SDA_GET() ) readByte |= i; } CH455_BusStop();
*rByte = readByte; }
所谓的循环读取键值数据错误是键值读取出来和前一次不一样还是其他的问题。你能否拿示波器看下波形。我需要看下你发出去的数据是否正确。