[驱动] TM1729

注:本程序使用华大半导体HC32L13X系列单片机。Cortex-M0 plus内核

 

Tm1729.h

#ifndef _TM1729_HPP_
#define _TM1729_HPP_

typedef unsigned char uint8_t;

extern void tm1729_init(void);
extern void tm1729_disp(uint8_t* p, uint8_t size);

#endif

 

Tm1729.c

#include "Tm1729.h"
#include "gpio.h"
#include "ddl.h"

#define nop() delay10us(1); // 十微秒延时。根据Tm1729官方手册说明,最小需要时间间隔在2.5us,\
所以实际上大于3us的延时都可以

// 指令集
#define SLAVE_ADDRESS     0x7C		     // 从机地址
#define ICSET         	  0xEA		     // 1110 1010 软复位,内部时钟
#define BLKCTL            0xF0		     // 1111 0000 闪烁控制命令:不闪烁
#define DISCTL            0xA2           // FR=Normal,SR=Normal,Line翻转
#define MODESET           0xC8           // 显示开启,1/3偏压
#define APCTL             0xFC		     // 全屏控制命令:Normal
#define ADSET             0x00		     // 初始地址设置

// 此处为单片机接到Tm1729的管脚配置,本程序采用软件模拟IIC。
#define SDA_SET Gpio_WriteOutputIO(GpioPortD, GpioPin7, TRUE) //拉高
#define SDA_RESET Gpio_WriteOutputIO(GpioPortD, GpioPin7, FALSE) //拉低  SDA
#define SCL_SET Gpio_WriteOutputIO(GpioPortD, GpioPin6, TRUE) //拉高
#define SCL_RESET Gpio_WriteOutputIO(GpioPortD, GpioPin6, FALSE) //拉低  SCL

// IIC开始信号
void start_i2c()
{
	SDA_SET;
	nop();
	SCL_SET;
	nop();
	SDA_RESET;
	nop();
	SCL_RESET;
	nop();
}

// IIC停止信号
void stop_i2c()
{
	SCL_SET;
	nop();
	SDA_RESET;
	nop();
	SDA_SET;
	nop();
	SDA_RESET;
	SCL_RESET;
}

// 数据传输-传送一个字节, 先读高位
void send_byte(unsigned char dat) 
{
	unsigned char i;
	for (i = 0; i < 8; i++)
	{
		SCL_RESET;
		if (dat & 0x80) SDA_SET;
		else SDA_RESET;
		SCL_SET;
		dat = dat << 1;
	}
	SCL_RESET;
	nop();
	SDA_RESET; // ACK信号
	nop();
	SCL_SET;
	nop();
	nop();
	SCL_RESET;
	nop();
}

// 管脚初始化
void gpio_init(void)
{
    stc_gpio_config_t pstcGpioCfg;
	Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);  //< 打开GPIO外设时钟门控

    pstcGpioCfg->enDir = GpioDirOut; // 端口方向配置->输出 
	pstcGpioCfg->enDrv = GpioDrvH; // 端口驱动能力配置->高驱动能力 
	pstcGpioCfg->enPuPd = GpioPu; // 端口上下拉配置->上拉 
	pstcGpioCfg->enOD = GpioOdDisable; // 端口开漏输出配置->开漏输出关闭 
	pstcGpioCfg->enCtrlMode = GpioAHB; // 端口输入/输出值寄存器总线控制模式配置->AHB	

	Gpio_Init(GpioPortD, GpioPin6, &pstcGpioCfg);
	Gpio_WriteOutputIO(GpioPortD, GpioPin6, TRUE); // SCL
	Gpio_Init(GpioPortD, GpioPin7, &pstcGpioCfg);
	Gpio_WriteOutputIO(GpioPortD, GpioPin7, TRUE); // SDA
}


// 初始化
void tm1729_init(void)
{
    gpio_init();
	stop_i2c(); // 停止条件
	start_i2c(); // 开始条件
	send_byte(SLAVE_ADDRESS); // 发送SLAVE_ADDRESS
	send_byte(ICSET); // 软复位,内部时钟
	send_byte(DISCTL); // FR=Normal,SR=Normal,Line翻转
	send_byte(BLKCTL); // 不闪烁
	send_byte(APCTL); // 全屏控制命令:Normal
	send_byte(MODESET); // 显示开启,1/3偏压
	stop_i2c(); // 停止条件
}

// 更新RAM
void tm1729_disp(uint8_t* p, uint8_t size)
{
	unsigned char i;
	start_i2c();
	send_byte(SLAVE_ADDRESS);
	send_byte(ADSET);
	for (i = 0; i < size; ++i) // 发送26byte显示数据
	{
		send_byte(*p);
		p++;
	}
	stop_i2c();
}

// 测试
unsigned char LCD_TEST[26] = { 0x00 };
unsigned char LCD_OFF[26] = { 0x00 };

void test_tm1729(void)
{
	delay1ms(100); // 上电延时100ms
	tm1729_init(); // TM1729初始化
    memset(LCD_OFF, 0X00, 26);
	tm1729_disp(LCDOFF, 26); // 清屏

	memset(LCD_TEST, 0xff, 26); // 全亮
	while (1)
	{
		tm1729_disp(LCD_TEST, 26);
		delay1ms(200);
    }
}




 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值