有哥们做过avr控制zlg7290的吗 ?有什么宝贵经验可以借鉴一下!兄弟我郁闷一个星期了!没
有哥们做过avr控制zlg7290的吗 ?有什么宝贵经验可以借鉴一下!兄弟我郁闷一个星期了!没有头绪!任务紧!不胜感谢! 大家都用什么控制键盘和数码管啊? 作完后可以整理成为网站一个范例啊 参考周立功的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)
#defineSDA_0() DDRA|=(1<<SDA) //输出低电平
#defineSDA_1() DDRA&=~(1<<SDA) //输入,外部电阻上拉为高电平
#defineSCL_0() DDRA|=(1<<SCL) //输出低电平
#defineSCL_1() DDRA&=~(1<<SCL) //输入,外部电阻上拉为高电平
使用上面的SDA_0()/SDA_1()/SCL_0()/SCL_1()宏即可,直观,而且效率跟汇编是一样的 谢谢回复!我想直接用m64的twi口,用的是外部的10k上拉电阻,但是问题出在,写7290的地址0x70(sla_w)时,收不到ack信号。我看示波器的波形,8位数据是对的,但是第九个脉冲时,总是高电平,不知是什么原因。线路应该没什么毛病的。 我的7289的程序
点击此处下载armok0193746.rar 多谢了!先参考一下! 真是不可多得,宝贵的资料 ilan2003 小松工程你的程序是软件模拟的IIC口吧,上次我用AVR的硬件IIC口一直没调出来,有时正常,有时要多写几次才能正常显示,模拟的就没问题,不知何故,改天有空翻出来再调调。 哦 我的是7289的程序,不是I2C接口的,是SPI接口的 请问大家,有做过IIC硬件驱动ZLG7290,发下言可以吗,我就是硬件IIC不能实现啊,不知是何原因? 请问各位,真是没有做出硬件IIC驱动的ZLG7290的朋友吗?有做过请发下言可以吗,我搞了很久也不成功,希望得到指点,谢谢 ZLG7290的I2C速率很低,调不出来是否是这个原因啊? 是这个原因吗,有用MEGA16的硬件IIC直接驱动到ZLG7290显示的吗,不是软件模似啊,如果有做成功,请指点下啊,谢了,现在做了一个万能板焊的,还做了PCB板的,也是同样现像,真是郁闷啊,不知道是何原因啊,(因为之前以为是万能板焊出来有问题目,就改用PCB了),谢谢大家 安装7290的说明上提供的范例用的是8mHz的晶振检测连击的时候是感觉反映比较慢,我现在用都是用12MHz的感觉还满意。而且我外加的上拉是3.3k的电阻,很容易就调通了 我只用过LPC2132的硬件IIC是可以的,用他们的IIC包,需要注意的是IIC的速率要在30KHz以下。 很感谢大家的回答啊,我没用到连击功能啊,你讲得对啊,ZLG7290资料给出的8M的确是传输数,和显示出来相对12M的要慢啊,晶振之前我就改为12M了,不过现在还是有这个问题,就是显示不全,还有按键没反应,我也是用周立功的IIC包的,不过TWI就参考下其它程序改成,我发上,让大家看下,我编写是否有错,还有电路图,谢谢大家 这是我的源程序:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uintunsigned int
#define zlg7290 0x70
//0x70是zlg7290的从地址
#define SubKey0x01
//键值寄存器Key(地址:01H),码键值子地址
#define SubCmdBuf 0x07
//寄存器CmdBuf0(地址:07H),命令缓冲区子地址
#define SubDpRam 0x10
//显示缓冲区DpRam0(地址:0x10),显示子地址
/*状态标志*/
uchar disp_buf={0,0,0,0,0,0,0,0};
uchar rd={1,2,3,4,5,6,7,8}; //1234-56-78
uchar Table={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];
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; //建立数组装载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;
Data=Data1;
Data=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;//uchar rd={1,2,3,4,5,6,7,8};
//取数组的高4位,取前一数组的高4位,然后再或上低4位
//取高4位,清0低4位
//取另一数组的低4位,或进来
//相当于两个数组拼接
/*以下是16进制转10进制输出,如果用下面两段程序就得之前定义的 rd={0x12,0x48,0x30,0x03,0x04};
/*
disp_buf = (disp_buf&0xf0)|(sd%16);
disp_buf = (disp_buf&0xf0)|(sd/16);
disp_buf = (disp_buf&0xf0)|(sd%16);//31;
disp_buf = (disp_buf&0xf0)|(sd/16);
disp_buf = (disp_buf&0xf0)|(sd%16);
disp_buf = (disp_buf&0xf0)|(sd/16);//31;
disp_buf = (disp_buf&0xf0)|(sd%16);
disp_buf = (disp_buf&0xf0)|(sd/16);
*/
/*或者:
unsigned char display(unsigned char*sd)
{
disp_buf = (disp_buf&0xf0)|(sd%16); // 装载" dp-932"
disp_buf = (disp_buf&0xf0)|(sd/16);
disp_buf = 31;
disp_buf = (disp_buf&0xf0)|(sd%16);
disp_buf = (disp_buf&0xf0)|(sd/16);
disp_buf = 31;
disp_buf = (disp_buf&0xf0)|(sd%16);
disp_buf = (disp_buf&0xf0)|(sd/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=disp_buf&0xbf;//去除闪烁,只要令低四位全为0即可令所有数码管不闪烁
break;}
case 2: //光标左移,左移键用于选择要修改的位
{disp_buf=disp_buf&0xbf;
FLASH=FLASH+1;//FLASH位:0~7
if(FLASH==8) FLASH=0;
disp_buf=disp_buf|0x40;//闪烁
break;}
case 3: //光标右移,右移键用于选择要修改的位
{disp_buf=disp_buf&0xbf;
if(FLASH==0) FLASH=7;
else FLASH=FLASH-1;
disp_buf=disp_buf|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) {;}
}
}
} 这是我的电路图:
http://cache.amobbs.com/bbs_upload782111/files_5/armok01115170.jpg 请大家多多提点,是否我的电路图有错,还是我的编写过程中有错误,谢谢, 是不是显示的时候有一两数码管会不显示,但是没有出现错位的情况?如果是就是因为发送数据间的延时不够,如果是有缺段,说明发送速率快了一点。还有图中SCL和SDA的上拉改成3.3K要好点。程序就没有仔细看了,看程序头就大了,不好意思。估计不会有什么大问题,就是延时时间改大一点,慢慢改小这样就可以找的一个比较稳定的工作速度。有需要我可以给你我的程序。 哗,你的这段话,我要保存下来,真是太多谢你了,你讲得真是对啊,我的四个数码管全显示了,不过,有些真是缺段了,好我马上改下,还有请问你讲的出现错位是不是指有些段出现到边的地方的意思,真是谢你啊,你真个大好人,谢啊,好啊,我发了邮件给你,我参考下你的程序!谢你了
-----此内容被kinggink888于2006-04-18,21:29:34编辑过
-----此内容被kinggink888于2006-04-18,21:30:15编辑过 用这个:
http://winchiphead.com/download/CH451/CH451PLN.PDF 谢谢你啊,不过我下载回来之后一些乱码显示啊,???这是什么文档来的, to kinggink888:
你的程序我验证了,在我的班子上能够正确运行(我用的贴片M48),显示正常,按键也可以检测到。请检查你的焊接有无问题,按键检测不到的话先判断7290 KeyInt是否能够输出低电平,不能的话检查二极管是否焊反了。 你好啊,dl-mcu,谢谢你的验证的结果,这是我之前的毕业设计,你讲得很对,之前我是用万能板焊接的,后来改为PCB就能显示正常了,谢谢你的,有空多多交流,很高兴认识你 有avr还用什么7290?
http://www2.ouravr.com/bbs/bbs_content.jsp?bbs_sn=701325&bbs_page_no=1&bbs_id=1000 请问小松工程:main函数和function.h头文件在哪,压缩包里没有啊!
能否发上来,让我们参考一下啊 TOhyping:
可以给我传一下你的程序,我的显示缺两位。我的邮箱:longjunyi2000@163.com 请问一下:用ZLG7290怎么控制数码管的亮度呀?我要求数码管5级亮度可调。谢谢! 我以前做过,还比较稳定,7290的iic频率较低,要小于33k,写代码要注意,iic代码用的24c02的读写函数,操作很简单,直接操作内部寄存器。后来给7290使用24m晶振,使用100k iic频率稳定运行,不过还是建议降速,两年没用这段代码了,不怎么好找 7290的iic频率较低.操作不能太频繁.稳定性还行. 我想问问 , 7290的 IIC 好那 , 还是spi的好 ?从速度上来说 IIC速度小于30K那用spi怎么样 ?毕竟速度越大越好些 , 还有IIC 可以节省一个IO口的 这个也是个优势 , 速度不大的话不太好
还有没有更好的 类似7290的芯片啊 io模拟的做过,硬件IIC的没用过 标记以后再做 不过我用PS2 搞定了呵呵 感觉ZLG7290不太好用,CH451还行 kinggink888...
看不到你的电路图,能给我看看么。。。我在用7290 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 是哪里来的??》 MK ???不懂。。
88488848可不可以说详细一点,谢谢。 我做的,测试成功的! 点击此处下载 ourdev_501436.rar(文件大小:98K) (原文件名:ATMEGA16 at 16MHZ.rar) 不错的东东 初来乍到,study 有用stm32驱动的吗? 请问大家,如果有键按下,正要读的时候,定时器中断来了,等处理完中断函数,回来发现读键值的函数死了。有这种情况吗。是不是长时间不读键值,这个键值就清零了?
页:
[1]