TM1629驱动程序

更新时间:2023-08-26 06:44:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

TM1629-LED和键盘扫描驱动程序代码

include<def.h>
#define modeset 0x00 //对于TM1629无效,对于1721都配置为SEG引脚
#define writedatamode_z 0x40 //采用地址自动加一方式写显存
#define writedatamode_g 0x44 //采用固定地址方式写显存
#define startaddress 0xc0 //起始地址
#define readkeymode 0x42 //读按键
#define leddisconmode 0x8a //LED显示控制
#define lcddisconmode 0x94 //LCD显示控制
#define datacount 0x10 //采用地址自动加一方式传输数据的个数

uchar code buf_led[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //存放共阴数码管的段代码,不带小数点
uchar code buf_ledp[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; //存放共阴数码管的段代码,带小数点
//money
uchar code buf_lcd[10]= {0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED}; //存放共阴数码管的段代码,不带小数点
uchar code buf_lcdp[10]={0xFB,0x70,0xD7,0xF5,0x7C,0xBD,0xBF,0xF0,0xFF,0xFD}; //存放共阴数码管的段代码,带小数点
//weight
//uchar code buf_lcd[10]= {0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE};
//uchar code buf_lcdp[10]={0xbf,0x07,0x7d,0x5f,0xC7,0xDb,0xFb,0x0f,0xFf,0xDf};
uchar data buf_ser[16]={0}; //存放送到LED驱动芯片显存中的值
//------------------------------------------------LED串行写1BYTE数据开始----------------------------------------------------------------------
void indata(char p)
{
unsigned int i;
STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态,保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++)
{
CLK=0; //先将“CLK”清零
if((p&0x01)!=0)
{
DIO=1; //需要传送的数据的低位为“1”,则把“DIO”清零
}
else
{
DIO=0; //需要传送的数据的低位为“0”,则把“DIO”置高
}
CLK=1; //送时钟的上升沿
p=p>>1; //准备送下一个BIT
_nop_();
_nop_();
_nop_();
_nop_();
} //送完一个字节后退出循环
}
//------------------------------------------------LED串行写1BYTE数据结束----------------------------------------------------------------------
#ifdef ONKEYSCAN
//------------------------------------------------LED串行读1BYTE数
据开始-----------------------------------------------------------------------
//输出8BIT数据
//在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据
unsigned

TM1629-LED和键盘扫描驱动程序代码

char outdata()
{
unsigned char i,k=0; //i——控制循环次数,k——临时保存读到的数据
DIO=1; //释放DIO为输入
STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态,保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++)
{
CLK=0; //先将“CLK”清零
k=k>>1;
if(DIO==0)
{
k=k&0x7f; //如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变
}
else
{
k=(k|0x80&0xff); //如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变
}
CLK=1; //送时钟的上升沿
} //送完一个字节后退出循环
return(k); //返回读到的1字节数据
}
//------------------------------------------------LED串行读1BYTE数据结束-----------------------------------------------------------------------
#endif
//------------------------------------------------采用地址自动加一方式传输显示内容-------------------------------------------------------------
void ser_display_a()
{
uint j; //j——控制本次需要传多少个字节显示数据
uchar tempdis;
tempdis=0;
DIO=1;
CLK=1;
STB=1; //通讯开始前通讯端口全部初始化为“1”
indata(modeset); //传输模式设置命令
STB=1;
indata(writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据
STB=1; //数据设置命令传完后需要将“STB”置“1”
indata(startaddress); //传起始地址
//地址命令传完后,“STB”保持为“0”继续传需要显示的数据
for(j=0;j<datacount;j++)
{
if((disbit==0)&&(j>5))
{
tempdis=(buf_ser[j]<<4)&0xf0;
buf_ser[j]=(buf_ser[j]>>4)&0x0f;
buf_ser[j]|=tempdis;
}
indata(buf_ser[j]); //在连续传显示的数据过程中,STB保持为0
}
STB=1; //传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
if(disbit==1)
{
indata(leddisconmode); //传LED显示控制命令
}
else
{
indata(lcddisconmode); //传LCD显示控制命令
}
STB=1; //显示控制命令传完后将“ST
B”置“1”
}
//采用固定地址方式
void ser_display_g(uchar address,uchar disa)
{
DIO=1;
CLK=1;
STB=1; //通讯开

TM1629-LED和键盘扫描驱动程序代码

始前通讯端口全部初始化为“1”
indata(writedatamode_g); //传数据设置命令,设置采用固定地址模式
STB=1;
indata(address); //传显示数据对应的地址
indata(disa); //保持“STB”=“0”,传1BYTE显示数据
STB=1; //传完显示数据后将“STB”置“1”
if(disbit==1)
{
indata(leddisconmode); //传LED显示控制命令
}
else
{
indata(lcddisconmode); //传LCD显示控制命令
}
STB=1; //显示控制命令传完后将“STB”置“1”
}
//------------------------------------------上电自检------------------------------------------------
void discheck()
{
uchar disi,discyc,disdata;
uchar tempdis,tempdisl;
for(discyc=0;discyc<10;discyc++)
{
if(disbit==1)
{
disdata=buf_ledp[discyc];
}
else
{
disdata=buf_lcdp[discyc];
}
DIO=1;
CLK=1;
STB=1; //通讯开始前通讯端口全部初始化为“1”
indata(writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据
STB=1; //数据设置命令传完后需要将“STB”置“1”
indata(startaddress); //传起始地址

//地址命令传完后,“STB”保持为“0”继续传需要显示的数据
for(disi=0;disi<datacount;disi++)
{
tempdis=disdata;
if((disbit==0)&&(disi>5))
{
tempdis= ((disdata<<4)&0xf0);
tempdisl=((disdata>>4)&0x0f);
tempdis|=tempdisl;
}
indata(tempdis); //在连续传显示的数据过程中,“STB”一直保持为”0“
}

STB=1; //传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
if(disbit==1)
{
indata(leddisconmode); //传LED显示控制命令
}
else
{
indata(lcddisconmode); //传LCD显示控制命令
}
STB=1; //显示控制命令传完后将“STB”置“
adcdata_int=adccon(); //启动ADC,采集初始数据作为每次测量的极小值
}
ser_display_a(); //显示内容初始化
}

#inc
lude<def.h>
#define modeset0x00//对于TM1629无效,对于1721都配置为SEG引脚
#definewritedatamode_z0x40//采用地址自动加一方式写显存
#define writeda

TM1629-LED和键盘扫描驱动程序代码

tamode_g0x44//采用固定地址方式写显存
#define startaddress0xc0//起始地址
#definereadkeymode0x42//读按键
#defineleddisconmode0x8a//LED显示控制
#definelcddisconmode0x94//LCD显示控制
#define datacount0x10//采用地址自动加一方式传输数据的个数

uchar code buf_led[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//存放共阴数码管的段代码,不带小数点
uchar code buf_ledp[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};//存放共阴数码管的段代码,带小数点
//money
uchar code buf_lcd[10]= {0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED};//存放共阴数码管的段代码,不带小数点
uchar code buf_lcdp[10]={0xFB,0x70,0xD7,0xF5,0x7C,0xBD,0xBF,0xF0,0xFF,0xFD};//存放共阴数码管的段代码,带小数点
//weight
//uchar code buf_lcd[10]= {0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE};
//uchar code buf_lcdp[10]={0xbf,0x07,0x7d,0x5f,0xC7,0xDb,0xFb,0x0f,0xFf,0xDf};
uchar data buf_ser[16]={0};//存放送到LED驱动芯片显存中的值
//------------------------------------------------LED串行写1BYTE数据开始----------------------------------------------------------------------
void indata(char p)
{
unsigned int i;
STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态,保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++)
{
CLK=0;//先将“CLK”清零
if((p&0x01)!=0)
{
DIO=1;//需要传送的数据的低位为“1”,则把“DIO”清零
}
else
{
DIO=0; //需要传送的数据的低位为“0”,则把“DIO”置高
}
CLK=1;//送时钟的上升沿
p=p>>1;//准备送下一个BIT
_nop_();
_nop_();
_nop_();
_nop_();
}//送完一个字节后退出循环
}
//------------------------------------------------LED串行写1BYTE数据结束----------------------------------------------------------------------
#ifdef ONKEYSCAN
//------------------------------------------------LED串行读1BYTE数据开始-----------------------------------------------------------------------
//输出8BIT数据
//在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据
unsigned char outdata()
{
unsigned char i,k=0;//i——控制循环次数,k——临时保存读到的数据
DIO=1;//释放DIO为输入
STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态,保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++)
{
CLK=0; //先将“CLK”清零
k=k>>1
;
if(DIO==0)
{
k=k&0x7f;//如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变
}
else
{
k=(k|0x80&0xff);//如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变

TM1629-LED和键盘扫描驱动程序代码

}
CLK=1; //送时钟的上升沿
} //送完一个字节后退出循环
return(k);//返回读到的1字节数据
}
//------------------------------------------------LED串行读1BYTE数据结束-----------------------------------------------------------------------
#endif
//------------------------------------------------采用地址自动加一方式传输显示内容-------------------------------------------------------------
void ser_display_a()
{
uint j;//j——控制本次需要传多少个字节显示数据
uchartempdis;
tempdis=0;
DIO=1;
CLK=1;
STB=1;//通讯开始前通讯端口全部初始化为“1”
indata(modeset); //传输模式设置命令
STB=1;
indata(writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据
STB=1;//数据设置命令传完后需要将“STB”置“1”
indata(startaddress);//传起始地址
//地址命令传完后,“STB”保持为“0”继续传需要显示的数据
for(j=0;j<datacount;j++)
{
if((disbit==0)&&(j>5))
{
tempdis=(buf_ser[j]<<4)&0xf0;
buf_ser[j]=(buf_ser[j]>>4)&0x0f;
buf_ser[j]|=tempdis;
}
indata(buf_ser[j]);//在连续传显示的数据过程中,STB保持为0
}
STB=1;//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
if(disbit==1)
{
indata(leddisconmode);//传LED显示控制命令
}
else
{
indata(lcddisconmode);//传LCD显示控制命令
}
STB=1; //显示控制命令传完后将“STB”置“1”
}
//采用固定地址方式
void ser_display_g(uchar address,uchar disa)
{
DIO=1;
CLK=1;
STB=1;//通讯开始前通讯端口全部初始化为“1”
indata(writedatamode_g);//传数据设置命令,设置采用固定地址模式
STB=1;
indata(address);//传显示数据对应的地址
indata(disa);//保持“STB”=“0”,传1BYTE显示数据
STB=1;//传完显示数据后将“STB”置“1”
if(disbit==1)
{
indata(leddisconmode);//传LED显示控制命令
}
else
{
indata(lcddisconmode);//传LCD显示控制命令
}
STB=1; //显示控制命令传完后将“STB”置“1”
}
//------------------------------------------上电自检------------------------------------------------
void discheck()
{
uchar disi,discyc,disdata;
uchar tempdis,tempdisl;
for(discyc=0;discyc<10;discyc++)
{
if(disbit==1)
{
disdata=buf_ledp[discyc];
}
else
{
disdata=buf_lcdp[discyc];
}
DIO=1;
CLK=1;
STB=1;//通讯开始前通
讯端口全部初始化为“1”
indata(writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据
STB=1;//数据设置命令传完后需要将“STB”置“1”
indata(startaddress);//传起始地址


TM1629-LED和键盘扫描驱动程序代码

//地址命令传完后,“STB”保持为“0”继续传需要显示的数据
for(disi=0;disi<datacount;disi++)
{
tempdis=disdata;
if((disbit==0)&&(disi>5))
{
tempdis= ((disdata<<4)&0xf0);
tempdisl=((disdata>>4)&0x0f);
tempdis|=tempdisl;
}
indata(tempdis);//在连续传显示的数据过程中,“STB”一直保持为”0“
}

STB=1;//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
if(disbit==1)
{
indata(leddisconmode);//传LED显示控制命令
}
else
{
indata(lcddisconmode);//传LCD显示控制命令

}
STB=1; //显示控制命令传完后将“STB”置“
adcdata_int=adccon();//启动ADC,采集初始数据作为每次测量的极小值
}
ser_display_a();//显示内容初始化
}



本文来源:https://www.bwwdw.com/article/wd4i.html

Top