当前位置: 首页 > news >正文

STM32、GD32驱动TM1640原理图、源码分享

一、原理图分享
在这里插入图片描述
在这里插入图片描述
二、源码分享

/************************************************* 
* @copyright: 
* @author:Xupeng
* @date:2024-07-18
* @description: 
**************************************************/  
#include "smg.h"


#define DBG_TAG    "smg"
#define DBG_LVL    DBG_LOG
#include <rtdbg.h>

static const int sckPin = GET_PIN(D,2);
static const int sdaPin = GET_PIN(D,3);

/************************************************* 
* @function:static int tm1640_init()      
* @description: tm1640初始化  
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
static int tm1640_init()
{
	rt_pin_mode(sckPin,PIN_MODE_OUTPUT);
	rt_pin_mode(sdaPin,PIN_MODE_OUTPUT);
	
	rt_pin_write(sckPin,PIN_HIGH);
	rt_pin_write(sdaPin,PIN_HIGH);
	return 0;
}

INIT_BOARD_EXPORT(tm1640_init);
/************************************************* 
* @function:static int tm1640_start()      
* @description: tm1640启动
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
static void tm1640_start()
{
	rt_pin_write(sckPin,PIN_HIGH);
	rt_pin_write(sdaPin,PIN_HIGH);
	rt_hw_us_delay(5);
	rt_pin_write(sdaPin,PIN_LOW);
	rt_hw_us_delay(5);
	rt_pin_write(sckPin,PIN_LOW);
}
/************************************************* 
* @function:static int tm1640_stop()      
* @description: tm1640停止
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
static void tm1640_stop()
{
   rt_pin_write(sdaPin,PIN_LOW);
   rt_pin_write(sckPin,PIN_HIGH);
   rt_hw_us_delay(5);
   rt_pin_write(sdaPin,PIN_HIGH);
   rt_hw_us_delay(5);
   rt_pin_write(sckPin,PIN_HIGH);

}
/************************************************* 
* @function:static void tm1640_write_byte(uint8_t data)   
* @description: tm1640发送字节
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
static void tm1640_write_byte(uint8_t data)
{
	uint8_t i;
	for(i=0;i<8;i++)
	{
		rt_pin_write(sckPin,PIN_LOW);
		if(data & 0x01)
			rt_pin_write(sdaPin,PIN_HIGH);
		else
			rt_pin_write(sdaPin,PIN_LOW);
		data>>=1;
		rt_hw_us_delay(5);
		rt_pin_write(sckPin,PIN_HIGH);
	}	
}


static const uint8_t smgCode[]={//显示段码 数码管字跟 
    0x3F,  //[0]  '0'
    0x06,  //[1]  '1'
    0x5B,  //[2]  '2'
    0x4F,  //[3]  '3'
    0x66,  //[4]  '4'
    0x6D,  //[5]  '5'
    0x7D,  //[6]  '6'
    0x07,  //[7]  '7'
    0x7F,  //[8]  '8'
    0x6F,  //[9]  '9'
    0x77,  //[10]  'A'
    0x7C,  //[11]  'b'
    0x58,  //[12]  'c'
    0x39,  //[13]  'C'
    0x5E,  //[14]  'd'
    0x79,  //[15]  'E'
    0x71,  //[16]  'F'
    0x3D,  //[17]  'G'
    0x74,  //[18]  'h'
    0x76,  //[19]  'H'
    0x0E,  //[20]  'J'
    0x38,  //[21]  'L'
    0x54,  //[22]  'n'
    0x37,  //[23]  'N'
    0x5C,  //[24]  'o'
    0x73,  //[25]  'P'
    0x67,  //[26]  'q'
    0x67,  //[27]  'R'
    0x50,  //[28]  'r'
    0x3E,  //[29]  'u'
    0x1C,  //[30]  'v'
    0x6E,  //[31]  'y'
    0x40,  //[32]  '-'
	0x00,
};

static uint8_t showBuf[16] = {0};
/************************************************* 
* @function:void smg_show_value(float value) 
* @description: 数码管显示值
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
void smg_show_value(float value)
{
	if( weight > 99999 || weight < -99999)
	{
		for(uint8_t i=0;i<8;i++)
			showBuf[i] = 0x40;
		return;
	}
	
	
	int32_t w = weight*100;//保留两位小数
	
	//显示符号
	if(w > 0)
		showBuf[0] = 0;
	else
		showBuf[0] = 0x40;
	
	w = abs(w);
	
	showBuf[7] = smgCode[w%10];
	showBuf[6] = smgCode[w/10%10];
	showBuf[5] = smgCode[w/100%10] | 0x80;
	showBuf[4] = smgCode[w/1000%10];
	showBuf[3] = smgCode[w/10000%10];
	showBuf[2] = smgCode[w/100000%10];
	showBuf[1] = smgCode[w/1000000%10];
	
	//取消前面0的显示
	for(uint8_t i=1;i<6;i++)
	{
		if(showBuf[i] == smgCode[0])
			showBuf[i] = 0x00;
		else
			break;
	}
	
}
/************************************************* 
* @function:void smg_send_data(bool on,uint8_t brightness)   
* @description: 数码管发送数据
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
void smg_send_data(bool on,uint8_t brightness)
{
	tm1640_start();
	tm1640_write_byte(0x40);				//设置数据命令
	tm1640_stop();
	tm1640_start();
	tm1640_write_byte(0xc0);				//设置显示地址
	for(uint8_t i=0;i<sizeof(showBuf);i++)
	{
		tm1640_write_byte(showBuf[i]);
	}
	tm1640_stop();
	tm1640_start();
	tm1640_write_byte(0x80 | on<<3 | brightness);		//设置显示控制命令
	tm1640_stop();
}
	
	



相关文章:

  • HCIA项目实践--RIP相关原理知识面试问题总结回答
  • 服务器,交换机和路由器的一些笔记
  • 机器学习(李宏毅)——self-Attention
  • 常见的排序算法:插入排序、选择排序、冒泡排序、快速排序
  • 利用Java爬虫按图搜索1688商品(拍立淘):实战案例指南
  • 集成学习(一):从理论到实战(附代码)
  • sqli-lab靶场学习(六)——Less18-22(User-Agent、Referer、Cookie注入)
  • 网络工程师 (35)以太网通道
  • iptables网络安全服务详细使用
  • ES节点配置的最佳实践
  • 开发指南098-logback-spring.xml说明
  • 六西格玛设计培训如何破解风电设备制造质量与成本困局
  • 错误报告:WebSocket 设备连接断开处理问题
  • qt的QSizePolicy的使用
  • 游戏引擎学习第99天
  • 【STM32】H743的以太网MAC控制器的一个特殊功能
  • DeepSeek在FPGA/IC开发中的创新应用与未来潜力
  • Java IO流详解
  • Web3 开发者周刊 36 | 构建自主未来:Agent、可扩展性与赏金
  • Android ndk兼容 64bit so报错
  • 河南发布高温橙警:郑州、洛阳等地最高气温将达40℃以上
  • 大外交丨3天拿下数万亿美元投资,特朗普在中东做经济“加法”和政治“减法”
  • 竞彩湃|欧联杯决赛前,曼联、热刺继续划水?
  • 独家 |《苏州河》上海上演,编剧海飞:上海的风能吹透我
  • 布局50多个国家和地区,我国科技型企业孵化器数量全球第一
  • 工商银行杭州金融研修院原院长蒋伟被“双开”