数码管循环显示数字

一、前言

数码管进行显示成功后,可根据自己的想法进行改进。本设计采用八位数码管进行循环显示0~f,其中涉及到段码及位码的调用,可更深一步的理解数码管的使用。

二、芯片使用

1、74hc245

在这里插入图片描述

本设计中数码管的段选使用74hc245进行驱动。可以为数码管提供足够且稳定的电压,数码管与74hc245芯片之间需加电阻进行分压以保护数码管不会因为电压过大而烧毁。

芯片引脚功能:

第1脚DIR,为输入输出端口转换用, DIR=“1”高电平时信号由“A”端输入“B”端输出, DIR=“0”低电平时信号由“B”端输入“A”端输出。

第2~9脚“A”信号输入输出端,A1=B1﹑﹑﹑﹑﹑﹑A8=B8,A1与B1是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。 第11~18脚“B”信号输入输出端,功能与“A”端一样,不在描述。

第19脚G,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用

第10脚GND,电源地。

第20脚VCC,电源正极。

序号名称功能
1DIR输入输出转换端口,高电平A到B,低电平B到A。
2~9A0~A7输入输出端口
10GND电源负极
11~18B7~B0输入输出端口
19OE使能端,高电平信号不导通,低电平导通
20VCC电源正极

2、74ls138译码器

在这里插入图片描述

本设计中数码管的位选使用138译码器进行驱动,使用的数码管为共阴极数码管。

芯片引脚功能:

A0~A2对应Y0——Y7;A0,A1,A2以二进制形式输入,然后转换成[十进制,对应相应Y的序号输出低电平,其他均为高电平;

序号名称功能
1~3A0、A1、A2地址输入端
4、5E3、E2选通端(低电平有效)
6E1选通端(高电平有效)
8GND电源负极
7、9~15Y7~Y0输出端
16VCC电源正极

三、硬件连接

实物图

在这里插入图片描述

原理图

在这里插入图片描述

最小单片机系统

在这里插入图片描述

驱动电路

在这里插入图片描述

位码控制电路

在这里插入图片描述

四、软件代码

在这里插入图片描述

main主函数

主函数较为简单,对数码管显示函数的调用,以及定时器函数的初始化。

void main()
{	
	Timer0Init();  //定时器0初始化
	while(1)
	{	
		DigDisplay();  //数码管显示函数	
	}		
}

void Timer0() interrupt 1

定时器函数,用于调整循环的快慢以及显示数字的变化

TH0=(65536-6000)/256;	//给定时器赋初值,定时10ms
	TL0=(65536-6000)%256;
	a--;
	  if(a==0)
	    {
				j++;
			  a=100;
			  if(j==16)
	       {
		       j=0;
	       }
		   }	 

大致讲解:在进行位选后,相对应的段码就会选出来。程序中i用于位选。对应的段码是m。m=j+i是由于0~f有16位

数码管段码、位码显示函数。

void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;//显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;//显示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;//显示第5位
			case(6):
				LSA=0;LSB=1;LSC=1; break;//显示第6位
			case(7):
				LSA=1;LSB=1;LSC=1; break;//显示第7位	
		}
		m=j+i;
		if(m>=16)
			m=m-16;
		P0=smgduan[m];//发送段码
		delay(100); //间隔一段时间扫描	
		P0=0x00;//消隐
	}
}

五、效果展示

视频拍摄效果较差多多包涵。

数码管循环显示数字仿真演示

数码管循环显示数字实物演示

六、代码链接

关注公众号“小小创客者”回复“数码管循环显示数字”获得代码及仿真,如有错误欢迎指正。

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个使用 Verilog 实现共阴极数码管循环显示数字 0 到 9 的代码示例: ```verilog module digit_display( input clk, output reg [3:0] digit_sel, output reg [6:0] segments ); reg [3:0] num; always @ (posedge clk) begin num <= num + 1; if (num == 10) begin num <= 0; end end always @ (posedge clk) begin case (digit_sel) 4'b0001: segments = 7'b1000000; // 0 4'b0010: segments = 7'b1111001; // 1 4'b0100: segments = 7'b0100100; // 2 4'b1000: segments = 7'b0110000; // 3 4'b0001: segments = 7'b0011001; // 4 4'b0010: segments = 7'b0010010; // 5 4'b0100: segments = 7'b0000010; // 6 4'b1000: segments = 7'b1111000; // 7 4'b0001: segments = 7'b0000000; // 8 4'b0010: segments = 7'b0010000; // 9 default: segments = 7'b1111111; // turn off all segments endcase end always @ (posedge clk) begin digit_sel <= digit_sel << 1; if (digit_sel == 4'b1000) begin digit_sel <= 4'b0001; end end endmodule ``` 这个模块有一个输入和两个输出。`clk` 是时钟信号,用于同步数码管显示。`digit_sel` 是一个 4 位输出,用于选择需要显示数码管。`segments` 是一个 7 位输出,其中每一位都对应一个数码管的段。 在 always 块中,使用一个计数器 `num` 实现循环显示数字 0 到 9。首先将 `num` 加 1,然后检查是否等于 10,如果是,则将 `num` 重置为 0。 在第二个 always 块中,根据 `digit_sel` 的值设置对应的段的值。由于这里是共阴极数码管,因此需要将每个段的值取反。 最后,使用一个计数器 `digit_sel` 实现循环显示每个数码管。首先将 `digit_sel` 左移 1 位,然后检查是否等于 8,如果是,则将 `digit_sel` 重置为 1。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值