基于arduino UNO开发板的四位数码管循环计数器

本文介绍了使用arduino UNO开发板创建一个四位数码管循环计数器的基础知识,包括数码管的工作原理、开发板引脚说明、程序设计,以及中断机制的应用。文章详细讲解了如何通过全局变量定义、引脚初始化、主程序和子程序来实现计数功能,特别强调了数组和中断在程序中的重要角色。
摘要由CSDN通过智能技术生成

此为基础小白文

说明

四位数码管几个说明
每一位数码管由八个发光二极管组成,其供电模式分为共阳极共阴极两种,一般有12个引脚。
(1)共阳极:即四位供电脚LED1+、LED2+、LED3+、LED4+需要给高电平(HIGH);八个显示A、B、C、D、E、F、G、dp需要给低电平(LOW)。
(2)共阴极:即四位供电引脚LED1-、LED2-、LED3-、LED4-需要给低电平(LOW);八个显示引脚A、B、C、D、E、F、G、dp需要给高电平(HIGH)。
(3)位选和段选:位选指通过给LED1+、LED2+、LED3+、LED4+其中一个供电电平,即哪一位亮,全给就是全都亮。段选指要显示的数字多少,这里我们用数组实现段选(下面会讲)。
*本实验为共阳极管

arduino开发板引脚说明
实验的开发板用到的数字引脚2~13,其中2号引脚为中断引脚:

说明 引脚
中断触发 2、3
数字输入输出 2、3、4、5、6、7、8、9、10、11、12、13

程序说明
本实验实现数码管计数和循环计数,两个功能。
实验中可以重点学习的两个程序内容:数组中断机制
数组说明
一维数组 :粗浅解释指一组相同类型元素的集合。
其函数表达式:类型说明符 数组名 [常量表达式] = {同类型元素}
例如:  int value [5];
初始化后: int value [5] = {1, 2, 3, 4, 5};//读作一组名为value的整数型数组,每个元素分别赋值1、2、3、4、5
调用:
value [1] ;//此时名为value值是1

二维数组:指一维数组的叠加的集合。
其函数表达式:类型说明符 数组名 [常量表达式] [常量表达式] = {同类型元素}
例如:  int value [5]【4】;
初始化后:int value [5]【4】=
{
{0,0,0,1}
{0,0,1,0}
{0,0,1,1}
{0,1,0,0}
{0,1,0,1}
};//理解为从0行0零开始的,一共5行4列的一维数组
调用:
value [0]【0】;//第零行,第零列,则它的值为0
value [2]【3】;//第二行,第三列,它的值为1

//想更深入学习数组的,有B站大佬视频的BV号:BV1ka411M73P

程序模块化解析

一、全局变量定义

(1)引脚定义:
定义引脚3、4、5、6、7、8、9对应数码管的a、b、c、d、e、f、g引脚;
定义计数变量value;
定义中断接口为2,赋予了不可改变的字符型button:const(不可改变)byte(字符型)button(名称)=(赋予)2(接口)
(2)定义一个int(整数型)名为table的10行,7列的数组表格。
引脚从左到右数为a、b、c、d、e、f、g所以是7列,要显示0~9数字所以是10行,最后通过低电平点亮(0为低电平,1为高电平)。
例如数码管显示数字0,则g=1(灭),a=b=c=d=e=f=0(亮)。

dp  aaaaa    
  f       b
  f       b
   ggggg   
  e      c
  e      c
    ddddd
数码管八个发光二极管排布

int a = 3;//引脚定义
int b = 4;//引脚定义
int c = 5;//引脚定义
int d = 6;//引脚定义
int e = 7;//引脚定义
int f = 8;//引脚定义
int g = 9;//引脚定义
int value;//计数变量
const byte button = 2;//中断接口
int table[10] [7] =
{
    //数字显示数组 从左到右a b c d e f g
  {
    0, 0, 0, 0, 0, 0, 1,  },//数字0
  {
    1, 0, 0, 1, 1, 1, 1,  },//数字1
  {
    0, 0, 1, 0, 0, 1, 0,  }
Arduino Nano开发板上控制四位数码管的代码通常涉及到I²C通信,因为数码管通常是通过并行接口连接到微控制器,而Arduino Nano提供了对I²C的支持。这里是一个基本的示例,假设我们使用的是常见的7段数码管,并且已连接到数字0-3对应的GPIO口: ```cpp #include <Wire.h> // 引入I2C库 #define DIGIT_0 0 #define DIGIT_1 1 #define DIGIT_2 2 #define DIGIT_3 3 // 数码管连接的GPIO口 // 根据数码管型号设置初始化字典 const byteabcdef[8] = {B0, B1, B2, B3, B4, B5, B6, B7}; const byte segmentAddresses[] = { DDRC(DIGIT_0), PORTC(DIGIT_0), // 设置数码管A-G脚作为输出 DDRC(DIGIT_1), PORTC(DIGIT_1), DDRC(DIGIT_2), PORTC(DIGIT_2), DDRC(DIGIT_3), PORTC(DIGIT_3) }; void setup() { Wire.begin(); // 初始化I2C for (byte i = 0; i < sizeof(segmentAddresses) / sizeof(segmentAddresses[0]); ++i) { pinMode(segmentAddresses[i], OUTPUT); // 将所有端口设为输出 } } void loop() { int digitValue = 1234; // 例如显示数字1234 for (int i = 0; i <= 3; i++) { // 遍历每一位 displayDigit(digitValue % 10, i); // 显示当前位 digitValue /= 10; } delay(500); // 稍作延时再改变显示 } void displayDigit(int value, byte position) { byte mask = 1 << position; // 获取第几位的二进制掩码 // 构造每位显示的数据字节 byte data = ((value >= 10 ? 1 : 0) << 4) | (byteabcdef[value]); // 发送数据到相应数码管的地址 Wire.beginTransmission(SEGMENT_ADDRESSES[position]); // 假设SEGMENT_ADDRESSES是动态数组 Wire.write(data); Wire.endTransmission(); digitalWrite(segmentAddresses[position], ~mask); // 只更新这一位,其他位保持不变 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值