TM1629驱动程序.docx
《TM1629驱动程序.docx》由会员分享,可在线阅读,更多相关《TM1629驱动程序.docx(27页珍藏版)》请在冰豆网上搜索。
TM1629驱动程序
TM1629驱动程序(总8页)
E:
\Item\design\tmxxleddemo\sw\
/***************************************************************************************************
Filename:
Author:
Version:
Date:
MCU:
leddriverdemoprogramme
xcwy
leddemo
2006年7月21日
AT89S52
12M
keilc
Date:
Author:
Date:
Author:
xcwy
2006年12月17日
Modification:
1)修改为本公司通用的LED驱动程序
****************************************************************************************************/
#include<>
#include<>
#include<>
//**************************************************************************************************
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
tm1616
tm1618
tm1618a
tm1620
tm1620b
tm1623
tm1624
tm1626a
tm1626b
tm1626c
tm1626d
tm1628
tm1629
tm1629a
tm1629b
tm1629c
tm1629d
tm1638
tm1668
tw1628
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define
icmodel
tm1616
//这里选择的TM1616,更改“tm1616”可以得到其他型号IC的驱动程序
#ificmodel==tm1616
Page:
1
E:
\Item\design\tmxxleddemo\sw\
#defineseg
#definegrid
7
4
#definedismodel1
#elificmodel==tm1618
#defineseg
#definegrid
#definekey
5
7
3
#definedismodel4
#elificmodel==tm1618a
#defineseg
#definegrid
#definekey
7
5
4
#definedismodel2
#elificmodel==tm1620
#define
#define
seg
grid
8
6
#define
dismodel3
#elificmodel==tm1620b
#define
#define
#define
seg
grid
key
6
7
3
#define
dismodel4
#elificmodel==tm1623
#define
#define
#define
seg
grid
key
11
7
4
#define
dismodel4
#elificmodel==tm1624
#define
#define
seg
grid
11
7
#define
dismodel4
#elificmodel==tm1626a
#define
#define
#define
#define
#define
seg
grid
key
sw
led
10
7
5
2
6
#define
dismodel4
#elificmodel==tm1626b
#define
#define
#define
#define
#define
seg
grid
key
sw
led
11
7
5
4
6
#define
dismodel4
#elificmodel==tm1626c
#define
#define
#define
#define
seg
grid
key
led
11
7
5
1
#define
dismodel4
#elificmodel==tm1626d
#define
#define
#define
#define
seg
grid
key
led
10
7
5
1
#define
dismodel4
#elificmodel==tm1628
#define
#define
#define
seg
grid
key
10
7
4
#define
dismodel4
#elificmodel==tm1629
Page:
2
E:
\Item\design\tmxxleddemo\sw\
#define
#define
#define
seg
grid
key
16
8
4
#define
dismodel1
#elificmodel==tm1629a
#define
#define
seg
grid
16
8
#define
dismodel1
#elificmodel==tm1629b
#define
#define
#define
seg
grid
key
14
8
4
#define
dismodel1
#elificmodel==tm1629c
#define
#define
#define
seg
grid
key
15
8
4
#define
dismodel1
#elificmodel==tm1629d
#define
#define
#define
seg
grid
key
12
8
4
#define
dismodel1
#elificmodel==tm1638
#define
#define
#define
seg
grid
key
10
8
4
#define
dismodel1
#elificmodel==tm1668
#define
#define
#define
seg
grid
key
10
7
5
#define
dismodel1
#elificmodel==tw1628
#endif
#else
#error"你必须确认IC的型号是否存在"
#define
#define
#define
#define
seg
grid
key
dismodel
10
7
5
1
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
dissetmode
writedatamode_z
writeledmode_z
readkeymode
readswmode
writedatamode_g
writeledmode_g
startaddress
disconmode
datacount
0x03
0x40
0x41
0x42
0x43
0x44
0x45
0xc0
0x8c
2*grid
//显示模式设置
//采用地址自动加一方式写显存
//采用地址自动加一方式写LED显存命令
//读按键命令
//读SW口命令
//采用固定地址方式写显存
//采用固定地址方式写LED显存命令
//起始地址
//显示控制
//采用地址自动加一方式传输数据的个数
//定义全局变量
unsignedchark1,k2,k3,k4,k5;
unsignedda_sw;
//按键值寄存器
//SW寄存器
unsignedint
//端口的定义
count;
sbit
sbit
STB
CLK
=P2^0;
=P2^1;
sbit
sbit
DIO
SPEAK
=P2^2;
=P2^7;
//串行通讯口
//外接蜂鸣器,可以不必理会
//*********************************************子程序开始************************************
Page:
3
E:
\Item\design\tmxxleddemo\sw\
//----------------------------------------------延时程序开始---------------------------------
voiddelay(intk)
{
unsignedchari,j;
for(;k>0;k--)
for(j=255;j>0;j--)
for(i=255;i>0;i--);
}
//----------------------------------------------延时程序结束----------------------------------
//----------------------------------------------写入输入1个字节(8bit)到LED_IC程序开始---------
//输入8BIT数据
//在时钟的上升沿通过MCU向LED驱动IC——TM16xx写数据
voidindate(unsignedcharp)
{
unsignedinti;
STB=0;
//保证“STB”为低电平,程序不依赖于之前端口的状态
//保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++)
{
CLK=0;
//先将“CLK”清零
if((p&0x01)!
=0)
{
}
}
else
{
}
CLK=1;
p=p>>1;
DIO=1;
DIO=0;
//需要传送的数据的低位为“1”,则把“DIO”清零
//需要传送的数据的低位为“0”,则把“DIO”置高
//送时钟的上升沿
//准备送下一个BIT
//送完一个字节后退出循环
}
//----------------------------------------------写入输入1个字节(8bit)到LED_IC程序结束---------
//----------------------------------------------从LED_IC读入1个字节(8bit)程序开始-------------
//输出8BIT数据
//在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据
#ifdefkey
unsignedcharoutdate()
{
unsignedchari,k=0;
DIO=1;
STB=0;
//i——控制循环次数,k——临时保存读到的数据
//释放DIO为输入
//保证“STB”为低电平,程序不依赖于之前端口的状态
//保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++)
{
CLK=0;
k=k>>1;
if((P2&0x04)==0)
{
k=k&0x7f;
//先将“CLK”清零
//如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变
}
else
{
k=(k|0x80&0xff);//如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变
}
CLK=1;
}
return(k);
//送时钟的上升沿
//送完一个字节后退出循环
//返回读到的1字节数据
}
#endif
//----------------------------------------------从LED_IC读入1个字节(8bit)程序结束-----------
//----------------------------------------------采用地址自动加一方式传输地址和数据开始------
//采用地址自动加1方式
Page:
4
E:
\Item\design\tmxxleddemo\sw\
//上电后LED-DRIVER显存中的数据是随机的,上电后马上传显示控制命令字(打开显示),会出现乱码。
//为避免上述现象,用户可以先传显示控制命令将显示关掉(见应用手册中详细介绍),然后正常操作
//也可以先主动刷新LED-DRIVER显存中的数据。
然后开显示
//这里采用是第二种方法
voiddisplay(unsignedchardisa)
{
unsignedinti;
DIO=1;
CLK=1;
STB=1;
indate(writedatamode_z);
STB=1;
indate(startaddress);
//i——控制本次需要传多少个字节显示数据
//通讯开始前通讯端口全部初始化为“1”
//传数据设置命令,设置采用地址自动加1方式写显示数据,
//数据设置命令传完后需要将“STB”置“1”
//传起始地址
//地址命令传完后,“STB”保持为“0”继续传需要显示的数据
for(i=0;i{
indate(disa);
}
STB=1;
indate(disconmode);
STB=1;
//在连续传显示的数据过程中,“STB”一直保持为”0“
//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
//传显示控制命令
//显示控制命令传完后将“STB”置“1”
}
//----------------------------------------------采用地址自动加一方式传输地址和数据结束-------
//----------------------------------------------采用固定地址方式传输地址和数据开始-----------
//采用固定地址方式
voiddisplay2(unsignedcharadress,disa)
{
DIO=1;
CLK=1;
STB=1;
indate(writedatamode_g);
STB=1;
indate(adress);
indate(disa);
STB=1;
//通讯开始前通讯端口全部初始化为“1”
//数据设置命令
//传显示数据对应的地址
//保持“STB”=“0”,传1BYTE显示数据
//传完显示数据后将“STB”置“1”
}
//----------------------------------------------采用固定地址方式传输地址和数据结束-------------
//----------------------------------------------按键扫描程序开始------------------------------
//按键扫描
//只要定义了key都将执行按键扫描程序,且必须从低字节开始读
#ifdefkey
unsignedcharkeyscan()
{
STB=1;
indate(readkeymode);
//传数据设置命令,设置为读按键
//“STB”保持为“0”,读键值
//将读到的键值保存在MCU的寄存器中
//根据IC型号读指定字节,不允许多读,否则会造成读按键不稳定
if(key>=1)
k1=outdate();
if(key>=2)
k2=outdate();
if(key>=3)
k3=outdate();
if(key>=4)
k4=outdate();
if(key>=5)
k5=outdate();
STB=1;
return0;
//读键结束将“STB”置“1”
}
#endif
//----------------------------------------------按键扫描程序结束----------------------------------
Page:
5
E:
\Item\design\tmxxleddemo\sw\
//----------------------------------------------PWM数据传输开始-----------------------------------
#ifdefled
unsignedcharin_led()
{
STB=1;
indate(writeledmode_z);
STB=1;
//数据设置命令,设置为写LED显存
indate(0xc0);
indate(0x0f);
indate(0x0f);
indate(0x0f);
indate(0x00);
indate(0x0f);
indate(0x0f);
indate(0x0f);
indate(0x00);
//起始地址,这里的地址和
//LED1宽度设置
//LED2宽度设置
//LED3宽度设置
//关闭LED123同步调节
//LED4宽度设置
//LED5宽度设置
//LED6宽度设置
//关闭LED456同步调节
STB=1;
return0;
}
#endif
//----------------------------------------------PWM数据传输结束-------------------------------------
#ifdefled
unsignedcharin_led_g(unsignedcharadress_led,da_led)
{
STB=1;
indate(writeledmode_g);
STB=1;
indate(adress_led);
indate(da_led);
STB=1;
return0;
}
#endif
//----------------------------------------------读入SW口状态开始------------------------------------
#ifdefsw
unsignedcharout_sw()
{
STB=1;
indate(readswmode);
//数据设置命令,设置为读SW输入口
da_sw=outdate();
STB=1;
return0;
}
#endif
//----------------------------------------------读入SW口状态结束-----------------------------------
//*********************************************子程序结束******************************************
//*********************************************主程序开始******************************************
voidmain(void)
{
SPEAK=0;
DIO=1;
CLK=1;
STB=1;
indate(dissetmode);
//传显示模式设置命令,设置为7个“GRID”方式
//这里不在详细给出多个显示模式的设置程序请参考产品应用手册,显示模式在上电设置好后不允许更改
STB=1;
display(0xff);
delay(10);
display2(0xC0,0x00);
delay(10);
#ifdefkey
Page:
6
//全亮
//采用固定地址方式向C0地址单元写00
E:
\Item\design\tmxxleddemo\sw\
keyscan();
//调用按键扫描程序
#endif
//本程序仅仅提供按键扫描,2次按键扫描的时间不得<10MS,在这里不提供按键处理程序
#ifdefled
in_led();
delay(10);
in_led_g(0xc0,0x00);
#endif
#ifdefsw
out_sw();
//6路PWM输出口输出"1"
//让LED1输出"0"
//调用读SW输入口程序
#endif
//这里不提供SW口处理程序
_nop_();
}
//*********************************************主程序结束*******************************************
Page:
7