5252|8

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

zlg7290驱动数码管显示 [复制链接]

我板子上的8段数码管是用zlg7290芯片驱动的。芯片上的IICSDA管脚连接S3C2410的IICSDA/GPE14管脚,IICSCL管脚与S3C2410的IICSCL/GPE15管脚相连。这块芯片的读写好像要用到I2C总线,对I2C总线的读写操作我一直搞不明白。

下面的程序是板子的例子,它是循环显示0---9十个数字(共阴极的)
zlg7290的从地址是0x70  显示寄存器地址是0x10 -- 0x17

/**************************************************************************
* File:                8led.c
* Author:        Embest       
* Desc:                8-segment digit LED control functions
* History:       
***************************************************************************

/*-----------------------------------------------------------------------*/
/*include files*/
/*-----------------------------------------------------------------------*/
#include "2410lib.h"

/*-----------------------------------------------------------------------*/
/*global variables*/
/*-----------------------------------------------------------------------*/
unsigned char f_szDigital[10] ={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};        // 0 ~ 9               

/*-----------------------------------------------------------------------*/
/*functions declare*/
/*-----------------------------------------------------------------------*/
void led8_test(void);
/*************************************************************************
* name:                led8_test()
* func:                test 8led
* para:                none
* ret:                none
* modify:
* comment:        write data to display buffer of ZLG7290,then we can see figure scrolling on LED.       
**************************************************************************/
void led8_test(void)
{
int i, j, k;
       
uart_printf("\n 8-segment Digit LED Test Example (Please look at LED)\n");
iic_init_8led();
for(;;)
{
        for(j=0; j<10; j++)
        {
                for(i=0; i<8; i++)
                {
                        k = 9-(i+j)%10;
                          //write to DpRam0~DpRam7 of ZLG7290
                        iic_write_8led(0x70, 0x10+i, f_szDigital[k]);       
                }
                delay(10000);
        }
  }

}



/**************************************************************************
* File:                iic.c
* Author:        Embest
* Desc:                iic source code
* History:       
*                        Y.J.Guo, Programming modify, April 2, 2005
**************************************************************************/

/*-----------------------------------------------------------------------*/
/*include files*/
/*-----------------------------------------------------------------------*/
#include "2410lib.h"
#include "iic_8led.h"
/*-----------------------------------------------------------------------*/
/*global variables        */
/*-----------------------------------------------------------------------*/
int f_nGetACK;
/*-----------------------------------------------------------------------*/
/*function declare        */
/*-----------------------------------------------------------------------*/
void iic_int_8led(void) __attribute__ ((interrupt ("IRQ")));
void iic_init_8led(void);
void iic_write_8led(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T ucData);
void iic_read_8led(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T *pData);

/*************************************************************************
* name:                iic_init_8led()
* func:                initialize iic
* para:                none
* ret:                none
* modify:
* comment:               
**************************************************************************/
void iic_init_8led(void)
{
    f_nGetACK = 0;

    // Enable interrupt
    rINTMOD = 0x0;
    rSRCPND = rSRCPND;                 // clear all interrupt
    rINTPND = rINTPND;                 // clear all interrupt
    rINTMSK &= ~BIT_IIC;
    pISR_IIC= (unsigned)iic_int_8led;

    // Initialize iic
    rIICADD = 0x10;        // S3C2410X slave address
    rIICCON = 0xef;        // Enable ACK, interrupt, set IICCLK=MCLK/512
    rIICSTAT= 0x10;        // Enable TX/RX
}

/************************************************************************
* name:                iic_write_8led()
* func:                write data to iic
* para:                unSlaveAddr --- input, chip slave address
*                        unAddr        --- input, data address
*                        ucData        --- input, data value
* ret:                none
* modify:
* comment:               
**************************************************************************/
void iic_write_8led(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T ucData)
{
        f_nGetACK = 0;
   
    // Send control byte
    rIICDS = unSlaveAddr;        // 0x70
    rIICSTAT = 0xf0;        // Master Tx,Start  这里会使IICCON = 0xff ???
    while(f_nGetACK == 0);        // Wait ACK
    f_nGetACK = 0;
   
    // Send address
    rIICDS = unAddr;
    rIICCON = 0xef;        // Resumes IIC operation.这里会使IICSTAT=0xf1 ?
    while(f_nGetACK == 0);        // Wait ACK
    f_nGetACK = 0;
   
    // Send data
    rIICDS = ucData;
    rIICCON = 0xef;        // Resumes IIC operation.
    while(f_nGetACK == 0);        // Wait ACK
    f_nGetACK = 0;
   
    // End send
    rIICSTAT = 0xd0;        // Stop Master Tx condition
    rIICCON = 0xef;        // Resumes IIC operation.这里会改变IICDS的值!!
    delay(5);                // Wait until stop condtion is in effect.
}
       
