基于STC32的四位TM1637程序

2023-10-22 16:50
文章标签 程序 四位 stc32 tm1637

本文主要是介绍基于STC32的四位TM1637程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该程序使用的开发板为STC公司的屠龙刀,代码风格接近51,微调后51也可以使用!

这个程序中的定时是用软延时做的,所以对单片机频率要求高,该代码用的24Mhz,如有其他频率需求,只需在延时接口更改即可;

程序比较适合新手入门,写的很详细,代码量比较多。有现成的亮度,各位数码管控制等。

该控制非常简单,只需直接输入数字即可显示数字,无需理会段码。

PS:起初我随意看了看芯片文档,看着和iic协议很像,想都没想就用了硬件iic,但万万没想到,这个芯片协议看似iic,实则只是相似,我也因此调试了半天没调出来,还是后来仔细观摩使用手册才发现猫腻。

这个是主函数

#include <STC32G.H>
#include <tm1637.H>void main()
{P2M0 = 0x00; P2M1 = 0x00; //配置io口Smg_ctrl_all(1,2,3,4,1,8);while(1);
}

这个是Tm1637.c函数

#include <tm1637.H>
#include <intrins.h> static unsigned char data t_display[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9   black 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
unsigned char xdata smg_hc[4];                                  //数码管缓存
unsigned char luminance=0;                                      //亮度存储
bit dot_f=0;                                                    //小数点标志位void Delay1us()		//@24.000MHz
{unsigned long edata i;_nop_();_nop_();_nop_();i = 4UL;while (i) i--;
}/*******************************************************************************
* 函 数 名         : Delay_us
* 函数功能		     : 延时接口
* 输    入         : 微秒延时
* 输    出         : 无
*******************************************************************************/
void Delay_us(unsigned int i)
{ unsigned long edata j;for(;i>0;i--) {            //延时接口Delay1us();}
} 
/*******************************************************************************
* 函 数 名         : TM1637_Start
* 函数功能		     : 1637起始信号
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TM1637_Start(void) 
{ clk = 1; dio = 1; Delay_us(2); dio = 0; 
} 
/*******************************************************************************
* 函 数 名         : TM1637_ask
* 函数功能		     : 1637 应答信号 
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TM1637_ask(void)
{ clk = 0; Delay_us(5); //在第八个时钟下降沿之后延时 5us,开始判断 ACK 信号 while(dio); clk = 1; Delay_us(2); clk=0; 
}
/*******************************************************************************
* 函 数 名         : TM1637_Stop
* 函数功能		     : 1637 停止信号
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TM1637_Stop(void)
{ clk = 0; Delay_us(2); dio = 0; Delay_us(2); clk = 1; Delay_us(2); dio = 1; 
} 
/*******************************************************************************
* 函 数 名         : TM1637_WrByte
* 函数功能		     : 写一个字节
* 输    入         : char数据
* 输    出         : 无
*******************************************************************************/
void TM1637_WrByte(unsigned char oneByte) 
{ unsigned char i; for(i=0;i<8;i++) { clk = 0; if(oneByte&0x01) //低位在前 { dio = 1; } else { dio = 0; } Delay_us(3); oneByte=oneByte>>1; clk=1; Delay_us(3); } 
} 
/*******************************************************************************
* 函 数 名         : SmgDisplay
* 函数功能		     : 写显示寄存器 
* 输    入         : *p:数码管段码 L:0-9亮度
* 输    出         : 无
*******************************************************************************/
void SmgDisplay(unsigned char *p,char L)
{ unsigned char i; TM1637_Start(); TM1637_WrByte(0x40); // 40H 地址自动加 1 模式,44H 固定地址模式,本程序采用自加 1 模式 TM1637_ask(); TM1637_Stop(); TM1637_Start(); TM1637_WrByte(0xc0); //设置首地址, TM1637_ask(); for(i=0;i<6;i++) //地址自加,不必每次都写地址 { TM1637_WrByte(*p++); //送数据 TM1637_ask(); } TM1637_Stop(); TM1637_Start(); if((L>0)&&(L<9)) TM1637_WrByte((unsigned char)(0x88+(L-1))); //开显示 ,最大亮度 else TM1637_WrByte(0x80);TM1637_ask(); TM1637_Stop(); 
} 
/*******************************************************************************
* 函 数 名         : Smg_ctrl_dot
* 函数功能		     : 控制小数点亮灭
* 输    入         : 0:小数点熄灭   1:小数点亮起
* 输    出         : 无
*******************************************************************************/
void Smg_ctrl_dot(bit dot)
{if(dot) smg_hc[1]-=0x80;SmgDisplay(smg_hc,luminance);
}
/*******************************************************************************
* 函 数 名         : Smg_ctrl_bit
* 函数功能		     : 控制单独数码管
* 输    入         : i:要控制的数码管位 dat:要写入的数据:0~9; 10为熄灭该数码管
* 输    出         : 无
*******************************************************************************/
void Smg_ctrl_bit(unsigned char i,unsigned char dat)
{smg_hc[i+1]=t_display[dat];SmgDisplay(smg_hc,luminance);
}
/*******************************************************************************
* 函 数 名         : Smg_ctrl_lum
* 函数功能		     : 数码管亮度控制
* 输    入         : 亮度等级:1~8;  0为熄灭
* 输    出         : 无
*******************************************************************************/
void Smg_ctrl_lum(unsigned char R)
{luminance=R;SmgDisplay(smg_hc,luminance);
}
/*******************************************************************************
* 函 数 名         : Smg_ctrl_all
* 函数功能		     : 数码管全部资源控制
* 输    入         :  a:第一位数码管 0~9b:第二位数码管 0~9c:第三位数码管 0~9d:第四位数码管 0~9t:小数点       0|1R:亮度         0~8
* 输    出         : 无
*******************************************************************************/
void Smg_ctrl_all(unsigned char a,unsigned char b,unsigned char c,unsigned char d,bit t,char R)
{smg_hc[0]=t_display[a];smg_hc[1]=t_display[b];dot_f=t;if(t) smg_hc[1]-=0x80;smg_hc[2]=t_display[c];smg_hc[3]=t_display[d];luminance=R;SmgDisplay(smg_hc,luminance);
}

这个是Tm1637.h函数,原件引脚在这个文件修改

#ifndef		__tm1637_H
#define		__tm1637_H#include <STC32G.H>
//定义端口 
sbit clk = P2^4; 
sbit dio = P2^5; void SmgDisplay(unsigned char *p,char L);//*p:数码管段码 L:0-9亮度
void Smg_ctrl_dot(bit dot);//0:小数点熄灭   1:小数点亮起
void Smg_ctrl_bit(unsigned char i,unsigned char dat);//i:要控制的数码管位 dat:要写入的数据:0~9; 10为熄灭该数码管
void Smg_ctrl_lum(unsigned char R);//亮度等级:1~8;  0为熄灭
void Smg_ctrl_all(unsigned char a,unsigned char b,unsigned char c,unsigned char d,bit t,char R);#endif

最后,这个链接是整个工程文件打包地址

这篇关于基于STC32的四位TM1637程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262550

相关文章

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线