NO3 蓝桥杯单片机实践之数码管静态显示

数码管静态显示涉及的各部分如下:两个M74HC573、74HC138和或非门的功能在NO1和NO2篇章都详细讲过,这里不再赘述。

数码管的工作原理详情见上一篇。

这里有两个新的原件需要解释一下:

1. 可以看到经M74HC573锁存器 再到以下器件 再连接数码管的“段选”,以下各路都为电阻,只起到限流作用,故也可看做M74HC573锁存器直接连接数码管的“段选”。

2. 查阅资料知以下是两个8*8的LED显示点阵,起到数码管的显示作用,在编写代码过程中,可以不管。

1. 各结构功能回顾

1.1  74HC138译码器

P27,26,25控制8个输出的其中一个作为最终输出(二进制规律)

1.2  M74HC573锁存器

Y6C和Y7C为 1 时正常输出状态,P00~P07分别对应8个输出,同时输出。

1.3 共阳数码管

分为“段选”和“位选”,共阳极时“段选”输入端为低电平(0)时亮,“位选”为高电平时(1)选中这个数字。

2  数码管静态显示

2.1 任务

参考:【基础技能04】共阳数码管的静态显示_哔哩哔哩_bilibili

2.1 思路

由简单到复杂慢慢来

2.1.1 先选中第一个数字显示6为例:

对于数码管,应先“位选”,选择第一个数字,再“段选”让这个数字显示6:

由涉及元件图可以看到,“位选”有关的为与Y6C所连接的锁存器,“段选”有关的为与Y7C所连接的锁存器,而Y6C和Y7C又与两个相同结构的或非门连接,最后均有74HC138译码器控制,因此,需要控制74HC138译码器转换输出端口。

由涉及的各部分原件图知,存在以下通路:

“位选”:P25~P27 ->  Y6 -> Y6C -> P00~P07 -> com1~com8

"段选“:P25~P27 ->  Y7 -> Y7C -> P00~P07 -> a1~dp1(限流电阻看做M74HC573锁存器直接连接数码管的“段选”)

而对于“段选” 可看作数码管显示的内容,“位选”看作数码管显示的位置。

对于“段选”,可做一个数组来储存内容:

code unsigned char SMG_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e  //F
};

完整代码如下(未上机测试):

以下代码还用到了技巧篇中HC138译码器选择端口的函数设置。

#include "stc15f2f60s2.h"

code unsigned char SMG_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e  //F
};

void selectHC138(unsigned int n)
{
	switch(n)
	{
		case 0: 
			P2 = (P2 & 0x1f) | 0x00;  break; 
		case 1:
			P2 = (P2 & 0x1f) | 0x20;  break; 
		case 2:
			P2 = (P2 & 0x1f) | 0x40;  break; 
		case 3: 
			P2 = (P2 & 0x1f) | 0x60;  break; 
		case 4:
			P2 = (P2 & 0x1f) | 0x80;  break; 
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;  break; 
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;  break; 
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;  break;
	}
}

void showSMG()
{
	selectHC138(6);
	P0 = 0x01;
	selectHC138(7);
	P0 = SMG_Table[6];
}


void Delay(unsigned int t)
{
	while(t--);
	while(t--);
}

void main()
{
	while(1)
	{
		showSMG();
	}
}

2.1.2 回到任务

让数码管单独依次选择0~9,则可以使用两个嵌套for循环,最外层进行“位选”,最里层进行“段选”选择0~9进行显示;

进一步的,要让其所有位置同时显示0~F,则需要“位选”让所有数码管位置同时置为高电平(而不是像上题一样利用for依次选择位置),最后再利用一个for循环进行“段选”选择0~F斤进行显示。

2.2 完整代码如下:

#include "stc15f2k60s2.h"


void Delay(unsigned int t)
{
	while(t--);
	while(t--);
}


code unsigned char SMG_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e  //F
};

void selectHC138(unsigned int n)
{
	switch(n)
	{
		case 0: 
			P2 = (P2 & 0x1f) | 0x00;  break; 
		case 1:
			P2 = (P2 & 0x1f) | 0x20;  break; 
		case 2:
			P2 = (P2 & 0x1f) | 0x40;  break; 
		case 3: 
			P2 = (P2 & 0x1f) | 0x60;  break; 
		case 4:
			P2 = (P2 & 0x1f) | 0x80;  break; 
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;  break; 
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;  break; 
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;  break;
	}
}

void showSMG()
{
	unsigned int i,j;
	for(i=0;i<8;i++)
	{
		selectHC138(6);
		P0 = 0x01 << i;
		for(j=0;j<10;j++)
		{
			selectHC138(7);
			P0 = SMG_Table[j];
			Delay(60000);
		}
	}
	selectHC138(6);
	P0 = 0xff;
	for(j=0;j<16;j++)
	{
		selectHC138(7);
		P0 = SMG_Table[j];
		Delay(60000);
		Delay(60000);
		Delay(60000);
	}
	//selectHC138(6);
	//P0 = 0x01;
	//selectHC138(7);
	//P0 = SMG_Table[6];
}

void close()
{
	selectHC138(5);
	P0 = 0x00;
	selectHC138(4);
	P0 = 0xff;
}

void main()
{
	close();
	while(1)
	{
		showSMG();
	}
}

欢迎指正。

  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值