四位7段LED数码管显示数字

2023.11.10

(一)C++语言

        数组array

        (1)声明数组

                类型 数组名称[ 数组长度 ]

                int SleepyCat[10] //声明创建一个名为 SleepyCat的数组,其中数据类型为int型,数组长度为10,即包含序列号0~9共10个元素

        (2)初始化数组

                ①可以和(1)一起,声明并初始化

                类型 数组名称[数组长度] = {初始数据}

                ②而对某个索引具体赋值

                数组名称[索引] = 数据

        (3)访问数组元素

                数组名称[索引]

        (4)数组长度  sizeof()

                sizeof(sleepycat)/sizeof(sleepycat[0])

        (5) 使用数组作为函数的参量

              比如有一个函数 set1(),一个数组num1={1,2}

              将该数组作为函数参量应该这么写

                set1( num1[ ] ),带上 [ ] 

                此外,函数内部是不能进行数组长度计算的,所以如果函数内部需要使用到数组长度,应该在参量时就给出

                set1 ( num1[ ] , length )

#include <stdio.h>

void main()
{
	//int sleepycat[5];//创建数组,这个[]中的5是数组长度
	int sleepycat[5] = { 1 , 2 , 3 , 4 , 5 };//创建并初始化数组
	sleepycat[0] = 0;//修改赋值,这里[]中的0是索引,第一个元素
	printf("%d\n", sleepycat[0]);//访问数组元素
	printf("%d", sizeof(sleepycat)/sizeof(sleepycat[0]));//数组长度
}

(二)LED数码管

选用共阴极数码管电路图

还是太极创客,2:19

https://www.bilibili.com/video/BV164411J7GE?p=21&vd_source=20347e81d5f586ee7a33d3a6c73ea587

(1)一位7段LED数码管实现1个数字

仿真在此

https://wokwi.com/projects/381007959203969025

/*
* 让四个7段LED显示数字 =》让一个7段LED显示数字(本代码),四个分别显示数字即可
* 一个7段LED显示一个数字,这包含8个二极管的控制,每个二极管状态只需要“两”
*和“不亮”两个状态,是数字信号输入高低电平即可
* 所以逻辑就是如下:
* 一个二极管0/1状态 =》 循环8次,实现八个二极管的0/1状态,即一个数字
* = 》循环4次,实现四个数字(纠正:不需要,可以四个并行,不用循环结构)
*/
void setup()//一个数字的实现
{
  pinMode(2, OUTPUT);//设置为输出模式
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
	
	
}

void loop()
{
	//数字3 abcdg亮
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, LOW);//e,5 , 0
	digitalWrite(8, LOW);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(1000);
		//其实这里就可以用011110010这串数组来表示数字“3”
	//数字3灭
	digitalWrite(2, LOW);
	digitalWrite(3, LOW);
	digitalWrite(4, LOW);
	digitalWrite(5, LOW);
	digitalWrite(6, LOW);
	digitalWrite(7, LOW);
	digitalWrite(8, LOW);
	digitalWrite(9, LOW);
  delay(1000);

}

(三)一位7段LED数码管实现顺序1~9数字

首先,要确定0·9各个数字所对应的二极管0/1状态.

仿真在此

https://wokwi.com/projects/381015844316145665

然后是我赘余不堪的代码,本来试着用循环来写的,但是不太熟全是bug,得,头疼,今天先不写了,就这样吧xD(忽视掉下面的注释)


void setup()//1~9数字顺序的实现
{
  pinMode(2, OUTPUT);//设置为输出模式
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
	
	
}
int delayTime = 1000;
void loop()
{
	//数字1亮00110000
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, LOW);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, LOW);//d,4 , 1
	digitalWrite(7, LOW);//e,5 , 0
	digitalWrite(8, LOW);//f,6 , 0
	digitalWrite(9, LOW);//g,7 , 1
	delay(delayTime);
	//数字1灭
	set0(delayTime);//全归0
	

	//数字2亮01101101
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, LOW);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, HIGH);//e,5 , 0
	digitalWrite(8, LOW);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(delayTime);
	//数字2灭
	set0(delayTime);

	//数字3 abcdg亮
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, LOW);//e,5 , 0
	digitalWrite(8, LOW);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(delayTime);
		//其实这里就可以用011110010这串数组来表示数字“3”
	//数字3灭

	set0(delayTime);

	//数字4亮00110011
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, LOW);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, LOW);//d,4 , 1
	digitalWrite(7, LOW);//e,5 , 0
	digitalWrite(8, HIGH);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(delayTime);
	//数字4灭
	set0(delayTime);

	//数字5亮01011011
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, LOW);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, LOW);//e,5 , 0
	digitalWrite(8, HIGH);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(delayTime);
	//数字5灭
	set0(delayTime);

	//数字6亮01011111
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, LOW);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, HIGH);//e,5 , 0
	digitalWrite(8, HIGH);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(delayTime);
	//数字6灭
	set0(delayTime);

	//数字7亮01110000
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, LOW);//d,4 , 1
	digitalWrite(7, LOW);//e,5 , 0
	digitalWrite(8, LOW);//f,6 , 0
	digitalWrite(9, LOW);//g,7 , 1
	delay(delayTime);
	//数字7灭
	set0(delayTime);

	//数字8亮01111111
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, HIGH);//e,5 , 0
	digitalWrite(8, HIGH);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(delayTime);
	//数字8灭
	set0(delayTime);

		//数字9亮01111011
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, LOW);//e,5 , 0
	digitalWrite(8, HIGH);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(delayTime);
	//数字9灭
	set0(delayTime);

		//数字0亮
	digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, HIGH);//e,5 , 0
	digitalWrite(8, HIGH);//f,6 , 0
	digitalWrite(9, LOW);//g,7 , 1
	delay(delayTime);
	//数字0灭
	digitalWrite(2, LOW);
	digitalWrite(3, LOW);
	digitalWrite(4, LOW);
	digitalWrite(5, LOW);
	digitalWrite(6, LOW);
	digitalWrite(7, LOW);
	digitalWrite(8, LOW);
	digitalWrite(9, LOW);
  delay(delayTime);
}

void set0(int Time)//全部电平归0
{
	digitalWrite(2, LOW);
	digitalWrite(3, LOW);
	digitalWrite(4, LOW);
	digitalWrite(5, LOW);
	digitalWrite(6, LOW);
	digitalWrite(7, LOW);
	digitalWrite(8, LOW);
	digitalWrite(9, LOW);
  delay(Time);
}

===============================日期分割线=================================

11.11

用循环和判断精简了一下10日的代码

仿真链接在此

https://wokwi.com/projects/381067050542314497

void setup()
{
  pinMode(2, OUTPUT);//设置为输出模式
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
	
	
}
int num1[8] = {0,0,1,1,0,0,0,0};
int num2[8] = {0,1,1,0,1,1,0,1};
int num3[8] = {0,1,1,1,1,0,0,1};
int num4[8] = {0,0,1,1,0,0,1,1};
int num5[8] = {0,1,0,1,1,0,1,1};
int num6[8] = {0,1,0,1,1,1,1,1};
int num7[8] = {0,1,1,1,0,0,0,0};
int num8[8] = {0,1,1,1,1,1,1,1};
int num9[8] = {0,1,1,1,1,0,1,1};
int num0[8] = {0,1,1,1,1,1,1,0};//dp,a,b,c,d,e,f,g
//各个数字的编码
int delayTime = 1000;

void loop()
{
	
	//数字1亮00110000
	int length = sizeof(num1)/sizeof(num1[0]);
	set1(num1,length,delayTime);
	//数字1灭
	set0(delayTime);//全归0
	

	//数字2亮01101101
	length = sizeof(num2)/sizeof(num2[0]);
	set1(num2,length,delayTime);
	//数字2灭
	set0(delayTime);

	//数字3 abcdg亮
	length = sizeof(num3)/sizeof(num3[0]);
	set1(num3,length,delayTime);
	/*digitalWrite(2, LOW);//dp,a接在0引脚,状态是0
	digitalWrite(3, HIGH);//a,1 ,1
	digitalWrite(4, HIGH);//b,2 , 1
	digitalWrite(5, HIGH);//c,3 , 1
	digitalWrite(6, HIGH);//d,4 , 1
	digitalWrite(7, LOW);//e,5 , 0
	digitalWrite(8, LOW);//f,6 , 0
	digitalWrite(9, HIGH);//g,7 , 1
	delay(delayTime);
		//其实这里就可以用011110010这串数组来表示数字“3”
	//数字3灭
	digitalWrite(2, LOW);
	digitalWrite(3, LOW);
	digitalWrite(4, LOW);
	digitalWrite(5, LOW);
	digitalWrite(6, LOW);
	digitalWrite(7, LOW);
	digitalWrite(8, LOW);
	digitalWrite(9, LOW);
  delay(delayTime);
	*/
	set0(delayTime);

	//数字4亮00110011
	length = sizeof(num4)/sizeof(num4[0]);
	set1(num4,length,delayTime);
	//数字4灭
	set0(delayTime);

	//数字5亮01011011
	length = sizeof(num5)/sizeof(num5[0]);
	set1(num5,length,delayTime);
	//数字5灭
	set0(delayTime);

	//数字6亮01011111
	length = sizeof(num6)/sizeof(num6[0]);
	set1(num6,length,delayTime);
	//数字6灭
	set0(delayTime);

	//数字7亮01110000
	length = sizeof(num7)/sizeof(num7[0]);
	set1(num7,length,delayTime);
	//数字7灭
	set0(delayTime);

	//数字8亮01111111
	length = sizeof(num8)/sizeof(num8[0]);
	set1(num8,length,delayTime);
	//数字8灭
	set0(delayTime);

		//数字9亮01111011
	length = sizeof(num9)/sizeof(num9[0]);
	set1(num9,length,delayTime);
	//数字9灭
	set0(delayTime);

		//数字0亮
	length = sizeof(num0)/sizeof(num0[0]);
	set1(num0,length,delayTime);
	//数字0灭
	set0(delayTime);
}

