這個(gè)是CH452,M3控制,采用兩線制的,程序初始化之后,用萬用表測試int口是高電平,按下,任何一個(gè)按鍵之后,int口變成低電平,但是,之后就一直是低電平,恢復(fù)不了高電平,讀不出鍵值,請問這是為什么呢?求助!不甚感激! 452部分程序如下: #define uchar unsigned char #define uint unsigned int #define CH452_ADDR 0x60 // CH452的ADDR=1的地址 #define CH452_MASK 0x3E // CH452的2線接口高字節(jié)命令掩碼 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數(shù)據(jù)口輸出 #define KEY_SDA_IN() GPIODirModeSet(GPIO_PORTJ_BASE, KEY_SDA, GPIO_DIR_MODE_IN) //CH452數(shù)據(jù)口輸入 //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(); //數(shù)據(jù)口設(shè)置為輸出 KEY_SDA_H(); delay(10); KEY_SCL_H(); //準(zhǔn)備啟動信號 delay(10); KEY_SDA_L(); //產(chǎn)生啟動信號 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(); //結(jié)束信號 delay(10); KEY_SDA_IN(); delay(10); } //CH452寫函數(shù) void ch452_write_byte(uchar cmd) { uchar i,temp; temp=cmd; KEY_SDA_OUT(); //數(shù)據(jù)口設(shè)置為輸出 // 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(); //接收應(yīng)答 delay(10); KEY_SCL_L(); //低->高->低 delay(10); } uchar ch452_read_byte(void) { uchar i,out,keyw=0; KEY_SDA_H(); KEY_SDA_IN(); //數(shù)據(jù)口設(shè)置為輸出 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(); // 發(fā)出無效應(yīng)答 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(); //結(jié)束總線 } //讀取按鍵 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(); //讀取數(shù)據(jù) ch452_stop(); //結(jié)束總線 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(); //單片機(jī)初始化 write_command(0x402);//只開鍵盤 //show_hzg(0, 30, HZ1,16,0); //show_hzg(1, 30, HZ1,16,16); while(1); //PWM_Contrl(); } // GPIOJ的中斷服務(wù)函數(shù) 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]); }