搜索
bottom↓
回复: 45

有哥们做过avr控制zlg7290的吗 ?有什么宝贵经验可以借鉴一下!兄弟我郁闷一个星期了!没

[复制链接]

出0入0汤圆

发表于 2005-12-22 11:11:04 | 显示全部楼层 |阅读模式
有哥们做过avr控制zlg7290的吗 ?有什么宝贵经验可以借鉴一下!兄弟我郁闷一个星期了!没有头绪!任务紧!不胜感谢!

出0入0汤圆

 楼主| 发表于 2005-12-22 17:30:12 | 显示全部楼层
大家都用什么控制键盘和数码管啊?

出0入0汤圆

 楼主| 发表于 2005-12-22 17:31:56 | 显示全部楼层
作完后可以整理成为网站一个范例啊

出0入0汤圆

发表于 2005-12-22 17:35:39 | 显示全部楼层
参考周立功的51程序,改成AVR的硬件IIC接口。

软件模拟IIC也行。



模拟OC结构的IIC总线的技巧:



          虽然AVR大多带有硬件IIC接口,但也有需要使用软件模拟IIC的情况



          可以通过使用外部上拉电阻+控制DDRx的方法来实现OC结构的IIC总线。



          IIC的速度跟上拉电阻有关,内部的上拉电阻阻值较大(Rup=20K~50K),只能用于低速的场合



          #define SDA     0    //PC0

          #define SCL     1    //PC1

          (程序初始化设定  SDA和SCL都是 PORT=0,DDR=0)

          #define  SDA_0()   DDRA|=(1<<SDA)    //输出低电平

          #define  SDA_1()   DDRA&=~(1<<SDA)   //输入,外部电阻上拉为高电平

          #define  SCL_0()   DDRA|=(1<<SCL)    //输出低电平

          #define  SCL_1()   DDRA&=~(1<<SCL)   //输入,外部电阻上拉为高电平



          使用上面的SDA_0()/SDA_1()/SCL_0()/SCL_1()宏即可,直观,而且效率跟汇编是一样的

出0入0汤圆

 楼主| 发表于 2005-12-23 07:39:26 | 显示全部楼层
谢谢回复!我想直接用m64的twi口,用的是外部的10k上拉电阻,但是问题出在,写7290的地址0x70(sla_w)时,收不到ack信号。我看示波器的波形,8位数据是对的,但是第九个脉冲时,总是高电平,不知是什么原因。线路应该没什么毛病的。

出0入4汤圆

发表于 2005-12-23 12:24:25 | 显示全部楼层
我的7289的程序



点击此处下载armok0193746.rar

出0入0汤圆

 楼主| 发表于 2005-12-24 07:55:03 | 显示全部楼层
多谢了!先参考一下!

出0入0汤圆

发表于 2006-3-2 12:21:28 | 显示全部楼层
真是不可多得,宝贵的资料

出0入0汤圆

发表于 2006-3-2 13:55:51 | 显示全部楼层
ilan2003 小松工程你的程序是软件模拟的IIC口吧,上次我用AVR的硬件IIC口一直没调出来,有时正常,有时要多写几次才能正常显示,模拟的就没问题,不知何故,改天有空翻出来再调调。

出0入4汤圆

发表于 2006-3-2 19:11:39 | 显示全部楼层
哦 我的是7289的程序,不是I2C接口的,是SPI接口的

出0入0汤圆

发表于 2006-4-3 16:58:05 | 显示全部楼层
请问大家,有做过IIC硬件驱动ZLG7290,发下言可以吗,我就是硬件IIC不能实现啊,不知是何原因?

出0入0汤圆

发表于 2006-4-4 11:05:54 | 显示全部楼层
请问各位,真是没有做出硬件IIC驱动的ZLG7290的朋友吗?有做过请发下言可以吗,我搞了很久也不成功,希望得到指点,谢谢

出0入0汤圆

发表于 2006-4-4 14:01:35 | 显示全部楼层
ZLG7290的I2C速率很低,调不出来是否是这个原因啊?

出0入0汤圆

