1. 静态数码管显示
点亮数码管需要用到P0端口和P2部分端口,P0端口负责显示要输出的数字,P2部分端口负责让哪个数码管点亮,具体的去看电路图,这次还包含了74HC245和74HC138芯片
现在让单片机数码管区域第三位的数码管显示数字5,程序如下
#include"reg52.h"
//定义P2端口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//用数组来表示数码管上每个数字输出对应的相关电平输入
int str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
void Display(int Location,int Number)
{
//利用case语句将8个数码管显示的位置一一列举
switch(Location)
{
case 1: LSC=0;LSB=0;LSA=0; break;
case 2: LSC=0;LSB=0;LSA=1; break;
case 3: LSC=0;LSB=1;LSA=0; break;
case 4: LSC=0;LSB=1;LSA=1; break;
case 5: LSC=1;LSB=0;LSA=0; break;
case 6: LSC=1;LSB=0;LSA=1; break;
case 7: LSC=1;LSB=1;LSA=0; break;
case 8: LSC=1;LSB=1;LSA=1; break;
}
P0=str[Number];
}
int main()
{
Display(3,5); //参数1表示数码管位置,参数2表示要输出的0-9的数字
while(1)
{
}
}
实验现象如下
2.动态数码管显示
这部分主要是注意延时和消除残影的问题,如不加延时的,两个数字切换的非常快,可能会导致篡位,程序如下
#include"reg52.h"
//定义P2端口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//用数组来表示数码管上每个数字输出对应的相关电平输入
int str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
void Delay(int time)
{
while(time--) //while循环一次需要10us
{
}
}
void Display(int Location,int Number)
{
//利用case语句将8个数码管显示的位置一一列举
switch(Location)
{
case 1: LSC=0;LSB=0;LSA=0; break;
case 2: LSC=0;LSB=0;LSA=1; break;
case 3: LSC=0;LSB=1;LSA=0; break;
case 4: LSC=0;LSB=1;LSA=1; break;
case 5: LSC=1;LSB=0;LSA=0; break;
case 6: LSC=1;LSB=0;LSA=1; break;
case 7: LSC=1;LSB=1;LSA=0; break;
case 8: LSC=1;LSB=1;LSA=1; break;
}
P0=str[Number];
//延时一段时间,等待显示稳定,如果不加延时,就可能上一个数字和下一下篡位
Delay(100);
//消除数码管残影
P0=0x00;
}
int main()
{
//参数1表示数码管位置,参数2表示要输出的0-9的数字
while(1)
{
Display(1,1);
Display(2,2);
Display(3,3);
}
}