请教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条回答
lmt50211
1楼-- · 2020-01-27 13:58
ilikemcu 发表于 2013-3-22 20:36
TM1722驱动1/2偏置的LCD,我自己亲测没成功,显示效果很差,咨询厂家也说不出个所以然来,但是该LCD已经批 ...

1/2偏置的偏差有问题,我们1/2偏压的液晶,要设置成1/3偏压才能正确显示.不知道是不是芯片的问题.
mTouch
2楼-- · 2020-01-27 15:43
经过测试, 自己写的程序没有问题,是段码表不对!
按照选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);
mTouch
3楼-- · 2020-01-27 18:03
 精彩回答 2  元偷偷看……
LUCHAOJIE
4楼-- · 2020-01-27 21:06
我最近在弄汇编,也是TM1722驱动液晶显示。过来学习一下。

一周热门 更多>