/************************************************************************
* name:                iic_read_8led()
* func:                read data from iic
* para:                unSlaveAddr        --- input, chip slave address
*                        unAddr                --- input, data address
*                        pData                --- output, data pointer
* ret:                none
* modify:
* comment:               
*************************************************************************/
void iic_read_8led(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T *pData)
{
        char cRecvByte;
       
        f_nGetACK = 0;

    // Send control byte
    rIICDS = unSlaveAddr;        // Write slave address to IICDS
    rIICSTAT = 0xf0;        // Master Tx,Start
    while(f_nGetACK == 0);        // Wait ACK
    f_nGetACK = 0;

    // Send address
    rIICDS = unAddr;
    rIICCON = 0xef;        // Resumes IIC operation.
    while(f_nGetACK == 0);        // Wait ACK
    f_nGetACK = 0;

    // Send control byte
    rIICDS = unSlaveAddr;        // 0x70
    rIICSTAT = 0xb0;        // Master Rx,Start
    rIICCON = 0xef;        // Resumes IIC operation.   
    while(f_nGetACK == 0);        // Wait ACK
    f_nGetACK = 0;
   
    // Get data
    cRecvByte = rIICDS;
    rIICCON = 0x2f;
    delay(1);
   
    // Get data
    cRecvByte = rIICDS;
   
    // End receive
    rIICSTAT = 0x90;        // Stop Master Rx condition
    rIICCON = 0xef;        // Resumes IIC operation.
    delay(5);                // Wait until stop condtion is in effect.
       
    *pData = cRecvByte;
}

/*************************************************************************
* name:                iic_int_8led()
* func:                IIC interrupt handler
* para:                none
* ret:                none
* modify:
* comment:               
**************************************************************************/
void iic_int_8led(void)
{
    ClearPending(BIT_IIC);
        f_nGetACK = 1;
}
我先向0x10中写入0xFC这时0x10对应的数码管显示0 然后我再用iic_read_8led读的时候发现读出来的数据不是0xFC,这是为什么呢?

还有我单步跟踪的时候发现IICSTAT IICCON IICDS这些寄存器有时一个一改变,其他也会自动改变,不明白这是为什么。这里应该是我写进去0xFC读出来却不是0xFC原因,为什么是这样我不明白。

麻烦请大家给个主意~~  谢谢了~~! 我卡在这里已经3天了,晕啊~~~!!!

跪谢~!

最新回复

这一版块,太没人气了,是不是大家都成大侠了 如果成大侠了,也常回家看看嘛,家里太冷清了 据说努力顶帖也是一种美德,但我只想大家常回家看看 毕竟每天都有新手需要帮忙,而我能帮的只能是把帖子顶起来  详情 回复 发表于 2008-4-4 00:50
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
zlg7290内部寄存器有一个字符表,你输入的数据,它自己会处理,送显!
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
对zlg7290读写数据要用到IIC总线,好像每次我读出来的数据不是前面我写进去的数据

假如我给IICDS写0xFF  可再读出来就不是0xFF了。晕啊~~~
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
我也不明白,另外请问各位大师:f_nGetACK不是一个变量吗,为什么可以通过while(f_nGetACK == 0);// Wait ACK         来判断ack是否到来?f_nGetACK的植是如何改变的?
多谢各位大师指点.我的邮箱lu_xichen@163.com
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
我也不明白,另外请问各位大师:f_nGetACK不是一个变量吗,为什么可以通过while(f_nGetACK == 0);// Wait ACK         来判断ack是否到来?f_nGetACK的植是如何改变的?
多谢各位大师指点.我的邮箱lu_xichen@163.com
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

6
 
那些寄存器,其实可能并不是一个寄存器,只不过是在相同的地址上,这在处理器的片内
设备中很常见。

f_nGetACK也许是某个库提供的变量,你应参考它的文档
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
f_nGetACK

我觉得是 操作函数的返回值, 根据返回值来判断,你刚才的操作是否正确完成!

zlg7290 是iic接口的,我觉得还可以吧 呵呵,挺好用的
我在2410板上选用了,做了键盘接口
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
f_nGetACK的值是在IIC中断里修改为1,这时就跳出while循环.也就是说当一个数据发送或接受完毕时,产生IIC中断,在中断中把
f_nGetACK=1;然后中断返回,这是程序就跳出while循环,接着执行下面的语句.英蓓特给的实验程序把f_nGetACK定义为全局int变量,我认为应该修改为volatile int,中断中的公共变量应该定义为volatile.
我兄弟在调试IIC实验中出现一个问题,就是程序一执行到while这条语句就停在那里,也就是IIC中断没有发生.反汇编一下,发现
程序停在0x14c :bl 0xi4c.请哪位大虾指点一下什么原因,为什么IIC中断没有产生.
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 
这一版块,太没人气了,是不是大家都成大侠了

如果成大侠了,也常回家看看嘛,家里太冷清了

据说努力顶帖也是一种美德,但我只想大家常回家看看

毕竟每天都有新手需要帮忙,而我能帮的只能是把帖子顶起来
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表