TM1618控制共阳极数码管的数据传送问题

news2024/10/6 15:31:24

数据传送中的问题

首先每个字节是按照一个地址写入的,而共阳极数码管的公共端是SEG引脚连接的。这使得数码管显示的编码是按照竖向的字节。如下图所示中,横向是公共端,竖向是实际编码字符字节
在这里插入图片描述

在这里插入图片描述

数据转换方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样可以一次写入所有需要显示的数码管的值,只是前面MCU转换数据时间问题,需要注意的是在TM1618发送显示命令中不要把计算这部分耗时的放里面,这样可能导致错误
在这里插入图片描述

代码实现

uchar* seg_to_send(uchar *en_val){
  static uchar sent_byte[7]={0};   //这里必须使用静态定义,否者后面返回数组会出现问题
  uchar i,j;
    for(i=0;i<7;i++){  //取成7个字节
      for(j=0;j<4;j++){   //每个字节每一位来自于不同的字节
        sent_byte[i] += ((en_val[j]>>i)& 0x01)<<j;  //
    }
  }
  return sent_byte;
}

整体代码记录

由于刚好有一个简单的esp8266的nodemcu,把手册中的代码直接转换为arduino的代码了。算法没区别,主要方便使用串口来显示debug信息,不用像在51或32中设置一大堆串口寄存器

