蓝桥杯51单片机

#数码管灯显示#

常用字符0~9

与HC573的关联

数码管段选位选原理图

结果:可以控制亮的数码管的个数,但是亮的数码管的数值都是一样的

动态数码管编写

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
	
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;

//code 不变的值
code uchar seqment[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};

void hc573(uchar channel)
//573全部功能
//4(100)→led
//5(101)→蜂鸣器与继电器
//6(110)→数码管控制阳极
//7(111)→数码管控制阴极
{
	switch(channel)
	{
		case 4:LSA=0;LSB=0;LSC=1;break;
		case 5:LSA=1;LSB=0;LSC=1;break;
		case 6:LSA=0;LSB=1;LSC=1;break;
		case 7:LSA=1;LSB=1;LSC=1;break;
	}
}
//led和蜂鸣器初始化
void init()
{
	hc573(4);
	P0=0XFF;
	hc573(5);
	P0=0X00;
}
//延时
void delay_ms(uint xms)
{
	for( ;xms>0;xms--)
	{
	  unsigned char data i, j;

		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	
	}
}
//数码管设置,显示日期
void seg(uchar i,uint num)
{
	hc573(7);
	P0=0X00;
	//阳极Y6为1,一个一个显示,时间短暂,位置一个一个变化
	hc573(6);
	P0=0X01<<(i-1);//选择第几个亮
	hc573(7);
	P0=seqment[num];
	delay_ms(1);
	
}

//数码管显示

void display()
{
	seg(1,2);
	seg(2,0);
	seg(3,2);
	seg(4,4);
	seg(5,0);
	seg(6,6);
  seg(7,2);
	seg(8,9);
}
void main()
{
	init();
	while(1)
	{
		display();//数组使用
	}
}

其中的数码管函数显示定义

⑧做一个计时器,数码管从0往上加,每次加一,时间间隔为一秒,加到100归0,循环过程

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

//定义
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;

//数码管
code smg_number[]={0xc0, 0xf9,0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80,0x90,0xbf,0x7f};
//时间变量
uint time;
uchar count;//计数

//hc573定义
void hc573(uint channel)
{
	switch(channel)
	{
		case 4:LSA=0;LSB=0;LSC=1;break;
		case 5:LSA=1;LSB=0;LSC=1;break;
		case 6:LSA=0;LSB=1;LSC=1;break;
		case 7:LSA=1;LSB=1;LSC=1;break;
	}
}

//初始化
void init()
{
	hc573(4);
	P0=0XFF;
	hc573(5);
	P0=0X00;
}



void delay_ms(uchar xms)	//@12.000MHz
{
	for( ;xms>0;xms--)
	{
		unsigned char data i, j;

		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}
}
//数码管位选
void smg(uchar pos,seg)
{
	hc573(7);
	P0=0Xff;//消隐
	hc573(6);
	P0=0X01<<(pos-1);//数码管位选
	hc573(7);
	P0=smg_number[seg];//数码管段选
	delay_ms(1);
}


//数码管计时
void display()
{
		smg(1,time/1000);//取一位开头整数,千分位
		smg(2,time/100%10);//取俩位开头整数,取俩位整数的末位为百分位
		smg(3,time%100/10);//取末尾俩位整数,取俩位整数的开头,为十分位
		smg(4,time%10);//取末位数字,为个位
}//执行250 次,就是一秒钟1000ms除以4位数字,就是250


//主函数
void main()
{
	init();
	while(1)
	{
		display();
		
	}
}
	

#经过烧录我们可以发现,根手机显示时间还有差异,对于延时函数的使用也很占用空间,这就引出了后来的定时器使用#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值