CH452键盘驱动,液晶显示,按下按键后,进入中断,之后,中断口一直保持低电平

这个是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]); }

这是参考你们的例程写的,另外再请教下,ch452_write_byte((uchar)(read_cmd>>7)&CH452_MASK|CH452_ADDR|0x01);这一句)&CH452_MASK|CH452_ADDR|0x01具体是什么意思哦?看不太懂,能解释下吗?谢谢啦!


ch452int_init();不好意思,在主程序里有这句的,复制到这边来,忘记复制了


你拿这个例子程序去测试。这个是我司测试通过的STM32操作CH452的程序: UploadImages/2012499333334.rar


谢谢,可是东西呢?在哪儿?


后来发现,我在进入中断后没有清除中断标志位,不过,改过来后,依然是那个现象,没有解决问题


已经通过邮件给你发了一份STM32操作CH452的程序了。


恩,谢谢,我看看,再请问一下,ch452_write_byte((uchar)(read_cmd>>7)&CH452_MASK|CH452_ADDR|0x01);这一句)&CH452_MASK|CH452_ADDR|0x01具体是什么意思哦?我不用数码管显示是不是&CH452_MASK这一段可以不要?还有为什么读函数要按位或一个1?还有,因为只有键盘显示,初始化的时候,只要write_command(0x402);//只开键盘 这一句就可以了?你们的服务真的挺好的,力顶!


那开显示以及开键盘的命令来说。如果是2线接口的话,ADDR = 1 那么发下去的数据就是0X6403,那个语句就含义就是这样的。


哥哥,你那还有CH452两线接口的按键程序吗?我现在刚开始学习AVR,求助!


你要的程序在前面的CH4XX系列和技术手册的帖子里有,可以去看看下载更多的资料 两线接口操作CH452动态驱动数码管(C-AVR) UploadImages/2008101410462948.rar


只有登录才能回复,可以选择微信账号登录