这个是CH452,M3控制,采用两线制的,程序初始化之后,用万用表测试int口是高电平,按下,任何一个按键之后,int口变成低电平,但是,之后就一直是低电平,恢复不了高电平,读不出键值,请问这是为什么呢?求助!不甚感激! 452部分程序如下: #define uchar unsigned char #define uint unsigned int #define CH452_ADDR 0x60 // CH452的ADDR=1的地址 #define CH452_MASK 0x3E // CH452的2线接口高字节命令掩码 uchar a[3];
#define KEY_SCL GPIO_PIN_3 #define KEY_SDA GPIO_PIN_4 #define KEY_INT GPIO_PIN_5 #define KEY_SCL_H() GPIOPinWrite(GPIO_PORTJ_BASE, KEY_SCL, KEY_SCL) /* KEY_SCL=1 */ #define KEY_SCL_L() GPIOPinWrite(GPIO_PORTJ_BASE, KEY_SCL, ~KEY_SCL) /* KEY_SCL=0 */ #define KEY_SDA_H() GPIOPinWrite(GPIO_PORTJ_BASE, KEY_SDA, KEY_SDA) /* KEY_SDA=1 */ #define KEY_SDA_L() GPIOPinWrite(GPIO_PORTJ_BASE, KEY_SDA, ~KEY_SDA) /* KEY_SDA=0 */ #define KEY_SDA_OUT() GPIODirModeSet(GPIO_PORTJ_BASE, KEY_SDA, GPIO_DIR_MODE_OUT) //CH452数据口输出 #define KEY_SDA_IN() GPIODirModeSet(GPIO_PORTJ_BASE, KEY_SDA, GPIO_DIR_MODE_IN) //CH452数据口输入 //MCU初始化 void MCU_Init() { //CH452控制口 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ); GPIOPadConfigSet(GPIO_PORTJ_BASE, KEY_SCL | KEY_SDA | KEY_INT,GPIO_STRENGTH_4MA,GPIO_PIN_TYPE_STD); GPIODirModeSet(GPIO_PORTJ_BASE, KEY_SCL, GPIO_DIR_MODE_OUT); GPIODirModeSet(GPIO_PORTJ_BASE, KEY_INT, GPIO_DIR_MODE_IN);
} //起始信号 void ch452_start(void) { KEY_SDA_OUT(); //数据口设置为输出 KEY_SDA_H(); delay(10); KEY_SCL_H(); //准备启动信号 delay(10); KEY_SDA_L(); //产生启动信号 delay(10); KEY_SCL_L(); //启动完成 delay(10); } //停止信号 void ch452_stop(void) { KEY_SDA_L(); KEY_SDA_OUT(); delay(10); KEY_SCL_H(); delay(10); KEY_SDA_H(); //结束信号 delay(10); KEY_SDA_IN(); delay(10); } //CH452写函数 void ch452_write_byte(uchar cmd) { uchar i,temp; temp=cmd; KEY_SDA_OUT(); //数据口设置为输出 // KEY_SCL_L(); delay(10); for(i=0;i<8;i++) //两线制,先高位后低 { //KEY_SCL_L(); //低->高->低 if(temp&0x80) KEY_SDA_H(); else KEY_SDA_L(); delay(10);
KEY_SCL_H(); delay(10); temp=temp<<1; KEY_SCL_L(); delay(10); } KEY_SDA_IN(); KEY_SDA_H(); delay(10); KEY_SCL_H(); //接收应答 delay(10); KEY_SCL_L(); //低->高->低 delay(10); } uchar ch452_read_byte(void) { uchar i,out,keyw=0; KEY_SDA_H(); KEY_SDA_IN(); //数据口设置为输出 for(i=0;i<8;i++) { keyw=keyw<<1; KEY_SCL_H(); delay(10); out=GPIOPinRead(GPIO_PORTJ_BASE,KEY_SDA); if(out) keyw =keyw | 0x01; KEY_SCL_L(); delay(10); } KEY_SDA_H(); // KEY_SDA_OUT();
KEY_SCL_H(); // 发出无效应答 delay(10); KEY_SCL_L(); delay(10); return keyw; } //写16位命令 void write_command(int command) { ch452_start(); //启动总线 ch452_write_byte((uchar)(command>>7)&CH452_MASK|CH452_ADDR); ch452_write_byte((uchar)command); //写低位 ch452_stop(); //结束总线 } //读取按键 uchar read_command(int read_cmd) { uchar value; ch452_start(); //启动总线 ch452_write_byte(read_cmd); //写高位 ch452_write_byte((uchar)(read_cmd>>7)&CH452_MASK|CH452_ADDR|0x01); value=ch452_read_byte(); //读取数据 ch452_stop(); //结束总线 return value; } void ch452int_init() { GPIOIntTypeSet(GPIO_PORTJ_BASE, KEY_INT, GPIO_LOW_LEVEL); // 低电平 GPIOPinIntEnable(GPIO_PORTJ_BASE, KEY_INT); // 使能中断所在管脚的中断 IntEnable(INT_GPIOJ); // 使能GPIOJ端口中断 IntMasterEnable(); // 使能处理器中断
} int main() { MCU_Init(); //单片机初始化 write_command(0x402);//只开键盘 //show_hzg(0, 30, HZ1,16,0); //show_hzg(1, 30, HZ1,16,16); while(1); //PWM_Contrl(); } // GPIOJ的中断服务函数 void GPIO_Port_J_ISR(void) { uchar key_val; key_val=read_command(0x0700)&0x3f; //a[0]=key_val/16; //a[1]=key_val-a[0]*16; //show_hzg(2, 30, HZ1,16,a[0]); //show_hzg(3, 30, HZ1,16,a[1]); }