搜索
bottom↓
回复: 10

请教TM1722驱动7段LCD的显示

[复制链接]

出0入0汤圆

发表于 2013-3-22 17:22:01 | 显示全部楼层 |阅读模式
如下,写了个采用TM1722芯片驱动的7段LCD显示程序,但是无法正确显示!
如: 显示 1234
有用过TM1722芯片,请指教一下!

//  AT89C2051 @12MHZ   7-Seg  LCD  display
#include <reg51.h>
#include <intrins.h>

#define  DIGIT_LENGTH  4
#define  CS_DELAY      10    //2

typedef unsigned char uchar;
typedef unsigned int uint;


sbit TM1722_DIO   = P3^3;
sbit TM1722_CLK   = P3^4;
sbit TM1722_STB   = P3^5;

sbit CLR_ZERO     = P3^7;   // I2C AT24C01 清零
                                                  
                //            0    1    2    3    4    5    6    7    8    9   10    11   12   13   14   15  16   17  18   19           20
                //段码表      0    1    2    3    4    5    6    7    8    9    A    b    C    d    E    F    V   -    _    空
const unsigned char  seg_lcd[]={0x7d,0x60,0x3e,0x7a,0x63,0x5B,0x5f,0x70,0x7f,0x7B,0x77,0x4f,0xB8,0x76,0xF8,0xE8,0x6D,0x40,0x10,0x00,0xff};


void TM1722_Init(void);
void Delayms(uint time);
void TM1722_Write_Byte(unsigned char dat);
void TM1722_Write_String(unsigned char addr,unsigned char *dat,unsigned char count);

//***************延时函数*************************
void delay(uchar n)
{
        uchar x;
        for(x=0;x<n;x++)
        ;
}

/******************************************
函数:写一字节函数
参数:dat---写入的一字节数据
返回值:无
******************************************/
void TM1722_Write_Byte(unsigned char dat)
{
  unsigned char i;
  Delayms(2);       //用于片选信号的延时
  TM1722_STB=0;     //有效的片选信号
  for(i=0;i<8;i++)
  {
   TM1722_CLK=0;
   TM1722_DIO=dat&0x01;
   TM1722_CLK=1;    //时钟上升沿,送入一位数据
   dat>>=1;      
  }
  Delayms(2);  //用于片选信号的延时
}

/******************************************
函数:写一字节函数
参数:dat---写入的一字节数据
返回值:无
******************************************/
void TM1722_Write_Word(unsigned char addr,unsigned char dat)
{
  unsigned char Temp;
  TM1722_Write_Byte(0x40);   //采用地址自动加1(40H)
  TM1722_Write_Byte(0xc0+addr);//显示寄存器的00H单元开始
  Temp=seg_lcd[dat];               //数据解析
  TM1722_Write_Byte(Temp);     //给显示寄存器送数据,
  Delayms(CS_DELAY);           //用于片选信号的延时
  TM1722_STB=1;
}
/********************************************
函数:地址自动加一显示函数
参数:addr---显示字符串的起始地址
   *dat---显示数据的数组指针
   count---需要显示的数据的个数
返回值:无
********************************************/
void TM1722_Write_String(unsigned char addr,unsigned char *dat,unsigned char count)
{
  unsigned char i,Temp;
  TM1722_Write_Byte(0x40);
  TM1722_Write_Byte(0xc0+addr); //显示寄存器的00H单元开始
  for(i=0;i<count;i++)
  {   
    Temp=seg_lcd[*dat];                  //数据解析
    TM1722_Write_Byte(Temp);  //给显示寄存器送数据,
    dat++;
  }
  Delayms(CS_DELAY);           //用于片选信号的延时
  TM1722_STB=1;
}

/*******************************************
函数:PWM输出控制函数
参数:addr---选择哪一路PWM输出:0、1、2、3
   dat---输出的PWM的数据
返回值:无
*******************************************/   
void TM1722_Write_PWM(unsigned char addr,unsigned char dat)
{
  TM1722_Write_Byte(0x41);  //PWM设定、采用固定地址
  TM1722_Write_Byte(0xc0+addr);  //PWM控制地址设定
  TM1722_Write_Byte(dat);
  TM1722_STB=1;
}

