请教TM1722驱动7段LCD的显示

2020-01-26 12:53发布

如下,写了个采用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)
  {
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
mandey
1楼-- · 2020-01-26 16:01
怎样不正确法?段不对?还是根本没显示?没图你说个JB
mTouch
2楼-- · 2020-01-26 16:54
本帖最后由 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
lxa0
3楼-- · 2020-01-26 20:52
检查驱动TM1722的时序~~~~~~~~~
ilikemcu
4楼-- · 2020-01-26 23:56
 精彩回答 2  元偷偷看……
mTouch
5楼-- · 2020-01-27 03:25
学习了!
   初次接触这样的东西,还有许多不明白的地方!
   边看边学,现在明白了一点,要显示"8888",按照我自己的SEG对应,在地址2,3,6,7必须写入0xFF.
   看来程序里面段码对照表有大问题.
    也就是TM1722_Write_Word中写如对应地址的值 有问题!
mTouch
6楼-- · 2020-01-27 08:25
ilikemcu 发表于 2013-3-22 20:36
TM1722驱动1/2偏置的LCD,我自己亲测没成功,显示效果很差,咨询厂家也说不出个所以然来,但是该LCD已经批 ...

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

一周热门 更多>