⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm1616sample.c

📁 是TM1616前面板驱动IC的驱动程序
💻 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 + -