完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
注:本程序使用华大半导体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); } } |
|
|
|
只有小组成员才能发言,加入小组>>
3209 浏览 9 评论
2896 浏览 16 评论
3402 浏览 1 评论
8845 浏览 16 评论
3997 浏览 18 评论
9627浏览 3评论
1004浏览 3评论
521浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
523浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2250浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-1 21:46 , Processed in 1.020571 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号