发表于 2006-4-9 13:04:43 | 显示全部楼层
是这个原因吗,有用MEGA16的硬件IIC直接驱动到ZLG7290显示的吗,不是软件模似啊,如果有做成功,请指点下啊,谢了,现在做了一个万能板焊的,还做了PCB板的,也是同样现像,真是郁闷啊,不知道是何原因啊,(因为之前以为是万能板焊出来有问题目,就改用PCB了),谢谢大家

出0入0汤圆

发表于 2006-4-17 23:19:07 | 显示全部楼层
安装7290的说明上提供的范例用的是8mHz的晶振检测连击的时候是感觉反映比较慢,我现在用都是用12MHz的感觉还满意。而且我外加的上拉是3.3k的电阻,很容易就调通了

出0入4汤圆

发表于 2006-4-18 17:00:42 | 显示全部楼层
我只用过LPC2132的硬件IIC是可以的,用他们的IIC包,需要注意的是IIC的速率要在30KHz以下。

出0入0汤圆

发表于 2006-4-18 19:45:03 | 显示全部楼层
很感谢大家的回答啊,我没用到连击功能啊,你讲得对啊,ZLG7290资料给出的8M的确是传输数,和显示出来相对12M的要慢啊,晶振之前我就改为12M了,不过现在还是有这个问题,就是显示不全,还有按键没反应,我也是用周立功的IIC包的,不过TWI就参考下其它程序改成,我发上,让大家看下,我编写是否有错,还有电路图,谢谢大家

出0入0汤圆

发表于 2006-4-18 19:47:02 | 显示全部楼层
这是我的源程序:

#include <iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint  unsigned int



#define zlg7290 0x70

//0x70是zlg7290的从地址   

#define SubKey  0x01

//键值寄存器Key(地址:01H),码键值子地址

#define SubCmdBuf 0x07

//寄存器CmdBuf0(地址:07H),命令缓冲区子地址

#define SubDpRam 0x10

//显示缓冲区DpRam0(地址:0x10),显示子地址

                              /*状态标志*/

uchar disp_buf[8]={0,0,0,0,0,0,0,0};

uchar rd[8]={1,2,3,4,5,6,7,8};         //1234-56-78  





uchar Table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

                 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};



void DelayMs(uint i)  //1ms

{uint j;

for(;i!=0;i--)

  {for(j=4000;j!=0;j--) {;}}

}



/*

void Display(uchar *p) //间隔5ms显示

{uchar i,sel=0x04;

for(i=0;i<4;i++)

  {PORTC=~sel;

   PORTB=Table[p[3-i]];

   DelayMs(2);

   sel=sel<<1;

  }

}*/



void Init_IO(void)       //A B C 口推挽1输出

{DDRA=0xff;

PORTA=0xff;

DDRC=0xff;

PORTC=0xff;

DDRB=0xff;

PORTB=0xff;

DDRD=0x00;

PORTD=0x00;



}











/*********************************************************************************************/

/********************以下是对ATmega16的自带I2C定义和使用**************************************/

/*********************************************************************************************/













//************TWI初始化*************//

void Init_TWI(void)

{TWCR= 0x00;                //禁止TWI

TWBR= 15;                  //波特率15

//当电压为5V时, 上拉电阻为10K时, SCL和SDA的一个时钟周期为10us; 上拉电阻为1K时, SCL和SDA的一个时钟周期为2.5us;

//TWBR值需要仔细调节以配合ZLG7290的IIC频率要求

TWSR= 0x00;                //预分频系数1,或(0<<TWPS1)|(0<<TWSP0);

// TWAR= 0xA0;              //IIC从机地址SLAVE=0xa0

TWCR= 0x04;                //使能TWI,禁止中断,即:TWCR =(1<<TWEN),

                            //禁止中断即TWINT被清零,TWI立即开始工作,因此,在

                            //清零TWINT之前一定要首先完成对地址寄存器TWAR,

                                                        //状态寄存器TWSR,以及数据寄存器TWDR的访问。

}







/****************************************************

*****************************************************

向IIC地址为Slave的从机的Address地址发送(写)一字节数据Data

          返回0:写成功

          返回非0:写失败

******************************************************

******************************************************/



uchar TWI_Send(uchar Slave,uchar Address,uchar Data)

