关于CH452的键盘驱动问题!

小可现在用的是AT89C51/CH452L,驱动键盘,不带显示.问题是我程序下到片子里后,发现DIG0口没有扫描.不知道问题出在哪.请能人指点一下:谢谢! sbit DCLK=P1^5; sbit DIN=P1^4; sbit LOAD=P1^6; sbit DOUT=P3^2; void AT89C51_Init() { DOUT=1; TCON|=0x01;//中断0下降沿触发; //TCON&=0xfe;//中断0低电平触发; //IP|=0x01; CH452_KEY_INT0_ON;//中断0允许; EA=1;//全局中断允许; } /******************************************* ******名称:CH452_Init() ******变量: ******功能:CH452初始化(设定系统参数) ******01000[GPOE][INTM][SSPD][DPLR]0[KEYB][DISP] ****** 0 1 0 0 0 1 0 ******DISP(显示驱动功能的使能):0:关闭显示驱动 1:允许显示驱动 ******KEYB(键盘扫描功能的使能):0:关闭键盘扫描 1:启用键盘扫描 ******DPLR(字驱动DIG 输出极性):0:低电平有效 1:高电平有效 ******SSPD(闪烁速度/频率):0:低速(约1.5Hz) 1:快速(约3Hz) ******INTM(按键中断输出方式):0:低电平有效(电平或边沿中断) 1:低电平脉冲(边沿中断) ******GPOE(通用输出引脚使能--仅DIG6和DIG7引脚):0:用于显示驱动字输出禁止通用输出 ***********************************************1:当扫描极限为1~6 时,多余的DIG6和DIG7引脚用于通用输出,分别由闪烁位D6S和D7S控制 *******************************************/ void CH452_Init() { Uint CH452_SYS_SET=0; CH452_KEY_DIN_CLR; CH452_KEY_DIN_SET; CH452_SYS_SET=(CH452_SYS_COM|CH452_KEY_KEYB_ON|CH452_KEY_INTM_ON);//CH452系统参数设置:开键盘功能\边沿中断 // CH452_SYS_SET=(CH452_SYS_COM|CH452_KEY_KEYB_ON|CH452_KEY_INTM_OFF);//CH452系统参数设置:开键盘功能\低电平中断 // WriteCH452(CH452_RESET); WriteCH452(CH452_SYS_SET); } /******************************************* ******名称:WriteCH452(Uint command) ******变量:Uint command ******功能:向CH452写命令 *******************************************/ void WriteCH452(Uint command) { Uchar i; CH452_KEY_INT0_OFF;//51禁止452产生的中断 CH452_KEY_LOAD_CLR;//LOAD低电平 for(i=0;i<12;i++) { if(command&0x0001)CH452_KEY_DIN_SET; else CH452_KEY_DIN_CLR; //DIN=command&0x0001; CH452_KEY_DCLK_CLR; command>>=1; CH452_KEY_DCLK_SET; } CH452_KEY_LOAD_SET;//LOAD上升沿加载命令 NOP;NOP;NOP;NOP;NOP;NOP; CH452_KEY_INT0_ON;//51允许452产生的中断 } /******************************************* ******名称:Uchar ReadCH452() ******变量: ******功能:从CH452读数据 *******************************************/ Uchar ReadCH452() { Uchar i; Uchar key=0; Uchar read; CH452_KEY_INT0_OFF; read=CH452_R_COM;//读取键盘命令0111 CH452_KEY_LOAD_CLR; for(i=0;i<4;i++) { if(read&0x01)CH452_KEY_DIN_SET; else CH452_KEY_DIN_CLR; //DIN=read&0x01; CH452_KEY_DCLK_CLR; read>>=1; CH452_KEY_DCLK_SET; } CH452_KEY_LOAD_SET;//LOAD上升沿加载命令 for(i=0;i<7;i++) { key<<=1; key|=DOUT; NOP; CH452_KEY_DCLK_CLR; CH452_KEY_DCLK_SET; } //CH452_CLR_INT_FLAG; CH452_KEY_INT0_ON; return(key); } /******************************************* ******名称:INT0_Init() ******变量: ******功能:中断初始化 *******************************************/ void CH452_INT0() interrupt 0 { key_int_flag=1; keyboard=ReadCH452(); } //-----------main----- void main() { DelayMs(100); LcdInit(); AT89C51_Init(); CH452_Init(); DelayMs(100); while(1) { if(key_int_flag) { LcdSendCom(0x01); Display(0,0,5,"北京欢迎您"); key_int_flag=0; } else Display(1,0,4,"没键按下"); DelayMs(10);

} }