#define uchar unsigned char
#define uint unsigned int
#define CLK D7
#define STB D6  //CS片选
#define DIO D5
//共阳极,显示0-9对应编码
uchar const CODE[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar KEY[3]={0}; 

void send_8bit(uchar dat){
  uchar i;
  
  for(i=0;i<8;i++)
    {
    if(dat&0x01)
      digitalWrite(DIO,1);
    else digitalWrite(DIO,0);
    digitalWrite(CLK,0);
    digitalWrite(CLK,1);
    dat=dat>>1;
    }
}
void command(uchar com)
  {
   digitalWrite(STB,1);
   digitalWrite(STB,0);
    send_8bit(com);
  }

void read_key()   //扫描按键,这里不使用
{
  uchar i,j;
  command(0x42); //读键盘命令
  digitalWrite(DIO,1); //释放DIO数据总线
  for(j=0;j<3;j++)//连续读取3个字节
    for(i=0;i<8;i++)
      {
      KEY[j]=KEY[j]>>1;
      digitalWrite(CLK,0);
      digitalWrite(CLK,1);
      if(DIO)
        KEY[j]=KEY[j]|0X80;
      }
     digitalWrite(STB,1);
}
//显示0-9字符编码转换为对应的发送字节值,参数是四个常见的数值
uchar* seg_to_send(uchar *en_val){
  static uchar sent_byte[7]={0};   //这里必须使用静态定义,否者后面返回数组会出现问题
  uchar i,j;
    for(i=0;i<7;i++){  //取成7个字节
      for(j=0;j<4;j++){   //每个字节每一位来自于不同的字节
        sent_byte[i] += ((en_val[j]>>i)& 0x01)<<j;  //
    }
  }
  return sent_byte;
}
/*共阳极使用固定地址写入方法,参数:
val:四个数码管显示的值
*/
void P_add_w(uchar *val){
  uchar *send_bytes,i;  //这里必须定义为指针
  uchar en_val[4]={CODE[val[0]],CODE[val[1]],CODE[val[2]],CODE[val[3]]};

  // for(i=0;i<4;i++){
  //   Serial.println(en_val[i],HEX);
  // }
  send_bytes = seg_to_send(en_val);
  for(i=0;i<7;i++){
    Serial.println(send_bytes[i],HEX);
  }
  command(0xc0);  send_8bit(send_bytes[0]);
  digitalWrite(STB,1);digitalWrite(STB,0);
  command(0xc2);  send_8bit(send_bytes[1]);
  digitalWrite(STB,1);digitalWrite(STB,0);
  command(0xc4);  send_8bit(send_bytes[2]);
  digitalWrite(STB,1);digitalWrite(STB,0);
  command(0xc6);  send_8bit(send_bytes[3]);
  digitalWrite(STB,1);digitalWrite(STB,0);
  command(0xc8);  send_8bit(send_bytes[4]);
  digitalWrite(STB,1);digitalWrite(STB,0);
  command(0xca);  send_8bit(send_bytes[5]);
  digitalWrite(STB,1);digitalWrite(STB,0);
  command(0xcc);  send_8bit(send_bytes[6]);
  digitalWrite(STB,1);digitalWrite(STB,0);
}
void display(uchar *val)
{
  uchar i;
  command(0x03);  //设置显示模式,5位7段模式
  command(0x40);  //设置数据命令,采用地址自动加1模式
  // command(0xc0);  //设置显示地址,从00H开始
  P_add_w(val);
  command(0x8B);  //显示控制命令,打开显示并设置为最亮
  //read_key(); //读按键值
   digitalWrite(STB,1);
}
void setup() {
  // put your setup code here, to run once:
  uchar test[4]={0,1,2,3};
  Serial.begin(9600);
  Serial.println("this is test");
  pinMode(CLK,OUTPUT );
  pinMode(STB,OUTPUT );
  pinMode(DIO,OUTPUT );
  display(test);
}

void loop() {
  // put your main code here, to run repeatedly:
 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GoogleNet网络介绍及代码撰写详解(总结2)

可以从本人以前的文章中可以看出作者以前从事的是嵌入式控制方面相关的工作&#xff0c;是一个机器视觉小白&#xff0c;之所以开始入门机器视觉的学习只要是一个idea&#xff0c;想把机器视觉与控制相融合未来做一点小东西。废话不多说开始正题。&#xff08;如有侵权立即删稿…

思维导图工具,轻松搞定复杂问题!

一提到思维导图&#xff0c;想必大家都不会陌生&#xff1b;它能帮助我们更好地梳理思路&#xff0c;让复杂的想法变得清晰可见&#xff1b;而随着互联网的普及&#xff0c;在线思维导图工具更是成为了我们日常工作和学习的得力助手&#xff1b;今天&#xff0c;我就来给大家推…

深入解析DPU:AI时代的芯片分工与超级网卡

引言 在当今AI时代&#xff0c;计算需求的爆炸性增长使得传统数据中心的架构面临着巨大的挑战。数据处理任务越来越复杂&#xff0c;尤其是在大型AI模型如GPT和BERT的应用中&#xff0c;如何提高数据中心的计算和传输效率成为关键问题。传统的CPU&#xff08;中央处理器&#…

从零开始讲PCIe(10)——事务层介绍

一、事务层概述 事务层在响应软件层的请求时&#xff0c;会生成出站数据包。同时&#xff0c;它也会检查入站数据包&#xff0c;并将其中包含的信息传递到软件层。事务层支持非发布事务的分割事务协议&#xff0c;能够将入站的完成数据包与之前传输的非发布请求相关联。该层处理…

开发人员智能助手

据说AI可以代替开发人员&#xff0c;目前看暂时不用担心&#xff0c;不仅不担心&#xff0c;还要主动使用它。 过去有了问题需要自己各网站搜索&#xff0c;真真假假的东西太多&#xff0c;很难找到正确答案&#xff0c;现在可以问智能体了&#xff1a; 1、JAVA开发大师 htt…

【C++】输入输出缺省参数

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的缺省参数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 输入&输出二. 缺省参数1 缺省参数概念2 缺省参数分类a. 全缺省参数b. 半缺省参数…

Top4免费音频剪辑软件大比拼,2024年你选哪一款?

现在我们生活在一个数字化的时代&#xff0c;音频内容对我们来说很重要。不管是给自己拍的视频配背景音乐、整理开会时的录音&#xff0c;还是自己写歌&#xff0c;有个好用的音频剪辑软件都特别重要。今天&#xff0c;我要给大家介绍几款特别好用的音频剪辑软件免费的&#xf…

Vue82 路由器的两种工作模式 以及 node express 部署前端

笔记 对于一个url来说&#xff0c;什么是hash值&#xff1f;—— #及其后面的内容就是hash值。hash值不会包含在 HTTP 请求中&#xff0c;即&#xff1a;hash值不会带给服务器。hash模式&#xff1a; 地址中永远带着#号&#xff0c;不美观 。若以后将地址通过第三方手机app分享…

教育技术革新:SpringBoot在线教育系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理微服务在线教育系统的相关信息成为必然。开…

【性能测试】使用JMeter性能工具做测试的基本过程及案例分析

前言 通过精心设计的性能测试&#xff0c;我们不仅能够了解服务端的综合效能与承载极限&#xff0c;更能前瞻性地评估现有业务架构在面对当前运营需求及未来业务扩张时的适应性与弹性&#xff0c;从而精准规划服务配置的优化路径。 使用jmeter一般用于以下两种类型的性能测试…

Dart基础入门

Dart 是一种由 Google 开发的开源编程语言&#xff0c;它可以用来构建服务器、Web 应用和移动应用。Dart 语言设计得既现代化又易于学习&#xff0c;它支持面向对象编程&#xff08;OOP&#xff09;、函数式编程风格&#xff0c;并且具有类似于 Java 或 C# 的语法。Dart 语言和…

性能测试学习2:常见的性能测试策略(基准测试/负载测试/稳定性测试/压力测试/并发测试)

一.基准测试 1&#xff09;概念 狭义上讲&#xff1a;就是单用户测试。测试环境确定后&#xff0c;对业务模型中的重要业务做单独的测试&#xff0c;获取单用户运行时的各项性能指标。 广义上&#xff1a;是一种测量和评估软件性能指标的活动。可以在某个时刻通过基准测试建立…

[MASM] masm32的下载及详细安装使用过程(附有下载文件)

目录 下载 配置环境 编译 链接 masm的安装和环境配置 下载链接在文末 下载 下载安装包后复制到虚拟机win7系统的桌面 win7安装到虚拟机的步骤&#xff1a; [win7] win7系统的下载及在虚拟机中详细安装过程&#xff08;附有下载文件&#xff09;-CSDN博客 双击压缩包&…

微信消息转发(微信消息转发方案的取舍)

机构可能会有很多的粉丝群&#xff0c;老师有很多家长群&#xff0c;比如发送通知 如果一个个的群发送那么就很繁琐。所以就有一键群发的需求。只需要在一个群发送内容主动同步到其他群。 微信消息转发方案取舍 方案1. 因为微信有本地数据库SQLite&#xff0c; 消息会保存到本…

Redis安装RedisBloom插件

Redis安装RedisBloom插件 1. 下载RedisBloom2. 安装RedisBloom3. Redis 安装RedisBloom4. 验证是否安装成功5. 其他安装方法5.1 使用 Docker 安装 RedisBloom5.2 通过 RedisStack 安装 RedisBloom 是一个 Redis 模块&#xff0c;它提供了一种高效的方式来存储和检索大数据集中的…

频繁full gc问题排查及解决

为什么我们要对频繁full gc的情况进行处理---》频繁full gc会导致stw&#xff0c;影响用户体验。 &#xff08;1&#xff09;先进行问题的排查 如果频繁full gc 会报警&#xff0c;公司有自己的监控平台&#xff0c;可以查看full gc的情况 如果公司没有自己的监控平台&#…

爬虫案例——爬取情话网数据

需求&#xff1a; 1.爬取情话网站中表白里面的所有句子&#xff08;表白词_表白的话_表白句子情话大全_情话网&#xff09; 2.利用XPath来进行解析 3.使用面向对象形发请求——创建一个类 4.将爬取下来的数据保存在数据库中 写出对应解析语法 //div[class"box labelbo…

【实战篇】自增主键为什么不是连续的?

背景 由于自增主键可以让主键索引尽量地保持递增顺序插入&#xff0c;避免了页分裂&#xff0c;因此索引更紧凑。 之前我见过有的业务设计依赖于自增主键的连续性&#xff0c;也就是说&#xff0c;这个设计假设自增主键是连续的。但实际上&#xff0c;这样的假设是错的&#…

Linux高阶——Github本地仓库与云端仓库关联

1、安装代理软件 steam 选择Github和系统代理模式&#xff0c;一键加速即可 2、 安装Git 3、访问Github网站&#xff0c;创建新用户 4、Github探索 &#xff08;1&#xff09;Explore探索标签 &#xff08;2&#xff09;工程结构 用户名/仓库名 自述文件&#xff0c;用markdo…

C语言复习概要(三)

本文 使用Visual Studio进行调试的技巧与函数递归详解1. 引言2. Visual Studio 调试技巧2.1. 断点的使用2.1.1. 基本断点示例&#xff1a;设置基本断点 2.1.2. 条件断点示例&#xff1a;条件断点 2.2. 逐步执行代码示例&#xff1a;逐步执行代码 2.3. 监视变量使用监视窗口 2.4…