请问有没有一个CH452高级技术支持的电话???

我显示正常,键盘不行~想请教下!

1.你说的键盘不行是指哪方面? 没有按键中断吗? 请说详细些. 2.可以直接打公司电话找CH452技术支持工程师


首先我用的是4线模式的~. 我现在如果写0x403的话,一按键,DOUT就变低了,.永远不起来了. 到底是写423还是403啊 ??

我只需要电平变化引起中断就好了.


是0x403 一按键,DOUT就变低说明DOUT输出有效的键盘中断. 这时你要发出读取按键代码命令,当7位按键代码输出完后,DOUT才恢复高电平.


自动恢复吗高吗?? 我的就起不来了...

我发送了读取按键代码指令啊, 时序肯定没问题的,因为我发送没错.读的时候好象什么都没有.!


当按键代码输出完后,读走了键值,CH452就会将DOUT引脚自动恢复为默认的高电平. 你没有读取走键值,那DOUT肯定一直是低的. 你好好检查下读取键值的子程序.


//*-------------------------------------------------------------------------------------- //* 函数名 : CH452_Wirte //* 功能 : 写操作命令到CH452 //* 输入参数 : cmd //* 返回值 : 无 //* 创建人 : 熊宇 2007/4/10 //*--------------------------------------------------------------------------------------

void CH452_Wirte(unsigned int cmd) { unsigned char i;

AT91F_AIC_DisableIt( AT91C_BASE_AIC , AT91C_ID_PIOA ); //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输

AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , LOAD ); //命令开始,LOAD=0

for( i=0; i<12; i++ ) //送入12位数据,低位在前 { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DCLK ) ;

if( cmd & 0x01 ) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DIN ) ; } else { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DIN ) ; } // 输出位数据

cmd>>=1;

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DCLK ) ; }

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , LOAD ); //加载数据,LOAD上升沿

AT91F_AIC_EnableIt( AT91C_BASE_AIC , AT91C_ID_PIOA ); }

//*-------------------------------------------------------------------------------------- //* 函数名 : CH452_Read //* 功能 : 读键盘编码 //* 输入参数 : 无 //* 返回值 : keycode //* 创建人 : 熊宇 2007/4/10 //*--------------------------------------------------------------------------------------

unsigned char CH452_Read( void ) { unsigned char i; unsigned char cmd,keycode; //定义命令字,和数据存储器 keycode=0x00; //清除keycode

AT91F_AIC_DisableIt( AT91C_BASE_AIC , AT91C_ID_PIOA ); //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输

cmd = 0x07; //读按键的命令字

AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , LOAD ); for( i=0; i<4; i++ ) // 只需要发出高4位 { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DCLK ) ;

if( cmd & 0x01 ) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DIN ) ; } else { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DIN ) ; } // 输出位数据 cmd>>=1; //往右移一位

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DCLK ) ; //产生时钟上升沿锁通知CH451输入位数据 }

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , LOAD ); //产生加载上升沿通知CH451处理命令数据

for( i=0; i<7; i++ ) { //Delay(10); keycode<<=1; //数据移入keycode,高位在前,低位在后

if( AT91F_PIO_IsInputSet( AT91C_BASE_PIOA , DOUT ) == 1 ) { keycode++; }

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DCLK );

AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DCLK ); }

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DCLK );

AT91F_AIC_EnableIt( AT91C_BASE_AIC , AT91C_ID_PIOA );

return(keycode); //反回键值

2个函数大侠请过目.. 第1个发送的百分之百是对的.因为显示正常的. 第2个我看了也没错啊,我的操作速度不快的.时序应该都满足.

现在我又出现不断进中断的现象了.有的时候又进不了,我怀疑是一些干扰的问题.


谢谢您的多次回复~~ 请再帮我看看下面那个读键值的程序..

如果这个是对的,那就是硬件方面的问题了..


读键值的程序有点问题,按下面这个试下. 还有硬件上你要看下数码管有没有漏电, 你用示波器看下DIN,DCLK,LOAD几跟信号线输出的波形可正常.要是有干扰,要检查下电源线和地线的布线好不好.

unsigned char CH452_Read( void ) { unsigned char i; unsigned char cmd,keycode; //定义命令字,和数据存储器 keycode=0x00; //清除keycode

AT91F_AIC_DisableIt( AT91C_BASE_AIC , AT91C_ID_PIOA ); //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输

cmd = 0x07; //读按键的命令字

AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , LOAD ); for( i=0; i<4; i++ ) // 只需要发出高4位 { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DCLK )

if( cmd & 0x01 ) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DIN ) } else { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DIN ) } // 输出位数据

cmd>>=1; //往右移一位

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DCLK ) //产生时钟上升沿锁通知CH451输入位数据 }

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , LOAD ); //产生加载上升沿通知CH451处理命令数据

for( i=0; i<7; i++ ) { //Delay(10); keycode<<=1; //数据移入keycode,高位在前,低位在后

keycode|=AT91F_PIO_IsInputSet( AT91C_BASE_PIOA , DOUT );/****从高到低读入452的数据即(keycode|=CH452_DOUT) ****/ AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DCLK );//产生时钟下升沿通知CH452输出下一位 AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DCLK );

}

AT91F_AIC_EnableIt( AT91C_BASE_AIC , AT91C_ID_PIOA );

return(keycode); //反回键值

}


辛苦啦~

2个代码实际是一样的吧?? 您觉得是我那个有些什么问题呢 我改了还是不行的

DIN,DCLK,LOAD的波形,无论角度看都很正常,就是DOUT不对.. 我是飞的线,特别乱,刚加了给每个数码管com加了2极管,又给DOUT加了上拉电阻.还是不行.

我一上电DOUT上面就有一些3角波..乱乱的..


那DOUT的信号线上有干扰啊!仔细查查哪里产生干扰了.你可以先看连接这跟信号线的单片机I/O口出来的信号可正常.正常后将其和I/O口直接相连,再看下波形.


谢谢...星期6按键可以了.

for( i=0; i<7; i++ ) { //Delay(10); keycode<<=1; //数据移入keycode,高位在前,低位在后

keycode|=AT91F_PIO_IsInputSet( AT91C_BASE_PIOA , DOUT ); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , DCLK

Delay(15); //加了20us左右的延时

AT91F_PIO_SetOutput( AT91C_BASE_PIOA , DCLK );

}

Dout的波形不是很好捕捉.要按键才有,看不清.而且看上去也不是规则的波形.. 但是4个按键都可以了..怪..而且我禁止中断关了也可以...


呵呵


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