51单片机 定时器0中断控制8X8点阵循环显示数字0~9

通过定时器0中断控制8X8点阵屏1秒显示1个数字

循环显示数字0~9

#include <reg51.h>
#include <intrins.h>

typedef unsigned int u16;
typedef unsigned char u8;

u16 time;
u16 i,j;

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

u8 code ledduan[][8]={
   
   {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},     //0
                      {0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00},     //1
                      {0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},     //2
	                    {0x00,0x00,0x2a,0x49,0x49,0x49,0x36,0x00},     //3
                      {0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00},     //4
                      {0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00},     //5
                      {0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00},     //6
                      {0x00,0x00,0x40,0x40,0x4f,0x50,0x60,0x00},     //7
                      {0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00},     //8
                      {0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00},};   //9

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

void delay(u16 i)
{
	while(i--);
}

void timer0init()
{
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	ET0=1;
	TR0=1;
	EA=1;
}

void Hc595SendByte(u8 dat)
{
	u8 i;
	SRCLK=0;
	RCLK=0;
	for(i=0;i<8;i++)
	{
		SER=dat>>7;
		dat<<=1;
		
		SRCLK=1;
		_nop_();
		_nop_();
		SRCLK=0;
	}
	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;
}

void main()
{
	timer0init();
	while(1)
	{
	  for(i=0;i<8;i++)
		{
		  P0=ledwei[i];
			Hc595SendByte(ledduan[j][i]);
			delay(50);
			Hc595SendByte(0x00);
		}
  }
}

void timer0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	time++;
	if(time>=20)
	{
		j++;
		time=0;
	}
	if(j>=10)
	{
		j=0;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_56894255/article/details/121578008