{

TWCR=0x80|0x20|0x04;       //或:TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);对TWINT写1清除,使能TWI,发出Start信号

while((TWCR&0x80)!=0x80) ; //或:while (!(TWCR & (1<<TWINT)));等待TWINT置位,表明Start信号已发出

if((TWSR&0xf8)!=0x08)      //或:if ((TWSR & 0xF8) != START),检测状态寄存器,屏蔽预分频位,如果状态字不是START转出错处理

     return(1);             //返回值1,表明从机没有对Start信号作应答        



//Slave即SLA+W,即是从机地址 ,可以是0x18或0x20,此处只用0x18

//所谓的应答是“从器件”在收到地址和“写”后,将SDA电压拉低,由“主器件”读取

//ATmge16如果读到这个“低”电压则返回0x18,否则返回0x20。

TWDR=Slave;                //更新地址寄存器,装Slave入到TWDR寄存器

TWCR=0x80|0x04;            //或:TWCR = (1<<TWINT) | (1<<TWEN);对TWINT写1清除,使能TWI;发出从机地址信息

while((TWCR&0x80)!=0x80) ; //或:while (!(TWCR & (1<<TWINT)));等待TWINT置位,表明Slave信号已发出

if((TWSR&0xf8)!=0x18)     //或:if ((TWSR & 0xF8) != MT_SLA_ACK),检测状态寄存器,

    return(2);              //返回值2,表明从机没有对Slave信号作应答



//Address是MT_SLA_ACK是否控发送器地址,可以是0x28或0x30, 此处只用0x28

TWDR=Address;

TWCR=0x80|0x04;            //或:TWCR = (1<<TWINT) | (1<<TWEN);对TWINT写1清除,使能TWI;发出寄存器地址信息

while((TWCR&0x80)!=0x80) ; //或:while (!(TWCR & (1<<TWINT)));等待TWINT置位,表明Address信号已发出

if((TWSR&0xf8)!=0x28)     //检测状态寄存器(MT_DATA_ACK)

    return(3);              //返回值3,表明从机没有对Address信号作应答



TWDR=Data;//写数据到ZLG7290

TWCR=0x80|0x04;            //或:TWCR = (1<<TWINT) | (1<<TWEN);对TWINT写1清除,使能TWI;发出数据信息

while((TWCR&0x80)!=0x80) ; //或:while (!(TWCR & (1<<TWINT)));等待TWINT置位,表明Data信号已发出

if((TWSR&0xf8)!=0x28)     //if ((TWSR & 0xF8) != MT_DATA_ACK);检测状态寄存器

    return(4);              //返回值3,表明从机没有对Data信号作应答



TWCR=0x80|0x04|0x10;       //或:TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);对TWINT写1清除,使能TWI,发出Stop信号

return(0);



}









/******************************************************************

*********************************************************************

向IIC地址为Slave的从机的Address地址开始发送N字节数据Data

******************************************************************

*******************************************************************/

uchar TWI_Send_Mux(uchar Slave,uchar Address,uchar *Array,uchar CNT)

{uchar Count;

TWCR=0x80|0x20|0x04;       //对TWINT写1清除,使能TWI,发出Start信号

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Start信号已发出

if((TWSR&0xf8)!=0x08)      //检测状态寄存器

     return(1);             //返回值1,表明从机没有对Start信号作应答        



TWDR=Slave;                //更新地址寄存器

TWCR=0x80|0x04;            //对TWINT写1清除,使能TWI;发出从机地址信息

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Slave信号已发出

if((TWSR&0xf8)!=0x18)     //检测状态寄存器

    return(2);              //返回值2,表明从机没有对Slave信号作应答



TWDR=Address;

TWCR=0x80|0x04;            //对TWINT写1清除,使能TWI;发出寄存器地址信息

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Address信号已发出

if((TWSR&0xf8)!=0x28)     //检测状态寄存器

    return(3);              //返回值3,表明从机没有对Address信号作应答



for(Count=0;Count<CNT;Count++) //连续写N个字节 ,实现发送N字节数据Data

    {TWDR=Array[Count];         //建立数组装载TWDR

         TWCR=0x80|0x04;            //或(1<<TWINT)|(1<<TWEN);对TWINT写1清除,使能TWI;发出数据信息

     while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Data信号已发出

     if((TWSR&0xf8)!=0x28)      //检测状态寄存器

        return(4);}             //返回值4,表明从机没有对Data信号作应答



TWCR=0x80|0x04|0x10;           //对TWINT写1清除,使能TWI,发出Stop信号

return(0);

}





