返回顶部

【51单片机系列】数码管扩展实验

本文是针对数码管展开的两个扩展实验。

实验一,在8位数码管上从左至右显示“1314-520”

首先对要显示的字符进行编码,采用共阴极数码管,对“1314-520”编码为:0x06,0x4f,0x05,0x66,0x40,0x6d,0x5b,0x3f。然后将码表设置为编好的码,按照显示0-7的方式显示即可。

实现代码如下:

/*
	实现功能:2个四位一体数码管从左到右依次显示1314-520
	[2023-12-06] zoya
*/
#include "reg52.h"

typedef unsigned char u8;
typedef unsigned short u16;

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

// 共阴极LED数码管编码表
u8 code smg[] = {0x06,	0x4f,	0x06,	0x66,	0x40,	0x6d,	0x5b,	0x3f};  // 1314-520
 

// 延时函数,i=1延时10us
void delay(u16 i)
{
	while(i--);
}

// 数码管显示函数
void digDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)
		{
			case 0: LSA = 0; LSB = 0; LSC = 0; break;  // 000 Y0
			case 1: LSA = 1; LSB = 0; LSC = 0; break;  // 001 Y1
			case 2: LSA = 0; LSB = 1; LSC = 0; break;  // 010 Y2
			case 3: LSA = 1; LSB = 1; LSC = 0; break;  // 011 Y3
			case 4: LSA = 0; LSB = 0; LSC = 1; break;  // 100 Y4
			case 5: LSA = 1; LSB = 0; LSC = 1; break;  // 101 Y5
			case 6: LSA = 0; LSB = 1; LSC = 1; break;  // 110 Y6
			case 7: LSA = 1; LSB = 1; LSC = 1; break;  // 111 Y7
		}
		
		P0 = smg[i];
		delay(100);
		P0 = 0x00;
	}
}
void main()
{
	u8 i;
	LSA=0;
	LSB=0;
	LSC=0;
	P0 = 0x00;
	while(1)
	{
		digDisplay();
	}
}

仿真结果显示:

动态数码管实现显示1314-520

实验二、使用单片机P1口直接控制数码管位选,不经过38译码器

代码实现如下:

/*
	实现功能:直接使用P1口控制2个四位一体共阴极数码管,从左到右依次显示1314-520
	[2023-12-06] zoya
*/
#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned short u16;

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

// 共阴极LED数码管编码表
u8 code smg[] = {0x06,	0x4f,	0x06,	0x66,	0x40,	0x6d,	0x5b,	0x3f};  // 1314-520
 

// 延时函数,i=1延时10us
void delay(u16 i)
{
	while(i--);
}

// 数码管显示函数
void digDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		
		P0 = smg[i];
		delay(100);
		P0 = 0x00;
		P1 = _crol_(P1, 1);		
	}
}
void main()
{
	u8 i;
	LSA=0;
	LSB=0;
	LSC=0;
	P0 = 0x00;
	P1 = 0xfe;
	while(1)
	{
		digDisplay();
	}
}

仿真结果:

直接使用P1口控制数码管显示1314-520

posted @ 2023-12-06 08:48  Zoya23  阅读(90)  评论(0编辑  收藏  举报