ch452開鍵盤后,CH452沒有中斷信號輸出

ch452開鍵盤后,CH452沒有中斷信號輸出

是自己寫的程序還是用例子程序,接口方式可選擇正確了. 首先要發(fā)送開顯示和鍵盤命令,按下鍵后測下DOUT( 四線方式)或INT#(兩線方式)有沒有拉低),檢查下硬件,看有沒有別的信號將中斷腳拉高.


程序在例程基礎上改出的如下接口為4線 #include #include

#define NOP _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); #define ch452_SYSOFF 0x0400 //關顯示、鍵盤、看門狗 #define ch452_SYSON1 0x0401 //開顯示 #define ch452_SYSON2 0x0403 //開顯示、鍵盤 #define ch452_SYSON3 0x0407 //開顯示、鍵盤、看門狗功能 #define ch452_SYSON4 0x0402 //開鍵盤功能 #define ch452_SYSON5 0x0201 //復位ch452 #define CM_KEY 0x07 // 讀鍵值命令 //#define H3L2 1 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long

sbit led =P0^3;

sbit ch452_dclk=P1^2; //串行數據時鐘上升延激活 sbit ch452_din=P1^1; // 串行數據輸出,接ch452的數據輸入 sbit ch452_load=P1^0; //串行命令加載,上升延激活 sbit ch452_dout=P3^2; //INT0,鍵盤中斷和鍵值數據輸入,接ch452的數據輸出 uchar ch452_key; // 存放鍵盤中斷中讀取的鍵值 uchar key_vale; uchar read_key(); //#ifdef H3L2 void Delay() { uchar i; for(i=0;i<200;i++) NOP

} //四線接口 //-----------------------------------------------------------------/ // 函 數 名:void ch452_write(unsigned int command) // 參 數: command ch452命令 // 功能描述: 向ch452發(fā)送命令 // 返 回 值:無 //-----------------------------------------------------------------/ void ch452_write(unsigned int command)using 3 { unsigned char i; EX1=0; //禁止鍵盤中斷 ch452_load=0; NOP ch452_dout=1; NOP //命令開始 for(i=0;i<12;i++) { NOP //送入12位數據,低位在前 ch452_din=command&1; NOP ch452_dclk=0; NOP command>>=1; NOP ch452_dclk=1; //上升沿有效 } NOP ch452_load=1; //加載數據 NOP NOP NOP NOP NOP NOP NOP NOP NOP EX1=1; }

//-----------------------------------------------------------------/ // 函 數 名:void ch452_init() // 參 數: 無 // 功能描述: 初始化ch452子程序 // 返 回 值:無 //-----------------------------------------------------------------/ void ch452_init() { uchar i; led =0; ch452_din=0; NOP ch452_dclk=1; NOP ch452_din=1; NOP ch452_load=1; NOP ch452_dout=1; NOP NOP NOP NOP ch452_write(CM_KEY); // i=read_key(); //ch452_write(ch452_SYSON4); } //-----------------------------------------------------------------/ // 函 數 名:uchar read_key()using 3 // 參 數: 無 // 功能描述: 讀鍵值子函數 // 返 回 值:keycode 鍵值 //-----------------------------------------------------------------/ uchar read_key()using 3 { uchar i; //定義循環(huán)變量 uchar command,keycode; //定義控制字寄存器,和中間變量定時器 EX1=0; command=0x07; //讀取鍵值命令的高4位0111B ch452_load=0; //命令開始 for(i=0;i<4;i++) { ch452_din=command&1; //低位在前,高位在后 ch452_dclk=0; command>>=1; //右移一位 ch452_dclk=1; //產生時鐘上升沿鎖通知ch452輸入位數據 } ch452_load=1; //產生加載上升沿通知ch452處理命令數據 keycode=0; //清除keycode for(i=0;i<7;i++) { keycode<<=1; //數據作移一位,高位在前,低位在后 keycode|=ch452_dout; //從高到低讀入451的數據 ch452_dclk=0; //產生時鐘下升沿通知ch452輸出下一位 ch452_dclk=1; } EX1=1; return keycode; } /*================================================================ * 函 數 名:void int_ch452(void) interrupt 0 using 3 * 參 數: 無 * 功能描述: 7289中斷響應程序 * 返 回 值:無 ================================================================*/ void int_ch452(void) interrupt 2 using 3 { unsigned char ch452_key; led =1; IE0=0; ch452_write(CM_KEY); ch452_key=read_key(); switch(ch452_key) { case 4: key_vale=0; //真空 break; case 12: key_vale=1; //儲油 break; case 20: key_vale=2; //循環(huán) break; case 28: key_vale=3; //補油 break; case 5: key_vale=4; //排空 break; case 13: key_vale=5; //放油 break; case 21: key_vale=6; //加熱 break; case 29: key_vale=7; //設置 break; case 6: key_vale=8; //左移 break; case 14: key_vale=9; //上移 break; case 22: key_vale=10; //右移 break; case 30: key_vale=11; //確認 break; case 7: key_vale=12; //退出 break; case 15: key_vale=13; //下移 break; case 23: key_vale=14; //空 case 31: key_vale=15; break; //停止 default: key_vale=0xff; break; } } main() { Delay(); IT1=1; //外部中斷為下降沿觸發(fā) 方式; EX1=1; //開外部中斷1 IE1=0; EA=1; //開總中斷; ch452_init(); while(1) { key_vale= ch452_key; } }


在ch452_init()后要發(fā)開啟鍵盤命令 ch452_write( ch452_SYSON2 ) 這樣按下鍵后才能有中斷產生


鍵盤已開啟,還是沒有中斷產生,不知是何原因。 ch452_write( ch452_SYSON2 )


接口方式選擇正確嗎?那你能不能將原理圖發(fā)過來看下呢?


最后怎么解決的?


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频