/**********************************************************************

***********************************************************************

从IIC地址为Slave的从机的Address地址读取一字节数据Data,返回值为读取的数据

************************************************************************

***********************************************************************/

//以下为主机接收模式

/*在主机接收模式,主机可以从从机接收数据,为进入主机模式,必须发送START信号。

紧接着的地址包格式决定进入MT或MR模式。 如果发送 SLA+W 进入MT模式;如果发送SLA+R则进入MR模式。*/

uchar TWI_Receive(uchar Slave,uchar Address)

{//发送Start

uchar Temp;

TWCR=0x80|0x20|0x04;       //或:TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);对TWINT写1清除;使能TWI;发出Start信号

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Start信号已发出

if((TWSR&0xf8)!=0x08)      //检测状态寄存器,{0x08表示:主机的TWSR状态码(在预分频位为"0"情况下)}

     return(1);             //返回值1,表明从机没有对Start信号作应答        

//发送Slave+W

TWDR=Slave;                //更新地址寄存器

TWCR=0x80|0x04;            //对TWINT写1清除,使能TWI;发出从机地址信息

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Slave信号已发出

if((TWSR&0xf8)!=0x18)     //检测状态寄存器,(0x18表示:SLA+W从机已发送,接收到ACK)

    return(2);              //返回值2,表明从机没有对Slave信号作应答

//发送Address

TWDR=Address;

TWCR=0x80|0x04;            //对TWINT写1清除,使能TWI;发出寄存器地址信息

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Address信号已发出

if((TWSR&0xf8)!=0x28)     //检测状态寄存器,(0x28表示:主控机地址已发送,接收到ACK)

    return(3);              //返回值3,表明从机没有对Address信号作应答



//上面三段程序定义是主机方式后,以下就是接收信号的定义



//发送Start,重新启动TWI

TWCR=0x80|0x20|0x04;       //对TWINT写1清除;使能TWI;发出Start信号

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Start信号已发出

if((TWSR&0xf8)!=0x10)      /*检测状态寄存器,在Repeat Start (状态0x10) 后,两线接口可以再次访问

                            相同的从机,或不发送STOP信号来访问新的从机。REPEATED START使得主机

                                                        可以在不丢失总线控制的条件下在从机、主机发送器及主机接收器模式间进行切换。*/

     return(4);             //返回值4,表明从机没有对Repeat Start信号作应答        

//发送Slave+R

TWDR=Slave+1;              //更新地址寄存器

TWCR=0x80|0x04;            //对TWINT写1清除,使能TWI;发出从机地址信息

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明Slave信号已发出

if((TWSR&0xf8)!=0x40)     //检测状态寄存器,(0x40表示:SLA+R(MR_SLA_ACK)已发送,接收到ACK)

    return(5);              //返回值5,表明从机没有对Slave+R信号作应答



TWCR=0x80|0x04;            //对TWINT写1清除,使能TWI;接受数据

while((TWCR&0x80)!=0x80) ; //等待TWINT置位,表明数据已经接收接受

if((TWSR&0xf8)!=0x50)  ;   //检测状态寄存器,(0x50表示:接收到数据,ACK已返回)

   // return(6);              //返回值3,表明从机没有对Address信号作应答



Temp=TWDR;                 //读接收数据



TWCR=0x80|0x04;            //发出NACK信号



TWCR=0x80|0x04|0x10;       //发出Stop信号,或:TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);

DelayMs(1);

TWCR=0x80;                 //清除TWINT和禁止TWI(不加上这句程序只能读一次)

return(Temp);

}











/********************************************************************************************/

/*************************以下是对ZLG7290的定义和使用****************************************/

/********************************************************************************************/

/**************************ZLG7290库函数程序**************************************************/















/*ZLG7290的I2C接口传输速率可达32kbit/s,容易与处理器接口.并提供键盘中断信号,提高主处

理器时间效率.ZLG7290的从地址 (slave address)为70H(01110000B).*/







