CH452A四线方式 数码管不显示,按键没反应

CH452 LOAD DIN DCLK DOUT 和ARM CPU的4个GPIO连接,DOUT 是普通GPIO,不能产生中断,所以我只能用查询方式去读按键的键值。

#define CH452_DCLK GPIO_B2 #define CH452_DIN GPIO_B3 #define CH452_LOAD GPIO_B4 #define CH452_DOUT GPIO_B5

Init() { CH452_Write(0x403); CH452_Write(CH452_BCD); CH452_Write(CH452_DIG7 | 1); CH452_Write(CH452_DIG6 | 2); CH452_Write(CH452_DIG5 | 3); CH452_Write(CH452_DIG4 | 4); CH452_Write(CH452_DIG3 | 5); CH452_Write(CH452_DIG2 | 6); CH452_Write(CH452_DIG1 | 7); CH452_Write(CH452_DIG0 | 8)

}

void CH452_Write(unsigned short cmd) { unsigned char i; SetGpioVal(CH452_LOAD,0); for(i=0;i!=12;i++) { if(cmd & 1) SetGpioVal(CH452_DIN,1); else SetGpioVal(CH452_DIN,0); // 输出位数据 // CH452_DIN=cmd&1; SetGpioVal(CH452_DCLK,0); cmd >>=1; DelayMicroSeconds(DELAY_CLK); SetGpioVal(CH452_DCLK,1); DelayMicroSeconds(DELAY_CLK); } SetGpioVal(CH452_LOAD,1); DelayMicroSeconds(6); }

//************************************************* //输入按键代码子程序,从CH452读取 unsigned char CH452_Read( void ) { unsigned char i; unsigned char cmd,keycode; //定义命令字,和数据存储器 cmd=0x07; //读按键的命令字 SetGpioVal(CH452_LOAD,0); for(i=0;i!=4;i++) { if (cmd & 1) SetGpioVal(CH452_DIN,1); else SetGpioVal(CH452_DIN,0); // 输出位数据 // CH452_DIN=cmd&1; //送入最低位 SetGpioVal(CH452_DCLK,0); cmd>>=1; DelayMicroSeconds(DELAY_CLK); SetGpioVal(CH452_DCLK,1); DelayMicroSeconds(DELAY_CLK); } SetGpioVal(CH452_LOAD,1); keycode=0; for(i=0;i!=7;i++) { keycode<<=1; if(GetGpioVal(CH452_DOUT))) keycode++; SetGpioVal(CH452_DCLK,0); DelayMicroSeconds(DELAY_CLK); SetGpioVal(CH452_DCLK,1); DelayMicroSeconds(DELAY_CLK); } return(keycode); //反回键值 }

主程序通过一个循环不停的去读键值,读到的总是0x7f

请大家帮忙看看为什么数码管不显示,按键读到的也总是0x7f

请确定以下问题: 1.发送的数据是否正确,如:0x0403,用示波器查看,注意,该命令最好在上电后延时几十个毫秒后再发。 2.用示波器检查芯片的任意一个DIG引脚,查看是否有方波输出,如果没有且一直为高,则可推出上面第一条发送的0x0403没有发送成功,检查程序时序。 3.H3L2引脚需接高电平。


小雨的天: 先谢谢你了。 我按照你说的用示波器查看,发出的0x403波形是对的,但是DIG引脚一直为高,也就是说0x403没有发送成功,我检查了一下我的写命令时序,和你们提供的代码比较了一下,没发现有什么问题啊?上电后我延时了100毫秒才发0x403命令。你帮我看看这个写命令时序问题出现在哪里,谢谢了! void CH452_Write(unsigned short cmd) { unsigned char i; //设置LOAD为输出方向 SetGpioFunc(CH452_LOAD,1); //设置DOUT为输入方向 SetGpioFunc(CH452_DOUT,0); //设置DIN为输出方向 SetGpioFunc(CH452_DIN,1); //设置DCLK为输出方向 SetGpioFunc(CH452_DCLK,1); //命令开始,LOAD=0 SetGpioVal(CH452_LOAD,0); for(i=0;i!=12;i++) //送入12位数据,低位在前 { if(cmd & 1) SetGpioVal(CH452_DIN,1);// 输出位数据 1 else SetGpioVal(CH452_DIN,0); // 输出位数据 0 // CH452_DIN=cmd&1; SetGpioVal(CH452_DCLK,0); //设置DCLK为0 cmd >>=1; DelayMicroSeconds(DELAY_CLK);//等待2微秒 SetGpioVal(CH452_DCLK,1); //设置DCLK为1 上升沿有效 DelayMicroSeconds(DELAY_CLK);//等待2微秒 } SetGpioVal(CH452_LOAD,1); //设置LOAD=1 加载数据,LOAD上升沿 DelayMicroSeconds(6); //命令数据加载周期不小于6US,CH451不需要该周期 }


程序没什么问题,注意DCLK每位之间的宽度。满足CH452的时序需要。 另外,用示波器查看DIN DCLK信号,再检查一下数据是否正确。


我已经用示波器检查了DIN DCLK信号,是正确的,还有可能是什么问题呢?


芯片H3L2引脚是怎么接的?示波器怎么看的,多通道同时看的吗?也就是DCLK和DIN需要同时看,然后再换一根探头看LOAD,如果时序没有问题,芯片就会工作了。


按键和显示多可以正常工作了,是做硬件的把复位的电平弄反了。谢谢你的耐心回复


呵呵!不客气。


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