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();//显示内容初始化
}
正在阅读:
TM1629驱动程序08-26
汉初黄老之学的内涵及其兴盛原因09-11
三分部无砟轨道施工组织设计 - 图文11-01
计量经济学名词12-21
火车头采集器使用手册09-05
1下列逻辑电路中为时序逻辑电路的是03-22
高中生入党申请书范文05-23
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 驱动程序
- TM1629
- xxxx小学政府购买社会组织公益服务项目申报书
- 理论力学(高起专)阶段性作业4
- 五金仓库管理及表格
- 物流运输与实训实习资料
- 基于GIS的昆明市地下排水管线数据库的建设
- 一种应用于UDP网络通讯状态机的智能定时器的软件实现
- 中国光通讯产品市场发展研究及投资前景报告(目录)
- 【精品一轮 特效提高】2014高考总复习(理数)-题库:8.8 立体几何中的向量方法(Ⅱ)----求空间角、距离
- 2002年劳动社会保障事业发展状况分析(三、四)
- 内镜室管理制度
- 法理学试题库
- 最新精编 人教版 八年级语文上册 第四单元 综合性学习 走上辩论台学案
- 幸福家庭事迹材料2
- 产学研合作科技创新模式的拓展——科技创新供需网模式
- 基础会计学第二章第一节
- 多级离心泵内部流场数值模拟与节能技术研究
- 毕业论文家具商场顾客体验对消费者购买行为的影响研究 ————以宁波宜家家居为例
- 氧气、液化气、丙烷气、煤气设备维修、抽堵盲板阀管理规定
- 2013考研外国美术史名词解释复习资料(全)
- 广州牛津版八年级下英语U2 More practice