/*ZLG7290B的I2C总线器件地址是70H(写操作)和71H(读操作).*/









/*ZLG7290提供两种控制方式:寄存器映象控制和命令解释控制,

寄存器映象控制是指直接访问底层寄存器,实现基本控制功能,这些寄存器须字节操作

命令解释控制是指通过解释命令缓冲区(CmdBuf0CmdBuf1)中的指令,间接访问底层寄存器实

现扩展控制功能.如实现寄存器的位操作,对显示缓存循环,移位;对操作数译码等操作.*/







//***************寄存器映象控制******************//

/***********************************************************************

** 函数名称:         ZLG7290_SendData

** 功能描述:         发送数据

** 输 入:SubAdd :        输入数据

**       DATA         :        输入值

**         

** 输 出: 0 : Fail

**        1 :  OK

** 全局变量:        无

** 调用模块:         delayMS

**--------------------------------------------------------------------------------------------------

/***********************************************************************/

//功能:向器件地址为zlg7290的ZLG7290芯片的SubAdd地址的寄存器写一字节Data

uchar ZLG7290_SendData(uchar SubAdd,uchar Data)

{

        if(SubAdd>0x17)//0x17表示:DpRam0~7的最大地址,它的范围是(0x10~0x17),共八位数码管

                return 0;//超出于0x17的范围,即超出八位数码管数目就返回0

        TWI_Send(zlg7290,SubAdd,Data);//TWI_Send()为发送一字节,zlg7290表示从机,SubAdd为地址,Data为数据

        DelayMs(10);

        return 1;

}



/************发送命令函数***********************/

/***********************************************************************

** 函数名称:         ZLG7290_SendCmd

** 功能描述:         发送命令(对子地址7、8)

** 输 入:DATA1  :        命令1

**       DATA2         :        命令2

**         

** 输 出: 0 : Fail

**        1 :  OK

** 全局变量:        无

** 调用模块:         TWI_Send_Mux、delayMS

**--------------------------------------------------------------------------------------------------

***********************************************************************/



//功能:向命令缓冲区0x07、0x08发送命令,(0x07~0x08是CmdBuf0~2命令接口:包括译码,移位)

// 寄存器CmdBuf0(地址:07H)和CmdBuf1(地址:08H)共同组成命令缓冲区。

//通过向命令缓冲区写入相关的控制命令可以实现段寻址、下载显示数据、控制闪烁等功能

uchar ZLG7290_SendCmd(uchar Data1,uchar Data2)

{uchar Data[2];

        Data[0]=Data1;

        Data[1]=Data2;

        TWI_Send_Mux(zlg7290,0x07,Data,2);//TWI_Send_Mux()发送N个字节(这里N为2),zlg7290为从机,0x07是地址

        DelayMs(10);

        return 1;

}  



//***********向显示缓冲区送显示数据***************//

/***********************************************************************

** 函数名称:         ZLG7290_SendBuf

** 功能描述:         向显示缓冲区发送数据

** 输 入: * disp_buf          :        要发送数据的起始地址

**         num                 :        发送个数

**         

** 输 出: 无

** 全局变量:        无

** 调用模块:         ZLG7290_SendCmd

**--------------------------------------------------------------------------------------------------

***********************************************************************/



//功能:送显示数据。需要给出显示缓冲区首址和显示的数据个数(<8个)

/*显示缓存寄存器(DpRam0~DpRam7):地址10H~17H,复位值00H~00H.缓存中一位置

1表示该像素亮,DpRam7~DpRam0的显示内容对应Dig7~Dig0引脚 */

void ZLG7290_SendBuf(uchar *disp_buf,uchar num)

{uchar i;

        for(i=0;i<num;i++)

        {       

                ZLG7290_SendCmd(0x60+i,*disp_buf);//在第i位数码管译码并显示DpBuf

                disp_buf++;

                DelayMs(10);

        }

}



//***********取得按键编号****************//

/***********************************************************************

** 函数名称:         ZLG7290_GetKey

** 功能描述:         读取键值

** 输 入: 无

**         

** 输 出: >0  键值

**        =0  无键按下

** 全局变量:        无

** 调用模块:         TWI_Receive、delayMS

**

**-------------------------------------------------------------------------------------------------

***********************************************************************/



