TM1621D驱动

IO初始化

#define Bsp_Cs1628Clk(sta) CS1628_CLK = sta
#define Bsp_Cs1628Dio(sta) CS1628_DIO = sta
#define Bsp_Cs1628CS(sta) CS1628_CS = sta

void Bsp_DspIOIint(void)//LCD驱动IIC初始化
{
	P5CON |= BIT1;//SDA
    P5PH  &= ~(BIT1);
	P5CON |= BIT0;//SCL
    P5PH  &= ~(BIT0);
	P1CON |= BIT1;//CS
    P1PH  &= ~(BIT1);
	P1CON |= BIT6;//背光
    P1PH  &= ~(BIT6);
}

LCD驱动初始化

#define SYSDIS   0x00    //关系统振荡器和LCD偏压发生器        
#define SYSEN    0x02    //打开系统振荡器        
#define LCDOFF   0x04    //关LCD偏压
#define LCDON    0x06    //开LCD偏压
#define RC       0x30    //内部RC振荡        
#define BIAS     0x52    //1/3偏压 4公共口 

void tm1621_command(INT8U cmd) 
{
    Bsp_Cs1628CS(0);
	tm1621_write_byte(0x80,4);//100
    tm1621_write_byte(cmd,8);
    Bsp_Cs1628CS(1);
}

void Led_Init(void)
{
    Bsp_DspIOIint();
	tm1621_command(BIAS);                 //1/3偏压 4公共口
	tm1621_command(RC);                   //内部RC振荡
	tm1621_command(SYSDIS);               //关系统振荡器和LCD偏压发生器
	tm1621_command(SYSEN);                //打开系统振荡器
	tm1621_command(LCDON);                //开LCD偏压
}

显存通讯

void tm1621_write_byte(INT8U dat,INT8U cnt)
{//高位先出
    INT8U  i;
    for(i=0;i<cnt;i++)
    {
		Bsp_Cs1628Clk(0);
		Sys_DlyUs(5);
        Bsp_Cs1628Dio((dat&BIT7)?1:0);
		Sys_DlyUs(5);
		Bsp_Cs1628Clk(1);
        dat<<=1;
    }
}

void CS1628_Dsp(INT16U *buff)
{
    INT8U i;
	Bsp_Cs1628CS(0);
	//命令为连续模式3位	1010 0000
	tm1621_write_byte(0xa0,3);
	//地址6位	9 00001001
	tm1621_write_byte(9<<2,6);
	//数据4位 * 14
	for(i=0;i<LED_COM_NUM;i++)                   //送16位数
	{
		tm1621_write_byte((INT8U)buff[i],8);
	}
	Bsp_Cs1628CS(1);
}

