利用动态数码管显示与计数

一般动态数码管都是通过 74HC138 译码器来实现,而本文反其道,通过定义数组,使用单片机 P1 口直接控制数码管位选
控制显示 1314-520代码如下:


#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};// 显 示0~F 的值
uchar code smgwei[8]={0x7f,0xbf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar disp[8];

void delay_10us(uint i)
{
	while(i--);
}
void Digdisplay()
{
	uchar i;
	for(i=0;i<8;i++)
	{
		switch(i)//控制位选信号
		{
			case 0:P1=smgwei[0];break;
			case 1:P1=smgwei[1];break;
			case 2:P1=smgwei[2];break;
			case 3:P1=smgwei[3];break;
			case 4:P1=smgwei[4];break;
			case 5:P1=smgwei[5];break;
			case 6:P1=smgwei[6];break;
			case 7:P1=smgwei[7];break;
		}
	P0=disp[i];
	delay_10us(100);
	P0=0x00;
	}
}
void pros()
{	
	disp[0]=smgduan[1];
	disp[1]=smgduan[3];
	disp[2]=smgduan[1];
	disp[3]=smgduan[4];
	disp[4]=smgduan[17];
	disp[5]=smgduan[5];
	disp[6]=smgduan[2];
	disp[7]=smgduan[0];
}

void main()
{
	while(1)
	{
		Digdisplay();
		pros();	
	}	
}

控制其进行计算

#include <reg52.h>

typedef unsigned long u32;	   //对数据类型进行声明定义
typedef unsigned int u16;	
typedef unsigned char u8;


#define SMG P0		//定义数码管段数据接口P0

u8 buff[8];		//显示缓冲数组
u8 a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//分别显示0 1 2 3 4 5 6 7 8 9
u8 code smgwei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay_ms(u16 t)
{
	u16 i,j;
	for(i=0; i<t; i++)
		for(j=0; j<120; j++);
}

void update(u32 val)  //更新缓冲数组
{	

	buff[0]=val%10;	//12345678/10000000%10=1;
	buff[1]=val/10%10;	 	//12345678/1000000%10=2;
	buff[2]=val/100%10;		//12345678/100000%10=3;
	buff[3]=val/1000%10;		//12345678/10000%10=4;
	buff[4]=val/10000%10;     	//12345678/1000%10=5;
	buff[5]=val/100000%10;	    	//12345678/100%10=6;
	buff[6]=val/1000000%10;	     	//12345678/10%10=7;
	buff[7]=val/10000000%10;		        //12345678%10=8;
	
}

void display(void)	  //显示函数
{
	u8 n;
	for(n=0; n<8; n++)
	{
		switch(n)	  //先位选
		{
			case 0:P1=smgwei[0];break;
			case 1:P1=smgwei[1];break;
			case 2:P1=smgwei[2];break;
			case 3:P1=smgwei[3];break;
			case 4:P1=smgwei[4];break;
			case 5:P1=smgwei[5];break;
			case 6:P1=smgwei[6];break;
			case 7:P1=smgwei[7];break;
		}
		SMG=a[buff[n]];	//后发送段数据
		delay_ms(1);	//小延时,显示更稳定
	}
}

void main(void)
{
	u32 num=0;	 //要显示的数据
	u16 t;		 //延时用
	while(1)
	{
		update(num);	   //更新显示缓冲数组
		for(t=0; t<50; t++)	  //用for循环来延时不然显示不正常
		{
			display();		//显示缓冲数组
		}
		num++;	 //显示数据自加
	}
}

欢迎交流

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值