uchar ZLG7290_GetKey()

{uchar rece;

        rece=0;

        rece=TWI_Receive(zlg7290,1);//键值寄存器Key地址是01H,所以此处Address=1;zlg7290为从机

        DelayMs(10);

        return rece;

}























/*********************************************************************************************************

** 函数名称:         display

** 功能描述:         7290 led显示

** 输 入: *sd :        显示缓冲区的头地址

**         

** 输 出: 0 :        OK;

**         1 :        FAIL;

** 全局变量:        无

** 调用模块:         ZLG7290_SendBuf

**





**-------------------------------------------------------------------------------------------------------

** 日 期:2006-4-11

**------------------------------------------------------------------------------------------------------*/



uchar display(uchar *sd)

{ uchar i;

  for(i=0;i<8;i++)

    disp_buf=  (disp_buf&0xf0)|rd[7-i];//uchar rd[8]={1,2,3,4,5,6,7,8};

        //取数组的高4位,取前一数组的高4位,然后再或上低4位

        //取高4位,清0低4位

    //取另一数组的低4位,或进来

        //相当于两个数组拼接

        /*以下是16进制转10进制输出,如果用下面两段程序就得之前定义的 rd[5]={0x12,0x48,0x30,0x03,0x04};         

        /*

          disp_buf[0] = (disp_buf[0]&0xf0)|(sd[0]%16);               

    disp_buf[1] = (disp_buf[1]&0xf0)|(sd[0]/16);               

    disp_buf[2] = (disp_buf[2]&0xf0)|(sd[2]%16);//31;

    disp_buf[3] = (disp_buf[3]&0xf0)|(sd[2]/16);

    disp_buf[4] = (disp_buf[4]&0xf0)|(sd[3]%16);

    disp_buf[5] = (disp_buf[5]&0xf0)|(sd[3]/16);//31;

    disp_buf[6] = (disp_buf[6]&0xf0)|(sd[4]%16);       

    disp_buf[7] = (disp_buf[7]&0xf0)|(sd[4]/16);

        */

        /*或者:

        unsigned char display(unsigned char  *sd)

    {

          disp_buf[0] = (disp_buf[0]&0xf0)|(sd[0]%16);                        // 装载" dp-932"

    disp_buf[1] = (disp_buf[1]&0xf0)|(sd[0]/16);               

    disp_buf[2] = 31;

    disp_buf[3] = (disp_buf[3]&0xf0)|(sd[1]%16);

    disp_buf[4] = (disp_buf[4]&0xf0)|(sd[1]/16);

    disp_buf[5] = 31;

    disp_buf[6] = (disp_buf[6]&0xf0)|(sd[2]%16);       

    disp_buf[7] = (disp_buf[7]&0xf0)|(sd[2]/16);

    ZLG7290_SendBuf(disp_buf,8);

        return 0;

    }

    */

    ZLG7290_SendBuf(disp_buf,8);

        return 0;

}





void Delay(uchar j)

{uchar k;

for(;j!=0;j--)

   {for(k=0;k<=250;k++){;}}

}













void main(void)

