如下,写了个采用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)
{
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
按照选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);
一周热门 更多>