为什么452不扫描?

用贵公司的CH452芯片与三星的44B0(arm7)连接扩展键盘。

连接方式如下: 使用两线SDA、SCL 加 INT方式接一个8*8的键盘。 SDA、SCL接至44B0的两个通用IO,INT接至44b0的一个外部中断1输入。 DIG0~DIG3串接2K电阻接键盘扫描输出,SEG0~SEG3串接200电阻接键盘的 扫描输入。

用贵公司网站上的程序,运行后,CH452不工作,按下键盘后INT不产生低电平。 DIG0~DIG3上始终是高电平,没有输出键盘扫描输出。不知是什么问题,请求帮助!!!

程序如下: void Main(void) { port_init(); interrupt_INIT(); CH452_Write(CH452_RESET); Delay_1us(100); CH452_Write(CH452_SYSON2); Delay_1us(100); while(1) { CH452_Write(CH452_SLEEP); Delay_1us(50); } }

怎样才知道452工作了呢?

盼回复,谢谢!!

问题和fpzxx兄一样啊,请指教


唉,我改成四线的,也是不行,读不到DOUT口的数据,怎么都是高呢


有示波器就看看单片机输出的I/O的波形,或者检查程序中设计I/O方向的程序,还有,不要一直发SLEEP命令


小二兄,I/O口波形DIN、DCLK、LOAD都很好,现在我能测到扫描,但是不知道为什么DOUT一运行,还没按键就有 信号,而且是正负3.3V,直接进了中断


4线接口类似于SPI,如果未启用键盘,那么DOUT是移位输出,当然有信号,如果已启用键盘,那么DOUT有输出则说明实际检测到有按键按下(例如SEG与DIG之间的数码管漏电等)


1、未启用键盘时,DOUT输出恒为“1” 2、启用键盘后,在没有连接LED的情况下,还没按键,DOUT就有信号,而且示波器测量为正负3V 下面是我的程序:请指教 void Delay_1us(int time) { int i,j; for(i=0;i<400;i++) { for(j=0;j } }

void port_init(void) { rPCONG = 0xffff; rPUPG = 0x0; rPCONC = 0x55555555; rPUPC = 0x0; rPDATC = 0x0; rPCONF = 0x92555; rPDATF = 0x0; rPUPF = 0x0; //should be enabled /*所有的外部硬件中断为低电平触发*/ rEXTINT=0x0;

}

void CH452_Write(UINT16 cmd) { UINT8 i; CH452_LOAD_CLR; //命令开始,LOAD=0 // Delay_1us(3); for(i=0;i!=12;i++) //送入12位数据,低位在前 { if (cmd&1) {CH452_DIN_SET;} else {CH452_DIN_CLR;} // 输出位数据 Delay_1us(50); CH452_DCLK_CLR; cmd>>=1; Delay_1us(50); CH452_DCLK_SET; Delay_1us(50); } CH452_LOAD_SET; //加载数据,LOAD上升沿 Delay_1us(100); }

//************************************************* //输入命令子程序,MCU从CH452读一字节 UINT8 CH452_Read(void) { UINT8 i,keycode=0; UINT8 cmd; //定义命令字,和数据存储器

cmd=0x07; //输入读451命令字 CH452_LOAD_CLR; for(i=0;i!=4;i++) { if (cmd&1) {CH452_DIN_SET;} else {CH452_DIN_CLR;} // 输出位数据 Delay_1us(50); // CH452_DIN=cmd&1; //送入最低位 CH452_DCLK_CLR; cmd>>=1; //往右移一位 Delay_1us(50); CH452_DCLK_SET; //产生时钟上升沿锁通知CH451输入位数据 Delay_1us(50); } CH452_LOAD_SET; //产生加载上升沿通知CH451处理命令数据 Delay_1us(50); CH452_SDA_init; Delay_1us(50); for(i=0;i!=7;i++) { CH452_DCLK_CLR; //产生时钟下升沿通知CH451输出下一位 Delay_1us(100); keycode<<=1; //数据移入keycode,高位在前,低位在后 if(CH452_DOUT) keycode|=0x1; //从高到低读入451的数据 Delay_1us(100); CH452_DCLK_CLR; //产生时钟下升沿通知CH451输出下一位 Delay_1us(100); CH452_DCLK_SET; Delay_1us(100); } rINTPND = 0x00000000; /* 清除所有未决的中断*/ rI_ISPC = 0x03FFFFFF;

return(keycode); //反回键值 } UINT8 CH452_get_key(void) { UINT8 keynum=0; UINT16 key=0; rINTPND = 0x00000000; /* 清除所有未决的中断*/ rI_ISPC = 0x03FFFFFF; rPCONG = 0xfff3; keynum=CH452_Read(); Delay_1us(50); key=(keynum&0x38)*8+(keynum&0x7); return(keynum); } void Main(void) { UINT8 nkey=0; UINT16 key; port_init(); CH452_Write(CH452_RESET); Delay_1us(100); CH452_Write(CH452_SYSON2); Delay_1us(50); interrupt_INIT(); Delay_1us(50); while(1) { nkey=CH452_get_key(); Delay_1us(50); } }


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