void Led_Display(void)
{
	INT16U xdata tmp[16] = {0};
	INT16U t_seg = 1;
	
	tmp[3] = 0;
	//4个8
	tmp[2] = Left_LedStr.buff[3];//pin6
	tmp[2] = Left_LedStr.buff[3];//pin7
	tmp[4] |= Left_LedStr.buff[2]&0xf0;//pin8
	tmp[0] |= Left_LedStr.buff[2]<<4;//pin9
	tmp[4] |= (Left_LedStr.buff[1]&0xf0) >> 4;//pin10
	tmp[5] |= Left_LedStr.buff[1]<<4;//pin11
	tmp[5] |= Left_LedStr.buff[0]>>4;//pin12
	tmp[6] |= Left_LedStr.buff[0]<<4;//pin13
	
	//4个图片
	tmp[0] |= Right_LedStr.buff[0]&0x0f;//pin3
	tmp[1] |= Right_LedStr.buff[1]<<4;//pin4
	tmp[1] |= Right_LedStr.buff[2]&0x0f;//pin5
	tmp[6] |= Right_LedStr.buff[3]&0x0f;//pin14
	
	//4个8的图片
	tmp[2] |= (Mid_LedStr.buff[3]&0x80)>>4;//s11
	tmp[0] |= Mid_LedStr.buff[2]&0x80;//s4
	tmp[6] |= (Mid_LedStr.buff[1]&0x80);//s10
	tmp[5] |= (Mid_LedStr.buff[0]&0x80);//s9

	CS1628_Dsp(tmp);
}
/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1621-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-08-07 *程序功能:1.LCD驱动:LCD屏显示0`F *免责声明:1.此程序为TM1621驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define uchar unsigned char //数据类型宏定义 #define uint unsigned int //数据类型宏定义 #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /******************TM1621模块命令定义*********************/ #define SYSDIS 0x00 //关系统振荡器和LCD偏压发生器 #define SYSEN 0x02 //打开系统振荡器 #define LCDOFF 0x04 //关LCD偏压 #define LCDON 0x06 //开LCD偏压 #define TONEON 0x12 //打开声音输出 #define TONEOFF 0x10 //关闭声音输出 #define XTAL 0x28 //外部接晶振 #define RC 0x30 //内部RC振荡 #define BIAS 0x52 //1/3偏压 4公共口 #define WDTDIS 0x0a //禁止看门狗 #define WDTEN 0x0e //开启看门狗 /********************定义控制端口**********************/ sbit CS=P2^1; sbit READ=P2^7; sbit WRITE=P2^0; sbit DATA=P1^7; /********************定义数据*************************/ uchar code Smg[16]={0xeb,0x60,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e}; //0~F字型码 uchar code Tab0[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏 /********************延时函数*************************/ void delay_nms(uint n) { uint i; while(n--) for(i=0;i<500;i++); } /********************从高位写入数据*************************/ void Write_Data_H(uchar Data, uchar Cnt) //Data的高cnt位写入TM1621,高位在前 { uchar i; for(i=0;i<Cnt;i++) { WRITE=0; if(Data&0x80;) //从最高位发送 DATA=1; else DATA=0; nop; nop; WRITE=1; Data<<=1; } WRITE=0; DATA=0; } /********************从低位写入数据*************************/ void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位写入TM1621,低位在前 { unsigned char i; for(i=0;i>=1; } WRITE=0; DATA=0; } /********************写入控制命令*************************/ void WriteCmd(uchar Cmd) { CS=0; nop; Write_Data_H(0x80,4); //写入命令标志100 Write_Data_H(Cmd,8); //写入命令数据 CS=1; nop; } /*********指定地址写入数据,实际写入后4位************/ void WriteOneData(uchar Addr, uchar Data) { CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 Write_Data_L(Data,4); //写入数据 CS=1; nop; } /*********连续写入方式,每次数据为8位,写入数据************/ void WriteAllData(uchar Addr,uchar *p,uchar cnt) { uchar i; CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 for(i=0;i<cnt;i++) //写入数据 { Write_Data_L(*p,8); p++; } CS=1; nop; } /*******************TM1621初始化**********************/ void TM1621_init() { CS=1; WRITE=1; DATA=1; nop; delay_nms(1); WriteCmd(BIAS); //1/3偏压 4公共口 WriteCmd(RC); //内部RC振荡 WriteCmd(SYSDIS); //关系统振荡器和LCD偏压发生器 WriteCmd(WDTDIS); //禁止看门狗 WriteCmd(SYSEN); //打开系统振荡器 WriteCmd(LCDON); //开LCD偏压 } void main() { TM1621_init(); //开机初始化 delay_nms(1); WriteAllData(0,Tab0,16); //LCD不显示 while(1) { WriteAllData(0,Smg,16); //LCD显示0~F delay_nms(200); WriteAllData(0,Tab0,16); //LCD不显示 delay_nms(200); } }
### TM1621D 驱动程序与代码实现 TM1621D 是一种常用于 LED 显示屏控制的驱动芯片。它支持多路信号传输以及多位显示功能,广泛应用于数码管显示屏的设计中。为了实现其功能,通常需要编写相应的初始化、数据发送和刷新函数。 以下是基于单片机平台的一个简单 TM1621D 驱动程序框架: #### 初始化配置 在使用 TM1621D 前,需对其进行必要的初始化设置,包括地址设定、亮度调节等功能。 ```c #include <stdint.h> #define TM1621_ADDR 0xC0 // 设定 TM1621 地址 #define DATA_PIN P1_0 // 数据引脚定义 #define CLOCK_PIN P1_1 // 时钟引脚定义 #define STB_PIN P1_2 // 片选引脚定义 void tm1621_start(void); void tm1621_stop(void); void tm1621_write_byte(uint8_t data); // 初始化 TM1621D void tm1621_init() { uint8_t cmd; // 设置初始状态 cmd = 0x40; // 开启正常模式 tm1621_start(); tm1621_write_byte(TM1621_ADDR | 0x80); // 发送写指令 tm1621_write_byte(cmd); tm1621_stop(); // 设置亮度等级 (范围: 0~7) cmd = 0x88; tm1621_start(); tm1621_write_byte(TM1621_ADDR | 0x80); // 发送写指令 tm1621_write_byte(cmd); tm1621_stop(); } ``` 上述代码实现了对 TM1621D 的基本初始化操作[^1]。 #### 数据写入 通过 SPI 协议模拟方式向 TM1621D 写入数据。具体过程如下所示: ```c // 启动通信 void tm1621_start(void) { STB_PIN = 0; // 拉低片选线 } // 结束通信 void tm1621_stop(void) { STB_PIN = 1; // 拉高片选线 } // 写入字节到 TM1621D void tm1621_write_byte(uint8_t data) { uint8_t i; for(i=0;i<8;i++) { // 循环移位每一位 if(data & 0x80) { DATA_PIN = 1; // 如果当前位为1,则拉高数据线 } else { DATA_PIN = 0; // 如果当前位为0,则拉低数据线 } CLOCK_PIN = 1; // 上升沿触发 CLOCK_PIN = 0; // 下降沿完成一位传输 data <<= 1; // 左移准备下一位 } } // 更新显示缓冲区内容至 TM1621D void tm1621_update_display(const uint8_t *data, uint8_t length) { uint8_t addr; tm1621_start(); // 开始通信 tm1621_write_byte(TM1621_ADDR | 0xA0); // 进入 RAM 写入模式 for(addr=0;addr<length;addr++) { tm1621_write_byte(*data++); } tm1621_stop(); // 停止通信 } ``` 以上代码片段展示了如何利用 GPIO 模拟串行协议来与 TM1621D 芯片交互并更新显示内容[^3]。 对于更复杂的项目环境或者更高性能需求的情况下,可以考虑采用硬件 SPI 接口替代软件仿真方法以提高效率[^2]。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值