ch452开键盘后,CH452没有中断信号输出
是自己写的程序还是用例子程序,接口方式可选择正确了. 首先要发送开显示和键盘命令,按下键后测下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发送命令 // 返 回 值:无 //-----------------------------------------------------------------/ 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; //定义循环变量 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; //循环 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; //外部中断为下降沿触发 方式; EX1=1; //开外部中断1 IE1=0; EA=1; //开总中断; ch452_init(); while(1) { key_vale= ch452_key; } }
在ch452_init()后要发开启键盘命令 ch452_write( ch452_SYSON2 ) 这样按下键后才能有中断产生
键盘已开启,还是没有中断产生,不知是何原因。 ch452_write( ch452_SYSON2 )
接口方式选择正确吗?那你能不能将原理图发过来看下呢?
最后怎么解决的?