{uchar key=0;

uchar i;

uchar k;

uchar FLASH=1;

//DDRC=0xff;

//PORTC=0xff;

//DDRD=0x00;定义PD3为输入

//PORTD=0x00;

//MCUCSR=MCUCSR|0x80;

//MCUCSR=MCUCSR|0x80;

Init_IO();

Init_TWI();

DelayMs(100);

while(1)

          {//DelayMs(100);

           i=display(rd);//显示12345678

        if((PIND&0x08)==0)          //如果有按键按下:PD3

            // 键盘处理程序可由/INT引脚低电平中断触发,以提高程序效率

/* 系统寄存器的第0位(LSB)称作KeyAvi,标志着按键是否有效,0-没有按键被按下,

1-有某个按键被按下。SystemReg寄存器的其它位暂时没有定义。当按下某个键时,

ZLG7290B的INT引脚会产生一个低电平的中断请求信号。当读走键值后,中断信号就会自

动撤销。而KeyAvi也同时予以反映。正常情况下,微控制器只需要判断INT引脚就可以了。

通过不断查询KeyAvi位也能判断是否有键按下,这样就可以节省微控制器的一根I/O口线,

但是代价是I2C总线处于频繁的活动状态,多消耗电流并且不利于抗干扰.*/       

                {key=ZLG7290_GetKey();   //取得按键数值

                 switch(key)

                        {case 1://确定

                                {for(k=0;k<8;k++)

                                        disp_buf[k]=disp_buf[k]&0xbf;//去除闪烁,只要令低四位全为0即可令所有数码管不闪烁

                                 break;}

                         case 2:                        //光标左移,左移键用于选择要修改的位

                                   {disp_buf[FLASH]=disp_buf[FLASH]&0xbf;

                                        FLASH=FLASH+1;//FLASH位:0~7

                                        if(FLASH==8) FLASH=0;

                                        disp_buf[FLASH]=disp_buf[FLASH]|0x40;//闪烁

                                        break;}

                         case 3:                        //光标右移,右移键用于选择要修改的位

                                   {disp_buf[FLASH]=disp_buf[FLASH]&0xbf;

                                        if(FLASH==0) FLASH=7;

                                        else FLASH=FLASH-1;

                                        disp_buf[FLASH]=disp_buf[FLASH]|0x40;//闪烁

                                        break;}

                         case 4:                        //光标值加一

                                   {i=7-FLASH;

                                    rd=rd+1;

                                        if(rd==16) rd=0;

                                        Delay(50);

                                        break;}

                         case 5:                            //光标值减一

                                   {i=7-FLASH;

                                    if(rd==0) rd=15;

                                        else rd=rd-1;

                                    break;}

                         case 6 :break;

                         case 7 :break;

                         case 8 :break;

                         default:break;}

                 while((PIND&0x08)==0) {;}

        }

  }

}

出0入0汤圆

发表于 2006-4-18 19:48:30 | 显示全部楼层
这是我的电路图:

出0入0汤圆

发表于 2006-4-18 19:49:36 | 显示全部楼层
请大家多多提点,是否我的电路图有错,还是我的编写过程中有错误,谢谢,

出0入0汤圆

发表于 2006-4-18 20:51:33 | 显示全部楼层
是不是显示的时候有一两数码管会不显示,但是没有出现错位的情况?如果是就是因为发送数据间的延时不够,如果是有缺段,说明发送速率快了一点。还有图中SCL和SDA的上拉改成3.3K要好点。程序就没有仔细看了,看程序头就大了,不好意思。估计不会有什么大问题,就是延时时间改大一点,慢慢改小这样就可以找的一个比较稳定的工作速度。有需要我可以给你我的程序。

出0入0汤圆

发表于 2006-4-18 21:27:33 | 显示全部楼层
哗,你的这段话,我要保存下来,真是太多谢你了,你讲得真是对啊,我的四个数码管全显示了,不过,有些真是缺段了,好我马上改下,还有请问你讲的出现错位是不是指有些段出现到边的地方的意思,真是谢你啊,你真个大好人,谢啊,好啊,我发了邮件给你,我参考下你的程序!谢你了

-----此内容被kinggink888于2006-04-18,21:29:34编辑过


-----此内容被kinggink888于2006-04-18,21:30:15编辑过

出0入0汤圆

发表于 2006-4-19 13:15:35 | 显示全部楼层
用这个:



http://winchiphead.com/download/CH451/CH451PLN.PDF

出0入0汤圆

发表于 2006-4-19 15:59:25 | 显示全部楼层
谢谢你啊,不过我下载回来之后一些乱码显示啊,???这是什么文档来的,

出0入0汤圆

发表于 2006-6-14 12:07:57 | 显示全部楼层
to kinggink888:

你的程序我验证了,在我的班子上能够正确运行(我用的贴片M48),显示正常,按键也可以检测到。请检查你的焊接有无问题,按键检测不到的话先判断7290 KeyInt是否能够输出低电平,不能的话检查二极管是否焊反了。

出0入0汤圆

发表于 2006-12-30 12:25:01 | 显示全部楼层
你好啊,dl-mcu,谢谢你的验证的结果,这是我之前的毕业设计,你讲得很对,之前我是用万能板焊接的,后来改为PCB就能显示正常了,谢谢你的,有空多多交流,很高兴认识你

