【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();
}
}
仿真结果显示:
实验二、使用单片机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();
}
}
仿真结果: