51单片机001:利用动态扫描方法在三位数码管上显示出稳定的321

        思路解析:

        1、首先要知道数码管静态扫描和动态扫描的区别:

        静态扫描:只能点亮一个数码管,点亮固定的段位。

        动态扫描:本质还是静态扫描,只是利用人眼的视觉暂留效应,以一定的频率依次点亮多个数码管的段位,只要频率足够大,人眼无法识别出,就会形成多个数码管同时亮的现象,可以控制多个数码管的显示。

        2、位选:选择三位数码管

        通过对P2^2,P2^3,P2^4赋值来选择对应的数码管

            

        3、段选:让选择的三位数码管分别显示321

        通过对P0口进行赋值使数码管显示对应的数字

               

        完整代码:

#include "reg52.h"

typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;

#define SMG_A_DP_PORT	P0	//使用宏定义数码管段码口

//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//延时函数
void delay_10us(u16 ten_us)
{
	while(ten_us--);	
}

void smg_display(void)
{
    LSC = 1; LSB = 1; LSA = 1;
    SMG_A_DP_PORT = gsmg_code[3];  // 百位数码管显示
    delay_10us(100);            
	
	LSC = 1; LSB = 1; LSA = 0;
    SMG_A_DP_PORT = gsmg_code[2];  // 十位数码管显示
    delay_10us(100);
	
	LSC = 1; LSB = 0; LSA = 1;
    SMG_A_DP_PORT = gsmg_code[1];  // 个位数码管显示
    delay_10us(100);
}

void main()
{
	while(1)
	{
		smg_display();
	}
}

猜你喜欢

转载自blog.csdn.net/chenhuifei/article/details/134320763