ch452无法跳到中断

#include // 修改该文件以适应硬件环境/单片机型号等 // CH452常量定义 #include #define uchar unsigned char #define ushort unsigned short #define CH452_I2C_ADDR0 0x40 // CH452的ADDR=0时的地址 #define CH452_I2C_ADDR1 0x60 // CH452的ADDR=1时的地址,默认值 #define CH452_I2C_MASK 0x3E // CH452的2线接口高字节命令掩码 uchar KeyValue; sbit CH452_SDA=P1^7; sbit CH452_SCL=P1^6; sbit CH452_INT=P3^2; const uchar KeyCode[16]={0x40,0x41,0x42,0x43,//0,1,2,3 0x48,0x49,0x4A,0x4B,//4,5,6,7 0x50,0x51,0x52,0x53,//8,9,A,B 0x58,0x59,0x5A,0x5B};//C,D,E,F void CH452_I2c_Start() // 操作起始,两线制方式,SDA用做中断输出,使用以下两个函数 {

// EX0=0; //禁止键盘中断,防止开始时被CH452中断而进入中断服务程序中的START CH452_SDA=1; /*发送起始条件的数据信号*/ CH452_SCL=1; _nop_(); CH452_SDA=0; /*发送起始信号*/ _nop_(); CH452_SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _nop_(); }

void CH452_I2c_Stop() // 操作结束 { CH452_SDA=0; _nop_(); CH452_SCL=1; _nop_(); CH452_SDA=1; /*发送I2C总线结束信号*/ _nop_(); _nop_(); IE0=0; // 清除中断标志,因为通过SDA输出数据所以会误中断 EX0=0; }

void CH452_I2c_WrByte(uchar dat) //写一个字节数据 { unsigned char i; for(i=0;i!=8;i++) // 输出8位数据 { if(dat&0x80) {CH452_SDA=1;} else {CH452_SDA=0;} _nop_(); CH452_SCL=1; dat<<=1; _nop_(); _nop_(); CH452_SCL=0; _nop_(); } CH452_SDA=1; _nop_(); CH452_SCL=1; // 接收应答 _nop_(); _nop_(); CH452_SCL=0; _nop_(); }

unsigned char CH452_I2c_RdByte() //读一个字节数据 { unsigned char dat,i; CH452_SDA=1; dat=0; for(i=0;i!=8;i++) // 输入8位数据 { CH452_SCL=1; _nop_(); _nop_(); dat<<=1; if(CH452_SDA) dat++; // 输入1位 CH452_SCL=0; _nop_(); } CH452_SDA=1; _nop_(); CH452_SCL=1; // 发出无效应答 _nop_(); _nop_(); CH452_SCL=0; _nop_(); return(dat);

} //CH452写命令函数 void CH452_WriteCommand(unsigned int Command) { CH452_I2c_Start(); CH452_I2c_WrByte(((Command>>7)&0x3E)|0x40); CH452_I2c_WrByte(Command); CH452_I2c_Stop(); }

unsigned char CH452_Read() //读取按键 { ushort cmd; uchar keycode; CH452_I2c_Start(); /*启动总线*/ CH452_I2c_WrByte((uchar)(cmd>>7)&CH452_I2C_MASK|0x01|CH452_I2C_ADDR1); keycode=CH452_I2c_RdByte(); /*读取数据*/ CH452_I2c_Stop(); /*结束总线*/ return(keycode); }

void CH452_Init() { uchar KeyValue; IT0=0; //设置下降沿触发 EX0=1; //开中断 EA=1; //总中断 KeyValue=0xFF; //键值初值 CH452_WriteCommand(0x0700); //2线接口ACK CH452_WriteCommand(0x0403);//开显示、键盘 }

void CH452_GetKeyValue()interrupt 0 { uchar i; uchar GetKeyValue=0x00; //键盘代码 CH452_I2c_Start(); CH452_I2c_WrByte(((0x0700>>7)&0x3E)|0x41); GetKeyValue=CH452_Read(); CH452_I2c_Stop(); if(GetKeyValue==0x00) return; //读出键码为0跳过 for(i=0;i<16;i++) { //查找键盘代码对应的键值 if(GetKeyValue==KeyCode[i]) { KeyValue=i; break; } } } void main { CH452_Init(); lcd_init(); if(KeyValue==0x40) { write_lcd(0,0,"0"); }

您的程序会跑飞了的,主程序应该这样写: void main() { CH452_Init(); lcd_init(); while(1) { if(KeyValue==0x40) { write_lcd(0,0,"0"); } } } 或者其他方法也可以.前提是别让程序跑飞了.


哦 谢谢我想问下 我这样程序 能让中断口INT#检测到低电平脉冲吗?


应该可以的.具体的要您自己去检查与跟踪了.


你好 下雨的天 我还想请教下 就是我3跟线的 SDA SCL INT0 我只写了SDA SCL的 时序 没对INT#进行操作 那我按键时是SDA把信息给INT#还是芯片咋么样操作的 我不太明白


INT#是输出的口,当有键盘按下的时候,就会输出低电平,你可以将INT接到单片机的中断口上,如INT0上,当单片机检测到低电平进中断程序后,可以在中断程序中读键盘,也就是从SDA输出键盘值的。


还是进步了中断啊 都调了1个礼拜 有无这样接的SDA SCL INT#3线程序


void CH452_I2c_Stop() // 操作结束 { CH452_SDA=0; _nop_(); CH452_SCL=1; _nop_(); CH452_SDA=1; /*发送I2C总线结束信号*/ _nop_(); _nop_(); IE0=0; // 清除中断标志,因为通过SDA输出数据所以会误中断 // EX0=0;/* 这里你把中断关了,肯定无法进中断,因此屏蔽掉就可以进中断了 */ }


另外,你的程序中多多少少有点小问题,建议您参考一下我们提供的例子程序。在本版置顶的贴子里就有。


嗯 好的 谢谢 !


嗯 好的 谢谢 ! 我试试看


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