打印

紧急咨询一个HD7279和ARM7的问题,困扰一个周了

[复制链接]
2447|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
宏典|  楼主 | 2007-11-5 23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
正在调试一个板子。

一、硬件连接如下:
1)CPU是ATMEL的ARM7S系列,3.3V供电。
2)键盘接口芯片是HD7279,5V供电。
3) HD7279的SDATA,CLK、CS#(用10K上拉到5V)、KEY#(检测有无按键)与ARM的通用I/O相连。并且在靠近HD7279的位置分别使用2.2K电阻把SDATA和CLK上拉到5V.

二、目前可以通过I/O准确地检测出有无按键。但是无法读取按键代码。在HD7279的示例代码中,读取键盘代码前,先把SDATA设置成高电平。
    在调试中,出现这种情况: 
    1)按照示例程序的做法,把SDATA设成高电平,然后读取8位键盘值,每次读取的总是0xFF。示波器观察,HD7279输出逻辑正确,电平也正确(高:5V,低:0V)。
    2)如果在读取前把SDATA设成低电平,然后读取8位键盘值,每次读取的总是0x00.用示波器观察,HD7279输出逻辑正确,但是SDATA输出的高电平只有1.8V左右。

请朋友指点!
先谢谢了!

相关帖子

沙发
阿南| | 2007-11-6 19:52 | 只看该作者

没用过HD7279,帮您顶下,希望用过的朋友帮助下

使用特权

评论回复
板凳
decoder8| | 2007-11-6 23:03 | 只看该作者

你接一个LED,写入0xbf,看写入命令字是否正确!

HD7279的键值不能锁存,只有按下键时才可以读出正确键值,无按键时读出的是0xff.

使用特权

评论回复
地板
LPcfANS| | 2007-11-7 08:45 | 只看该作者

换ZLG7289.可工作在3.3V

我用HD7279是用5V的芯片...

使用特权

评论回复
5
LPcfANS| | 2007-11-7 08:48 | 只看该作者

程序如下:

//HD7279键盘相关
sbit HDKey=P4^3;
sbit HDCS = P4^2;
sbit HDData= P4^1;
sbit HDClk = P4^0;

/*=======================HD7279开始===========================*/
/******************************************************************************************/
// 长延时
/******************************************************************************************/
void LongDelay(void)
{
    uchar i;
    for (i=0;i<0x30;i++);
}
/******************************************************************************************/
// 短延时
/******************************************************************************************/
void ShortDelay(void)
{
    uchar i;
    for (i=0;i<8;i++);
}
/******************************************************************************************/
// HD7279键盘发送字节函数
/******************************************************************************************/
void SendByte(    uchar OutByte)
{
    uchar i;
    HDCS=0;
    LongDelay();

    for (i=0;i<8;i++)
    {
        if (OutByte&0x80)
        {    
            HDData=1;
        }
        else
        {
            HDData=0;
        }

        HDClk=1;
        ShortDelay();
        HDClk=0;
        ShortDelay();
        OutByte=OutByte*2;
    }
    HDData=0;
}
/******************************************************************************************/
//    HD7279键盘接收字节函数
/******************************************************************************************/
uchar ReceiveByte (void)
{
    uchar i, InByte;
    HDData=1;                // set to input mode
    LongDelay();

    for (i=0;i<8;i++)
    {
        HDClk=1;
        ShortDelay();
        InByte=InByte*2;
        if (HDData)
        {
            InByte=InByte|0x01;
        }
        HDClk=0;
        ShortDelay();
    }

    HDData=0;
    return (InByte);
}
/******************************************************************************************/
//
/******************************************************************************************/
void Write7279 (uchar cmd, uchar dta)
{
    SendByte (cmd);
    SendByte (dta);
}    
/******************************************************************************************/
// 读命令
/******************************************************************************************/
uchar Read7279 (uchar command)
{
    SendByte(command);
    return(ReceiveByte());
}
/*=======================HD7279结束===========================*/
/**/
/**/
/******************************************************************************************  
* 函 数 名: 
* 功能描述:  
******************************************************************************************/ 
void key_interrupt(void) interrupt 6//外中断2
{        
    EA=0;
    EX2=0;
    
    KeyNumber=0XFF;

    key_flag=0;
    KeyNumber=Read7279(0X15);
    
    switch(KeyNumber)
      {
          case 16:
            key_value=silence_key;

            break;
        case 17:
            key_value=seven_key;
            key_flag=1;
            break;
        case 18:
               key_value=eight_key;
            key_flag=1;    
            break;          
        case 19:
            key_value=dot_key;
            break;         
        case 20:
            key_value=nine_key;
            key_flag=1;    
            break;          
        case 21:
            key_value=ok_key;     
            break;        
        case 7:
            break;
        case 8:
            key_value=option_key;

            break;    
        case 9:
            key_value=four_key;
            key_flag=1;
            break;    
        case 10:
            key_value=five_key;
            key_flag=1;
            break;    
        case 11:
            key_value=zero_key;
            key_flag=1;
            break;
        case 12:
            key_value=six_key;
            key_flag=1;
            break;       
        case 13:
            key_value=bolus_key;
            break;
        case 14:
            key_value=stop_key;
            stop_flag=1;
            break;      
        case 1:
            key_value=one_key;
            key_flag=1;
            break;
        case 2:
            key_value=two_key;
            key_flag=1;
            break;
        case 3:
            key_value=run_key;
            break;
        case 4:
            key_value=three_key;
            key_flag=1;
            break;
        case 5:
            key_value=clear_key;
            break;
        case 6:
            key_value=off_key;
        if(stop_flag==1)
            {
                POWER_OFF;
            }
            break;
        case 24:
            key_value=up_key;
            break;
        case 25:
            key_value=down_key;
            break;
        case 26:
            key_value=f3_key;
            break;
        case 27:
            key_value=f4_key;
            break;
        default:break;

      }     
    EX2=1;
    EA=1;
    }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

32

帖子

0

粉丝