void Delayms(uint time)
{
    uint i,j;
    for (i = 0;i <time;i++)
    for (j = 0;j != 0xff;j++) ;
}

/*****************************************
函数:TM1722的初始化函数
参数:无
返回值:无
*****************************************/
void TM1722_Init(void)
{
  Delayms(2);              //等待电压稳定
  TM1722_STB=1;            //端口配置初始化
  TM1722_CLK=1;
  TM1722_DIO=1;
  TM1722_Write_Byte(0x10); //显示模式
  TM1722_STB=1;
  TM1722_Write_Byte(0x97); //显示开
  TM1722_STB=1;
  TM1722_Write_String(0,"",DIGIT_LENGTH);
}

void main(void)
{
  EA=0;
  P3=0xff;
  TM1722_Init();
  TM1722_Write_PWM(3,0x00);
  Delayms(2);

  TM1722_Write_Word(2,1);
  Delayms(10);
  TM1722_Write_Word(2,2);
  Delayms(10);
  TM1722_Write_Word(6,3);
  Delayms(10);
  TM1722_Write_Word(7,4);
  Delayms(10);

  delay(10);
  while(1)
  {
  }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-3-22 17:31:16 | 显示全部楼层
怎样不正确法?段不对?还是根本没显示?没图你说个JB

出0入0汤圆

 楼主| 发表于 2013-3-22 17:39:11 | 显示全部楼层
本帖最后由 mTouch 于 2013-3-22 17:43 编辑

段不对!
TM1722的接线图
     TM1722                      7-Seg LCD
        COM0                        COM0
        COM1                        COM1
        COM2                        COM2
        COM3                        COM3
        SEG4                          A
        SEG5                          B
        SEG6                          C
        SEG7                          D
        SEG12                        E
        SEG13                        F
        SEG14                        G

                                      MCU
         DIO                          P3^3
         CLK                          P3^4
         STB                          P3^5

出0入0汤圆

发表于 2013-3-22 20:19:24 | 显示全部楼层
检查驱动TM1722的时序~~~~~~~~~

出0入50汤圆

发表于 2013-3-22 20:36:16 | 显示全部楼层
TM1722驱动1/2偏置的LCD,我自己亲测没成功,显示效果很差,咨询厂家也说不出个所以然来,但是该LCD已经批量应用在其它设备上。
1/3偏置的代码,已经验证应用:

//-----------------------------------------------------------------------------
// 向TM1722传送一个字节的数据
//-----------------------------------------------------------------------------
void w_tm1722_1byte( unsigned char temp )// 向TM1722传送一个字节的数据
{
        unsigned char i;

        for ( i = 8; i > 0; i-- )
        {
                TM1722_CLK_0();

                if( temp & 0x01 )
                {
                        TM1722_DIO_1();
                }
                else
                {
                        TM1722_DIO_0();
                }
               
                temp >>= 1;
                TM1722_CLK_1();
                _nop_();
                _nop_();
        }
}
//-----------------------------------------------------------------------------
// 向TM1722传送一帧完整数据
//-----------------------------------------------------------------------------
void r_tm1722( void )
{
        unsigned char i;
//---------------------------------------------       
        TM1722_STB_0();
        _nop_();
        _nop_();
        w_tm1722_1byte( 0x03 );        // 设置显示模式
        TM1722_STB_1();
        _nop_();
        _nop_();
//---------------------------------------------       
        TM1722_STB_0();
        _nop_();
        _nop_();
        w_tm1722_1byte( 0x40 );        // 地址自动加一方式
        TM1722_STB_1();
        _nop_();
        _nop_();
//---------------------------------------------       
        TM1722_STB_0();
        _nop_();
        _nop_();
        w_tm1722_1byte( 0xc0 );        // 设置起始地址(实际是0x00)
        _nop_();
        _nop_();
//---------------------------------------------       
        for( i = 0; i < 16; i++ )
        {
                w_tm1722_1byte( dis_buf[i] );
        }
        TM1722_STB_1();
        _nop_();
        _nop_();
//---------------------------------------------       
        TM1722_STB_0();
        _nop_();
        _nop_();
        w_tm1722_1byte( 0x97 );        // 设置LCD亮度
       
        TM1722_STB_1();
        _nop_();
        _nop_();
}
//-----------------------------------------------------------------------------
// 16进制长整型数转换为显示字符,存放到显示缓冲区
//-----------------------------------------------------------------------------
void hex2dis( unsigned long dat, unsigned char num )
{
        unsigned char i;
       
        for( i = num; i > 0; i-- )
        {
                if( i > 4 )
                {
                        dis_buf[lcd_status[( i - 1 )]] = s_num_list[( dat % 10 )];
                }
                else
                {
                        dis_buf[lcd_status[( i - 1 )]] = num_list[( dat % 10 )];
                }
                dat /= 10;
        }
}

出0入0汤圆

 楼主| 发表于 2013-3-22 23:53:54 | 显示全部楼层
学习了!
   初次接触这样的东西,还有许多不明白的地方!
   边看边学,现在明白了一点,要显示"8888",按照我自己的SEG对应,在地址2,3,6,7必须写入0xFF.
   看来程序里面段码对照表有大问题.
    也就是TM1722_Write_Word中写如对应地址的值 有问题!

出0入0汤圆

 楼主| 发表于 2013-3-22 23:55:34 | 显示全部楼层
ilikemcu 发表于 2013-3-22 20:36
TM1722驱动1/2偏置的LCD,我自己亲测没成功,显示效果很差,咨询厂家也说不出个所以然来,但是该LCD已经批 ...

弱弱问一句:
    lcd_status 和num_list的值是啥哦?
    能否把这二个的数据放出来?

出0入0汤圆

发表于 2013-3-24 19:55:55 | 显示全部楼层
ilikemcu 发表于 2013-3-22 20:36
TM1722驱动1/2偏置的LCD,我自己亲测没成功,显示效果很差,咨询厂家也说不出个所以然来,但是该LCD已经批 ...

1/2偏置的偏差有问题,我们1/2偏压的液晶,要设置成1/3偏压才能正确显示.不知道是不是芯片的问题.

出0入0汤圆

 楼主| 发表于 2013-3-25 11:40:19 | 显示全部楼层
经过测试, 自己写的程序没有问题,是段码表不对!
按照选LCD以及TM1722连接,对应的段码表:
const unsigned char _7seg_font[][4]={
  {0x88,0x08,0x88,0x08},       //0
  {0x80,0x00,0x80,0x00},       //1
  {0x88,0x80,0x08,0x08},       //2
  {0x88,0x80,0x80,0x08},       //3
  {0x80,0x88,0x08,0x00},       //4
  {0x08,0x88,0x80,0x08},       //5
  {0x08,0x88,0x88,0x08},       //6
  {0x88,0x00,0x80,0x00},       //7
  {0x88,0x88,0x88,0x08},       //8
  {0x88,0x88,0x80,0x08},       //9
  {0x00,0x00,0x00,0x00},           //空
      };        
修改下列的函数即可
void TM1722_Write_Word(unsigned char addr,unsigned char nIndex,unsigned char dat)
{
  unsigned char Temp;
  TM1722_Write_Byte(0x40);   //采用地址自动加1(40H)
  TM1722_STB=1;
  TM1722_Write_Byte(0xc0+addr);//显示寄存器的00H单元开始
  Temp=_7seg_font[nIndex][dat];
  TM1722_Write_Byte(Temp);     //给显示寄存器送数据,
  Delayms(CS_DELAY);           //用于片选信号的延时
  TM1722_STB=1;
}   

显示"9"如下
TM1722_Write_Word(2,9,0);                //显示 “9”
  Delayms(10);
  TM1722_Write_Word(3,9,1);
  Delayms(10);
  TM1722_Write_Word(6,9,2);
  Delayms(10);
  TM1722_Write_Word(7,9,3);
  Delayms(10);

出0入0汤圆

 楼主| 发表于 2013-3-28 10:19:03 | 显示全部楼层
串口系列-驱动IC 发表于 2013-3-25 13:16
TM1722你跟天微原厂拿货?怎么不问原厂

   呵呵,是跟自己选的LCD有关!

出0入0汤圆

发表于 2013-10-20 15:02:09 | 显示全部楼层
我最近在弄汇编,也是TM1722驱动液晶显示。过来学习一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 16:16

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

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