(单片机作业一)STC89C52动态数码管显示520

设计背景
单片机老师要求在520当天,利用手上的单片机,实现一个专属计算机专业的浪漫。

设计基础目的
动态数码管显示520

模块使用
8位动态数码管、8*8led点阵、独立按键

辅助工具
Keil C51编程软件、烧写软件(STC-ISP-15xx)、取字模软件

功能演示

stc89c52做个基础表白

代码实现

#include
#include

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

sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;


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

sbit k1=P3^1;	 //定义P31口是k1
sbit k4=P3^3;

u8 ledduan1[]={0xC0,0x9C,0x22,0x32,0x0B,0x32,0x22,0x1C,};

u8 ledduan2[]={0x97,0xB5,0xD2,0x90,0x07,0xA8,0x47,0xA8,};
			
u8 ledduan3[]={0xE8,0xA8,0xB8,0x07,0x07,0xB8,0xA8,0xE8,};

u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

u8 code smgduan[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0xff};//显示0~F的值

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay(int t1,int t2)
{	u8 g[8];
    u8 p;
	u8 i;
    for(p=3;p>0;p--)
	{
	    g[p]=t1%10;
		t1=t1/10;
	}



	g[4]=16;

	for(p=7;p>=5;p--)
	{
	    g[p]=t2%10;
		t2=t2/10;
	}


	for(i=0;i<9;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
		    case(0):
				LSA=1;LSB=1;LSC=1; break;//显示第0位
			case(1):
				LSA=0;LSB=1;LSC=1; break;//显示第1位
			case(2):
				LSA=1;LSB=0;LSC=1; break;//显示第2位

			case(3):	
				LSA=0;LSB=0;LSC=1; break;//显示第3位
			case(4):
				LSA=1;LSB=1;LSC=0; break;//显示第4位	 

			case(5):
				LSA=0;LSB=1;LSC=0; break;//显示第5位
			case(6):
				LSA=1;LSB=0;LSC=0; break;//显示第6位
			case(7):
				LSA=0;LSB=0;LSC=0; break;//显示第7位
			case(8):
				LSA=1;LSB=1;LSC=1; break;//显示第7位,将点阵屏影响放到第一位数码管	
		}
		P0=smgduan[g[i]];//发送段码
		delay(100); //间隔一段时间扫描	
		P0=0x00;//消隐
	}
}
 void Hc595SendByte(u8 dat)
{
	u8 a;
	SRCLK=0;
	RCLK=0;
	for(a=0;a<8;a++)
	{
		SER=dat>>7;
		dat<<=1;

		SRCLK=1;
		_nop_();
		_nop_();
		SRCLK=0;	
	}

	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;
}

int keypros()
{


	if(k1==0)		  //检测按键K1是否按下
	{	

		  return 3;
	}
	if(k4==0)		  //检测按键K4是否按下
	{	
		  return 5;
	}
	return 0;		
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
   	u8 i;
	u8 get;
	while(1)
	{	
			
		P0=0x7f;
		get=keypros();
		if(get==3)
		{
		for(i=0;i<8;i++)
		{
			P0=ledwei[i];		  //位选
			Hc595SendByte(ledduan1[i]);	//发送段选数据
			delay(100);		   //延时
			Hc595SendByte(0x00);  //消隐
		}
		}
		else if(get==5)
		{
		   for(i=0;i<8;i++)
		{
			P0=ledwei[i];		  //位选
			Hc595SendByte(ledduan2[i]);	//发送段选数据
			delay(100);		   //延时
			Hc595SendByte(0x00);  //消隐
		}
		}
		else if(get==0)
		{
		  for(i=0;i<8;i++)
		{
			P0=ledwei[i];		  //位选
			Hc595SendByte(ledduan3[i]);	//发送段选数据
			delay(100);		   //延时
			Hc595SendByte(0x00);  //消隐
		}
		}
		DigDisplay(520,521);  //数码管显示函数			
	}				  
}

小白一名,如有错误,请及时告知,谢谢

你可能感兴趣的:(单片机)