这里有一个问题首先要搞清楚,您是怎么知道DIG0上没有扫描信号的?如果是用万用表测肯定是测不出来的,正确的方法是使用示波器测试,方能检测出.不过借此机会我说一下假如您是用示波器检测而发现没有DIG0扫描信号的原因,那就是您对CH452的初始化工作没有做好.键盘的命令没有正常开启. 我们有51单片机的相关例子程序,您可以参考一下,在我们公司的主页中的在线下载中您可以搜索CH452IF.ZIP,或者在本版的置顶帖里面下载.


我再看看!DIG是我用示波器测的.确实没有扫描信号


你的程序我们这边板子上CH452可以正常工作,程序在回复你邮件的附件里面,你看一下。


好,谢谢


帅哥,还是不行啊. 我强调一下:我只用CH452L的键盘驱动功能,不用数码管驱动功能,我显示用的是液晶屏.我用CH452L判断5*4矩阵键盘,我用你给的程序下到片子里后.DIG脚一直是低电平(示波器测的) 24M晶振在速度上没什么影响吧?我只用键盘驱动功能,需要把显示功能也同时一起打开吗? 需要在硬件上外接上拉电阻啥的吗? 硬件上每个DIG脚我接个1K电阻连在键盘上.SEG脚直接连在键盘上.整个电路连接正常.


对,忘了感谢一下你们的热情服务,以后我将积极考虑用你们的片子(首先是我的把问题解决了先)


请确保你的CH452L的H3L2脚是悬空的或接在高电平上的,四线选择正确。 确保DCLK,DOUT,DIN,LOAD脚都连接正确。 如果还有问题的话请把你的电路图发送到我们的邮箱来。


4线问题解决了,现在我又要做一个2线模式的,按照你们给的程序,问题又来了,没中断信号.我用的是片自带的INT0.郁闷!


我们的程序都是调试过可以使用的。 2线方式,确认你的H3L2接在低电平上;ADDR接高电平,工作在地址1;ADDR接低电平,工作在地址0。 确保SDA,SCL,INT#脚都连接正确。 如果还有问题的话请把你的电路图发送到我们的邮箱来。


你新的程序我们这边板子上CH452可以正常工作,程序在回复你邮件的附件里面,你看一下。


帅哥,你是不是没明白我说的意思啊?我只用到CH452的键盘驱动功能,不用显示功能,你给的程序怎么全是显示驱动的啊?我用其他液晶模块.硬件连接没问题,ADDR和H3L2全连在地上,SDA和SCL分别连在AT89C51的P1.4和P1.5上,模拟I2C,INT连在51的INT0上,现在问题是按键按下去后,没什么反映!没中断,没扫描信号!我51用的是24M晶振,12时钟模式.对了CH452的RST通过100欧姆的电阻连在51的 RST上!


搞定了,气死我了,CH452是个坏片子,折腾了我好几天!换个片子好了.真上火! 顺便再问下,CH452L现在有几个版本,通用吗?>?如果对一个版本的程序,对另一个版本还有用吗? 非常感谢你们的支持,说实话.你们是我用过芯片服务质量和态度最好的!鼓励下!


谢谢鼓励。 CH452L有两个版本,V1版和V2版,显示方面有少量特殊点的命令,两个版本效果有点不同。 你的程序只使用按键功能,V1版本和V2版本的程序是通用的。


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