出0入0汤圆

发表于 2007-1-6 12:11:01 | 显示全部楼层
有avr还用什么7290?



http://www2.ouravr.com/bbs/bbs_content.jsp?bbs_sn=701325&bbs_page_no=1&bbs_id=1000

出0入0汤圆

发表于 2007-4-11 11:32:05 | 显示全部楼层
请问小松工程:main函数和function.h头文件在哪,压缩包里没有啊!

能否发上来,让我们参考一下啊

出0入0汤圆

发表于 2007-4-23 17:19:22 | 显示全部楼层
TO  hyping:

可以给我传一下你的程序,我的显示缺两位。我的邮箱:longjunyi2000@163.com

出0入0汤圆

发表于 2007-6-20 14:20:57 | 显示全部楼层
请问一下:用ZLG7290怎么控制数码管的亮度呀?我要求数码管5级亮度可调。谢谢!

出0入0汤圆

发表于 2008-7-20 02:49:32 | 显示全部楼层
我以前做过,还比较稳定,7290的iic频率较低,要小于33k,写代码要注意,iic代码用的24c02的读写函数,操作很简单,直接操作内部寄存器。后来给7290使用24m晶振,使用100k iic频率稳定运行,不过还是建议降速,两年没用这段代码了,不怎么好找

出0入0汤圆

发表于 2008-7-26 15:41:38 | 显示全部楼层
7290的iic频率较低.操作不能太频繁.稳定性还行.

出0入0汤圆

发表于 2008-7-26 18:39:43 | 显示全部楼层
我想问问 , 7290的 IIC 好那 , 还是spi的好 ?  从速度上来说 IIC速度小于30K  那用spi怎么样 ?  毕竟速度越大越好些 , 还有IIC 可以节省一个IO口的 这个也是个优势 , 速度不大的话不太好


还有没有更好的 类似7290的芯片啊

出0入0汤圆

发表于 2008-7-26 21:04:54 | 显示全部楼层
io模拟的做过,硬件IIC的没用过

出0入0汤圆

发表于 2009-8-13 08:37:19 | 显示全部楼层
标记  以后再做   不过我用PS2 搞定了  呵呵

出0入0汤圆

发表于 2009-9-6 22:17:57 | 显示全部楼层
感觉ZLG7290不太好用,CH451还行

出0入0汤圆

发表于 2009-9-26 14:14:06 | 显示全部楼层
kinggink888...
看不到你的电路图,能给我看看么。。。我在用7290

出0入0汤圆

发表于 2009-9-29 14:45:29 | 显示全部楼层
void ZLG7290_SendBuf(uchar *disp_buf,uchar num)
{uchar i;
for(i=0;i<num;i++)
{
ZLG7290_SendCmd(0x60+i,*disp_buf);//在第i位数码管译码并显示DpBuf
disp_buf++;
DelayMs(10);
}
}

请问一下这句话里的 0x60+i 的 0x60 是哪里来的??》

出0入0汤圆

发表于 2009-9-29 15:43:57 | 显示全部楼层
MK

出0入0汤圆

发表于 2009-9-29 16:03:14 | 显示全部楼层
???不懂。。
88488848  可不可以说详细一点,谢谢。

出0入0汤圆

发表于 2009-11-9 14:57:29 | 显示全部楼层
我做的,测试成功的!

出0入0汤圆

发表于 2009-11-9 14:58:46 | 显示全部楼层
点击此处下载 ourdev_501436.rar(文件大小:98K) (原文件名:ATMEGA16 at 16MHZ.rar)

出0入0汤圆

发表于 2009-11-9 19:32:01 | 显示全部楼层
不错的东东

出0入0汤圆

发表于 2010-8-6 11:39:58 | 显示全部楼层
初来乍到,study

出0入0汤圆

发表于 2011-4-28 20:09:33 | 显示全部楼层
有用stm32驱动的吗?

出0入0汤圆

发表于 2014-4-15 20:27:08 | 显示全部楼层
请问大家,如果有键按下,正要读的时候,定时器中断来了,等处理完中断函数,回来发现读键值的函数死了。有这种情况吗。是不是长时间不读键值,这个键值就清零了?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 06:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表