我显示正常,键盘不行~想请教下!
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个按键都可以了..怪..而且我禁止中断关了也可以...
呵呵