草庐IT

arduino用时钟中断方式的4位数码管动态显示

不赦先生 2024-07-16 原文

    一般我们在arduino开发板上显示数字,通常采用多位数码管进行显示,而多位数码管实际是采用“动态扫描显示”的方法进行显示,即依次显示第1位数码管、第2位数码管、第3位数码管、第4位数码管……此方法是利用人眼的视觉残留,当扫描显示的频率大于25帧/秒,我们看到的就是每个数码管同时都在显示。目前大多数arduino的样本程序都是在主循环中不断地进行循环显示,但这样的做法有一个很大问题。如果主循环中的一次循环需要运行较长时间(超过40ms),那显示频率就会低于25帧/秒,从而看到的显示是抖动的,甚至内容是跳跃的。

    为保证显示频率大于25帧/秒,我们可以采用arduino的时钟中断来进行“动态扫描显示”。首先要设置合适的时钟中断间隔,每次中断显示一位数码管,以及25帧/秒的最低显示要求,中断时间间隔必须小于10ms(1000ms/4/25),为提高显示质量,本程序采用了中断间隔为5ms。

    本次实验采用arduino UNO,所用的4位数码管型号为共阴3641AS,下面是该管的引脚图:

    (我图片上传了半个小时也未完成,请各位自行上网查找该管引脚图吧)

   为接线方便,依次将3641AS的1到12引脚接到arduino的D2到D13,实际接线图如下:

    (我图片上传了半个小时也未完成,各位只要将3641AS的1到12引脚接到arduino UNO的D2到D13这12个IO口即可)

    完整程序(该程序经过测试)如下:

#include<MsTimer2.h>      //调用定时器T2的库文件

/*

  采用时钟中断方式,4位数码管动态显示0—9999程序

  优点:可在主循环中任意使用delay 延时函数

  

  端口直接驱动4位共阴数码管,一般情况无需外接限流电阻,

  因为端口的输出电流有限,一般不超过20mA,长期使用建议加限流电阻。

*/

int ledCount=8;//8段数码管

int segCount=4;//4位数码管

//long previousMillis = 0;

//定义段码,这里是共阴段码,可以使用数码管段码软件改变数组值或者任意显示形状

const unsigned char dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//位码

//unsigned char const dofly_WeiMa[]={0,1,2,3};

int ledPins[] = {

  12,8,5, 3, 2, 11, 6, 4, };   // 11,7,4,2,1,10,5,3 数码管实际引脚数,和芯片一样,逆时针数

int segPins[] = {

  13,10,9,7};   //12,9,8,6 数码管实际引脚数,和芯片一样,逆时针数

unsigned char displayTemp[4];//显示缓冲区,存放段码

void setup() {

// 循环设置,把对应的端口都设置成输出

  for (int thisLed = 0; thisLed < ledCount; thisLed++) {

    pinMode(ledPins[thisLed], OUTPUT); }

  for (int thisSeg = 0; thisSeg < segCount; thisSeg++) {

    pinMode(segPins[thisSeg], OUTPUT);

  }

  MsTimer2::set(5, Timedisp);  //定义Timedisp为时钟中断调用的子程序,每5ms触发时钟中断进入一次Timedisp函数

  MsTimer2::start();      //时钟中断开始

}

// 数据处理,把需要处理的byte数据写到对应的引脚端口。

void deal(unsigned char value){

  for(int i=0;i<8;i++)

    digitalWrite(ledPins[i],bitRead(value,i));//使用了bitWrite函数,非常简单

    // !bitRead(value,i),这里前面加!(非运算符号),取决于使用的是共阴还是共阳数码管。

}

// 时钟中断调用的显示程序

//每中断一次,显示displayTemp[0]—displayTemp[3]中的一个段码值一次

void Timedisp() {

  static int i;

  deal(0);// 清除“鬼影”

  for(int a=0;a<segCount;a++) //循环写位码,任何时刻只有1位数码管选通,之前全部关闭,然后再选通需要的那位数码管

    digitalWrite(segPins[a],1);//关闭全部数码管

  digitalWrite(segPins[i],0);//选通对应的数码管

  deal(displayTemp[i]);//读取对应的段码值写到对应的数码管

  i++;

  if(i==segCount) //4位结束后重新循环

    i=0;

}

//显示程序,在4位数码中显示num,num小于10000

void disp(unsigned long num) {

  num=num%10000;//取模运算,防止num超过9999

  displayTemp[0]=dofly_DuanMa[num/1000];       //将num的个位数段码值送到显示缓存displayTemp[0]中

  displayTemp[1]=dofly_DuanMa[(num%1000)/100];    //将num的十位数段码值送到显示缓存displayTemp[1]中

  displayTemp[2]=dofly_DuanMa[((num%1000)%100)/10]; //将num的百位数段码值送到显示缓存displayTemp[2]中

  displayTemp[3]=dofly_DuanMa[((num%1000)%100)%10]; //将num的千位数段码值送到显示缓存displayTemp[3]中

}

// 主循环

void loop() {

    static unsigned int num;//定义一个数据

    disp(num);

    num++;

    delay(100); //延时100ms

}

有关arduino用时钟中断方式的4位数码管动态显示的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  5. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  6. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  7. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  8. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

随机推荐