void set0(int Time)//全部电平归0
{
	digitalWrite(2, LOW);
	digitalWrite(3, LOW);
	digitalWrite(4, LOW);
	digitalWrite(5, LOW);
	digitalWrite(6, LOW);
	digitalWrite(7, LOW);
	digitalWrite(8, LOW);
	digitalWrite(9, LOW);
  delay(Time);
}


void set1(int num[] , int length , int Time)//设置相应的电平以显示数字
{
	int i = 0; //i是数组索引
	while( i <= 7)//该数组一共包含8个元素
	{
		int pincode = i + 2 ;//pincode是引脚号,这里索引是0,对应二极管是dp,引脚号是2
		int Vcode = num[i]; //获取电平信息Vcode
		if( Vcode == 1)//判断电平信息是0还是1
		{
			digitalWrite(pincode , HIGH);
		}
		else
		{
			digitalWrite(pincode , LOW);
		}
		i++;//进行下一个索引的判定
	}
	delay(Time);//保持时间
}

### 七段数码管显示数字的Verilog实现 为了实现在FPGA上通过七段数码管显示数字的功能,通常会涉及到将输入的数据(通常是BCD编码)转换成适合驱动数码管的形式。具体来说,这涉及到了解七段数码管的工作机制以及如何编写相应的Verilog代码。 #### 解析七段数码管工作原理 七段数码管由七个发光二极管构成,分别标记为a至g,用于表示不同形状的部分。当这些部分按照特定模式点亮时,就可以形成从0到9的各种阿拉伯数字以及其他一些简单字符[^1]。 对于每一个待显示的数值,都需要计算出哪些应该被激活才能正确呈现该值。这种映射关系可以通过查阅资料获得标准表格,并据此构建逻辑电路完成自动化的信号处理流程。 #### 使用Verilog设计编码转换电路 在实际编程过程中,可以创建一个模块专门负责把接收到的8421 BCD编码转变为能够直接作用于各LED的状态位序列。下面给出了一简单的Verilog程序片作为示范: ```verilog module bcd_to_7seg( input wire [3:0]bcd, // 输入4位BCD码 output reg [6:0]segments // 输出给定BCD对应得7显示码 ); always @(bcd) begin case(bcd) 4'b0000 : segments = 7'b1000000; // '0' 4'b0001 : segments = 7'b1111001; // '1' 4'b0010 : segments = 7'b0100100; // '2' 4'b0011 : segments = 7'b0110000; // '3' 4'b0100 : segments = 7'b0011001; // '4' 4'b0101 : segments = 7'b0010010; // '5' 4'b0110 : segments = 7'b0000010; // '6' 4'b0111 : segments = 7'b1111000; // '7' 4'b1000 : segments = 7'b0000000; // '8' 4'b1001 : segments = 7'b0010000; // '9' default : segments = 7'bx; endcase end endmodule ``` 上述代码定义了一个名为`bcd_to_7seg`的实体,它接收四位宽的BCD格式数据并输出相应宽度的二进制字符串去控制七显示器中的各个元件亮度状态[^2]。 #### 多个数码管的同时显示方案 考虑到单片FPGA可能连接多只独立工作的数码管设备,在此情况下可采取动态扫描方式减少所需IO口数量。即让所有共阳/阴极相连而各自保留单独的选择线;之后轮流快速切换每一片选通信号并向公共端发送目标图案直至一轮结束再重复循环操作,给人眼造成稳定视觉效果的印象[^3]。 另外一种优化策略是引入三八译码器配合多位数码管阵列使用,这样不仅节省了宝贵的I/O资源而且简化了整体架构的设计复杂度[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值