📄 tm1616sample.c
字号:
//---------------------------------------------------------------
//此程序只针对于TM1616
//MCU=AT89S51
//OSC=12M
//****************************************************************
#include<reg51.h>
#include<intrins.h>
//----------------------------------------------------------------
#define disconmode 0x8c //显示控制:亮度居中,显示-开
unsigned char data display_datum[]={0x7f,0x7f,0x7f,0x7f}; //预先定义显存数据,以便在自动加地址函数中调用
//最高位(bit7)未用到所以填0
//----------------------------------------------------------------
//端口的定义
sbit DIO = P3^0; //串行通讯口
sbit CLK = P3^1;
sbit STB = P3^2;
uchar data display_define[]={0X77,0X14,0X5B,0X5E,0X3C,0X6E,0X6F,0X54,0X7F,0X7E,0X69,0X08};//BCD码[0-9,F,-]
//*********************************************子程序开始************************************
//----------------------------------------------------------------
//写入输入1个字节(8bit)到LED_IC程序开始
//输入8BIT数据
//在时钟的上升沿通过MCU向LED驱动IC——TM16xx写数据
//----------------------------------------------------------------
void indate(unsigned 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
} //送完一个字节后退出循环
}
//----------------------------------------------------------------
//上电后LED-DRIVER显存中的数据是随机的,上电后马上传显示控制命令字(打开显示),会出现乱码。
//为避免上述现象,用户可以先传显示控制命令将显示关掉(见应用手册中详细介绍),然后正常操作
//也可以先主动刷新LED-DRIVER显存中的数据,然后开显示.
//----------------------------------------------------------------
void display_auto_add()
{
unsigned int i; //i——控制本次需要传多少个字节显示数据
unsigned char address=0xc0; // 起始地址
unsigned char index=0;
DIO=1;
CLK=1;
STB=1; //通讯开始前通讯端口全部初始化为“1”
indate( 0x44); //传数据设置命令,设置采用固定地址
STB=1; //数据设置命令传完后需要将“STB”置“1”
for(i=4;i>0;i--) //最多传送4个字节,因为TM1616只能是4个显存
{
indate(address);
address+=2; //因为1616对应的显存不是连续的,所以需连加2
indate(display_datum[index++]); //送数据
STB=1;
}
STB=1; //传完所有的显示数据后,将“STB置“1”
indate(disconmode); //传显示控制命令
STB=1; //显示控制命令传完后将“STB”置“1”
}
//----------------------------------------------------------------
//采用固定地址方式传输地址和数据开始
//采用固定地址方式
//----------------------------------------------------------------
void display_fix_add(unsigned char address,unsigned char datum)
{
DIO=1;
CLK=1;
STB=1; //通讯开始前通讯端口全部初始化为“1”
indate(0x44); //数据设置命令 设置为:固定地址,写显存
STB=1;
indate(address); //传显示数据对应的地址
indate(datum); //保持“STB”=“0”,传1BYTE显示数据
STB=1; //传完显示数据后将“STB”置“1”
indate(disconmode); //传显示控制命令
STB=1; //显示控制命令传完后将“STB”置“1”
}
////////////////////////////////////////////////////////////////
void delay(unsigned char k)
{
unsigned char i,j;
for(;k>0;k--)
for(j=255;j>0;j--)
for(i=255;i>0;i--);
}
////////////////////////////////////////////////////////////////
//****************************************************************
// 主程序开始
//----------------------------------------------------------------
void main(void)
{
DIO=1;
CLK=1;
STB=1;
while(1)
{
display_auto_add(); //自动加地址函数调用,根据显存内数据全为0X7F,则调用后全部LED点亮 ,
//用户可以在调用该函数之前更改显示缓存,然后再调用该函数即可完成显示
delay(200);
display_fix_add( 0xC0, 0x06); //采用固定地址方式向C0地址单元写数据,显示1 ---0xc0对应第三位(根据硬件电路图)
display_fix_add( 0xC2, 0x5b); //采用固定地址方式向C2地址单元写数据,显示2 ---0xc2对应第二位(根据硬件电路图)
display_fix_add( 0xC4, 0x4f); //采用固定地址方式向C4地址单元写数据,显示3 ---0xc4对应第一位(根据硬件电路图)
//display_fix_add( 0xC6, 0x66); //采用固定地址方式向C6地址单元写数据,显示4 ---对应COM4/GRID4
delay(200);
}
}
//----------------------------------------------------------------
// The END
//****************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -