驱动 Cortex-M0
怎样使用HC32L13X
单片机和Cortex-M0去驱动TM1729呢?
回帖(1)
2022-2-24 09:38:51
注:本程序使用华大半导体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);
}
}
注:本程序使用华大半导体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);
}
}
举报
更多回帖