4.蓝桥杯大赛单片机系列—数码管静态显示

  一,设计目标:

         掌握蜂数码管静态显示,数码管的显示主要有两种方式:静态显示动态显示两种,因为静态显示只能显示一个数据,如:8888 8888 ,1111 1111 ;对于设置成钟表如:12-30-59 就不能使用静态显示了。因为动态数码管显示灵活所以几乎大多数都使用动态显示,但是动态显示的本质还是多个静态一个个显示的不断快速切换(速度太快肉眼看不出),归根结底,静态数码管虽然几乎没有人使用,但是它是动态显示数码管的基础,有助于你接下来学习动态数码管的理解。


二,设计思路:

    首先,需要对74HC138译码器的P2口进行配置,但是你要明白数码管的显示是由两大部分配置的:段码和位码段码:数码管是由一段一段的灯条(如图 f,g,e ,c 等)组成,段码决定了数码管显示的内容;位码:大多数码管是由好几个拼接而成的,蓝桥杯大赛单片机则是八位数码管,所以位码是负责决定显示的位置。

        而且在蓝桥杯单片机里面,段码和位码的配置不是一块的,是频道6负责位码配置,频道7负责段码配置,所以其M74HC573M1R锁存器P0口上的配置表达的功能也大有区别,一个负责数码管显示什么,一个负责数码管在八个数码管中哪位置显示。特别注意的是蓝桥杯单片机数码管是共阳极数码管(段码 0亮1灭),但其位码是(1亮0灭),所以它的常用段码数组是:

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

 前十个(0~9)最常用,后面(a,b,c ...)可以自己直接推。

三,代码实现:

(1)八个数码管都静态显示0~9循环;
#include "reg52.h"
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
			 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
			
void delay(unsigned int n)
{
     while(n--);
     while(n--);
}	
			 
void initHC138(unsigned char n)
{
	switch(n)
	{
		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 main()
{
	int i=0;
	initHC138(5);
	P0=0x00;   //防止蜂鸣器乱叫
	while(1)
	{
		for(i=0;i<10;i++)
		 {
			 initHC138(6);
	         P0=0xff;   //位码 设置八个数码管全部显示
			 initHC138(7);
			 P0 = SMG_duanma[i]; //段码 设置显示数 i
			 delay(10000);
			 delay(10000);
		 }
	}
}
 (2)八个数码管一个个显示自己的位置(0~7);
#include "reg52.h"

unsigned char code SMG_duanma[18]=
			{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
			 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
			 0xbf,0x7f};
			
void delay(unsigned int n)
{
     while(n--);
     while(n--);
}	
			 
void initHC138(unsigned char n)
{
	switch(n)
	{
		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 smg_bit(unsigned char dat,unsigned pos)
{
	initHC138(6);//位码
	P0=0x01<<pos;; //显示位置设置 
	initHC138(7);//段码
	P0=dat; 
}


void main()
{
	int i=0;
	initHC138(5);
	P0=0x00;
	while(1)
	{
		for(i=0;i<8;i++)
		 {
	         smg_bit(SMG_duanma[i],i);
			 delay(10000);
			 delay(10000);
		 }
	}
}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值