点亮点阵

仓库

仓库地址:https://gitee.com/EricsT/51_microcontrollers/tree/master/Lattice

点亮点阵中的一个点

#include <reg52.h>

sbit LED = P0 ^ 0;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main(void)
{
	ENLED = 0;
	ADDR0 = 0;//使能U4 74HC138
	ADDR1 = 0;
	ADDR2 = 0;
	ADDR3 = 0;//导通Q10

	LED = 0;//点亮一个
	while(1);	
}

点亮点阵中的一行

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main(void)
{
	ENLED = 0;
	ADDR0 = 0;//使能U4 74HC138
	ADDR1 = 0;
	ADDR2 = 0;
	ADDR3 = 0;//导通Q10

	P0 = 0;//点亮一行
	while(1);	
}

点阵全部点亮

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main(void)
{
	ENLED = 0;
	ADDR3 = 0;//使能U4 74HC138

	EA = 1;//打开中断总开关
	
	TMOD = 1;//设置定时器0为模式1
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值	
	TR0 = 1;//启动定时器0

	ET0 = 1;//打开定时器0的中断
	
	

	while (1);
}

void interruptTimer0() interrupt 1
{
	static char i = 0;//静态变量,保证每次进来的时候都是上一次调用结束的值
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值

	P0 = 0xff;//显示消隐
	switch (i)
	{
		case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = 0; i++; break;//第一行
		case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = 0; i++; break;//第二行
		case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = 0; i++; break;//第三行
		case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = 0; i++; break;//第四行
		case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = 0; i++; break;//第五行
		case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = 0; i++; break;//第六行
		case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = 0; i++; break;//第七行
		case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = 0; i = 0; break;//第八行
		default: break;
	}
}

点阵显示心形图像

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code image[] = 
{
	0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7
};//通过取模软件获取

void main(void)
{
	ENLED = 0;
	ADDR3 = 0;//使能U4 74HC138

	EA = 1;//打开中断总开关
	
	TMOD = 1;//设置定时器0为模式1
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值	
	TR0 = 1;//启动定时器0

	ET0 = 1;//打开定时器0的中断
	
	while (1);
}

void interruptTimer0() interrupt 1
{
	static char i = 0;
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值

	P0 = 0xff;//显示消隐
	switch (i)
	{
		case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = image[0]; i++; break;//第一行
		case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = image[1]; i++; break;//第二行
		case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = image[2]; i++; break;//第三行
		case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = image[3]; i++; break;//第四行
		case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = image[4]; i++; break;//第五行
		case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = image[5]; i++; break;//第六行
		case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = image[6]; i++; break;//第七行
		case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = image[7]; i = 0; break;//第八行
		default: break;
	}

}

图像纵向上移

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code image[] = 
{
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3, 0xFF,
	0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7, 0xFF,
	0x99, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3, 0xFF,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};//通过取模软件获取

void main(void)
{
	ENLED = 0;
	ADDR3 = 0;//使能U4 74HC138

	EA = 1;//打开中断总开关
	
	TMOD = 1;//设置定时器0为模式1
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值	
	TR0 = 1;//启动定时器0

	ET0 = 1;//打开定时器0的中断
	
	while (1);
}

void interruptTimer0() interrupt 1
{
	static unsigned char i = 0;
	static unsigned char sec = 0;
	static unsigned char iIndex = 0;
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值

	P0 = 0xff;//显示消隐
	switch (i)
	{
		case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = image[0 + iIndex]; i++; break;//第一行
		case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = image[1 + iIndex]; i++; break;//第二行
		case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = image[2 + iIndex]; i++; break;//第三行
		case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = image[3 + iIndex]; i++; break;//第四行
		case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = image[4 + iIndex]; i++; break;//第五行
		case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = image[5 + iIndex]; i++; break;//第六行
		case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = image[6 + iIndex]; i++; break;//第七行
		case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = image[7 + iIndex]; i = 0; break;//第八行
		default: break;
	}

	sec++;
	if (sec >= 250)//250ms一次更新
	{
		sec = 0;
		iIndex++;
		if (iIndex >= 32)//最后一帧
			iIndex = 0;
	}

}

图像纵向下移

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code image[] = 
{
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3, 0xFF,
	0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7, 0xFF,
	0x99, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3, 0xFF,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};//通过取模软件获取

void main(void)
{
	ENLED = 0;
	ADDR3 = 0;//使能U4 74HC138

	EA = 1;//打开中断总开关
	
	TMOD = 1;//设置定时器0为模式1
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值	
	TR0 = 1;//启动定时器0

	ET0 = 1;//打开定时器0的中断
	
	while (1);
}

void interruptTimer0() interrupt 1
{
	static unsigned char i = 0;
	static unsigned char sec = 0;
	static char iIndex = 32;
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值

	P0 = 0xff;//显示消隐
	switch (i)
	{
		case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = image[0 + iIndex]; i++; break;//第一行
		case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = image[1 + iIndex]; i++; break;//第二行
		case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = image[2 + iIndex]; i++; break;//第三行
		case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = image[3 + iIndex]; i++; break;//第四行
		case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = image[4 + iIndex]; i++; break;//第五行
		case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = image[5 + iIndex]; i++; break;//第六行
		case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = image[6 + iIndex]; i++; break;//第七行
		case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = image[7 + iIndex]; i = 0; break;//第八行
		default: break;
	}

	sec++;
	if (sec >= 250)//250ms一次更新
	{
		sec = 0;
		iIndex--;
		if (iIndex < 0)//最后一帧
			iIndex = 0;
	}

}

图像横向左移

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code image[30][8] = 
{
	{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
	{ 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F },
	{ 0xFF, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F },
	{ 0xFF, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F },
	{ 0xFF, 0x0F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x0F },
	{ 0xFF, 0x87, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0x87 },
	{ 0xFF, 0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3 },
	{ 0xFF, 0xE1, 0x73, 0x73, 0x73, 0xF3, 0xF3, 0xE1 },
	{ 0xFF, 0x70, 0x39, 0x39, 0x39, 0x79, 0xF9, 0xF0 },
	{ 0xFF, 0x38, 0x1C, 0x1C, 0x1C, 0x3C, 0x7C, 0xF8 },
	{ 0xFF, 0x9C, 0x0E, 0x0E, 0x0E, 0x1E, 0x3E, 0x7C },
	{ 0xFF, 0xCE, 0x07, 0x07, 0x07, 0x0F, 0x1F, 0x3E },
	{ 0xFF, 0x67, 0x03, 0x03, 0x03, 0x07, 0x0F, 0x9F },
	{ 0xFF, 0x33, 0x01, 0x01, 0x01, 0x03, 0x87, 0xCF },
	{ 0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7 },
	{ 0xFF, 0xCC, 0x80, 0x80, 0x80, 0xC0, 0xE1, 0xF3 },
	{ 0xFF, 0xE6, 0xC0, 0xC0, 0xC0, 0xE0, 0xF0, 0xF9 },
	{ 0xFF, 0x73, 0x60, 0x60, 0x60, 0x70, 0x78, 0xFC },
	{ 0xFF, 0x39, 0x30, 0x30, 0x30, 0x38, 0x3C, 0x7E },
	{ 0xFF, 0x9C, 0x98, 0x98, 0x98, 0x9C, 0x1E, 0x3F },
	{ 0xFF, 0xCE, 0xCC, 0xCC, 0xCC, 0xCE, 0x0F, 0x1F },
	{ 0xFF, 0x67, 0x66, 0x66, 0x66, 0x67, 0x07, 0x0F },
	{ 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x03, 0x87 },
	{ 0xFF, 0x99, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3 },
	{ 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0xE1 },
	{ 0xFF, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE0, 0xF0 },
	{ 0xFF, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF0, 0xF8 },
	{ 0xFF, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF8, 0xFC },
	{ 0xFF, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE },
	{ 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF }
};//通过取模软件获取

void main(void)
{
	ENLED = 0;
	ADDR3 = 0;//使能U4 74HC138

	EA = 1;//打开中断总开关
	
	TMOD = 1;//设置定时器0为模式1
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值	
	TR0 = 1;//启动定时器0

	ET0 = 1;//打开定时器0的中断
	
	while (1);
}

void interruptTimer0() interrupt 1
{
	static unsigned char i = 0;
	static unsigned char sec = 0;
	static char iIndex = 0;
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值

	P0 = 0xff;//显示消隐
	switch (i)
	{
		case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = image[iIndex][0]; i++; break;//第一行
		case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = image[iIndex][1]; i++; break;//第二行
		case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = image[iIndex][2]; i++; break;//第三行
		case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = image[iIndex][3]; i++; break;//第四行
		case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = image[iIndex][4]; i++; break;//第五行
		case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = image[iIndex][5]; i++; break;//第六行
		case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = image[iIndex][6]; i++; break;//第七行
		case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = image[iIndex][7]; i = 0; break;//第八行
		default: break;
	}

	sec++;
	if (sec >= 250)//250ms一次更新
	{
		sec = 0;
		iIndex++;
		if (iIndex >= 29)//最后一帧
			iIndex = 0;
	}

}

图像横向右移

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code image[30][8] = 
{
	{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
	{ 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F },
	{ 0xFF, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F },
	{ 0xFF, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F },
	{ 0xFF, 0x0F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x0F },
	{ 0xFF, 0x87, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0x87 },
	{ 0xFF, 0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3 },
	{ 0xFF, 0xE1, 0x73, 0x73, 0x73, 0xF3, 0xF3, 0xE1 },
	{ 0xFF, 0x70, 0x39, 0x39, 0x39, 0x79, 0xF9, 0xF0 },
	{ 0xFF, 0x38, 0x1C, 0x1C, 0x1C, 0x3C, 0x7C, 0xF8 },
	{ 0xFF, 0x9C, 0x0E, 0x0E, 0x0E, 0x1E, 0x3E, 0x7C },
	{ 0xFF, 0xCE, 0x07, 0x07, 0x07, 0x0F, 0x1F, 0x3E },
	{ 0xFF, 0x67, 0x03, 0x03, 0x03, 0x07, 0x0F, 0x9F },
	{ 0xFF, 0x33, 0x01, 0x01, 0x01, 0x03, 0x87, 0xCF },
	{ 0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7 },
	{ 0xFF, 0xCC, 0x80, 0x80, 0x80, 0xC0, 0xE1, 0xF3 },
	{ 0xFF, 0xE6, 0xC0, 0xC0, 0xC0, 0xE0, 0xF0, 0xF9 },
	{ 0xFF, 0x73, 0x60, 0x60, 0x60, 0x70, 0x78, 0xFC },
	{ 0xFF, 0x39, 0x30, 0x30, 0x30, 0x38, 0x3C, 0x7E },
	{ 0xFF, 0x9C, 0x98, 0x98, 0x98, 0x9C, 0x1E, 0x3F },
	{ 0xFF, 0xCE, 0xCC, 0xCC, 0xCC, 0xCE, 0x0F, 0x1F },
	{ 0xFF, 0x67, 0x66, 0x66, 0x66, 0x67, 0x07, 0x0F },
	{ 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x03, 0x87 },
	{ 0xFF, 0x99, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3 },
	{ 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0xE1 },
	{ 0xFF, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE0, 0xF0 },
	{ 0xFF, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF0, 0xF8 },
	{ 0xFF, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF8, 0xFC },
	{ 0xFF, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE },
	{ 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF }
};//通过取模软件获取

void main(void)
{
	ENLED = 0;
	ADDR3 = 0;//使能U4 74HC138

	EA = 1;//打开中断总开关
	
	TMOD = 1;//设置定时器0为模式1
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值	
	TR0 = 1;//启动定时器0

	ET0 = 1;//打开定时器0的中断
	
	while (1);
}

void interruptTimer0() interrupt 1
{
	static unsigned char i = 0;
	static unsigned char sec = 0;
	static char iIndex = 29;
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值

	P0 = 0xff;//显示消隐
	switch (i)
	{
		case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = image[iIndex][0]; i++; break;//第一行
		case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = image[iIndex][1]; i++; break;//第二行
		case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = image[iIndex][2]; i++; break;//第三行
		case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = image[iIndex][3]; i++; break;//第四行
		case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = image[iIndex][4]; i++; break;//第五行
		case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = image[iIndex][5]; i++; break;//第六行
		case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = image[iIndex][6]; i++; break;//第七行
		case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = image[iIndex][7]; i = 0; break;//第八行
		default: break;
	}

	sec++;
	if (sec >= 250)//250ms一次更新
	{
		sec = 0;
		iIndex--;
		if (iIndex < 0)//最后一帧
			iIndex = 29;
	}

}

9 ~ 0倒计时

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;


unsigned char code num[10][8] =
{
	{ 0xE3, 0xDD, 0xDD, 0xDD, 0xC3, 0xDF, 0xDD, 0xE3 },
	{ 0xFF, 0xC3, 0xBD, 0xBD, 0xC3, 0xBD, 0xBD, 0xC3 },
	{ 0xFF, 0xC1, 0xDF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF },
	{ 0xC7, 0xBB, 0xFB, 0xC3, 0xBB, 0xBB, 0xBB, 0xC7 },
	{ 0x81, 0xFD, 0xFD, 0xC3, 0xBF, 0xBF, 0xBD, 0xC3 },
	{ 0xDF, 0xCF, 0xD7, 0xDB, 0x03, 0xDF, 0xDF, 0x07 },
	{ 0xFF, 0xE3, 0xDD, 0xDF, 0xE3, 0xDF, 0xDD, 0xE3 },
	{ 0xC3, 0xBD, 0xBF, 0xBF, 0xCF, 0xF3, 0xFD, 0x81 },
	{ 0xEF, 0xE3, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83 },
	{ 0xC3, 0xBD, 0x7E, 0x7E, 0x7E, 0x7E, 0xBD, 0xC3 }
};//通过取模软件获取

void main(void)
{
	ENLED = 0;
	ADDR3 = 0;//使能U4 74HC138

	EA = 1;//打开中断总开关
	
	TMOD = 1;//设置定时器0为模式1
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值	
	TR0 = 1;//启动定时器0

	ET0 = 1;//打开定时器0的中断
	
	while (1);
}

void interruptTimer0() interrupt 1
{
	static unsigned char i = 0;
	static unsigned int sec = 0;
	static char iIndex = 0;
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值

	P0 = 0xff;//显示消隐
	switch (i)
	{
		case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = num[iIndex][0]; i++; break;//第一行
		case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = num[iIndex][1]; i++; break;//第二行
		case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = num[iIndex][2]; i++; break;//第三行
		case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = num[iIndex][3]; i++; break;//第四行
		case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = num[iIndex][4]; i++; break;//第五行
		case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = num[iIndex][5]; i++; break;//第六行
		case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = num[iIndex][6]; i++; break;//第七行
		case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = num[iIndex][7]; i = 0; break;//第八行
		default: break;
	}

	sec++;
	if (sec >= 1000)//1s一次更新
	{					  
		sec = 0;
		iIndex++;
		if (iIndex > 9)//最后一帧
			iIndex = 0;
	}

}

0 ~ 9正计时

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;


unsigned char code num[10][8] =
{
	{ 0xE3, 0xDD, 0xDD, 0xDD, 0xC3, 0xDF, 0xDD, 0xE3 },
	{ 0xFF, 0xC3, 0xBD, 0xBD, 0xC3, 0xBD, 0xBD, 0xC3 },
	{ 0xFF, 0xC1, 0xDF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF },
	{ 0xC7, 0xBB, 0xFB, 0xC3, 0xBB, 0xBB, 0xBB, 0xC7 },
	{ 0x81, 0xFD, 0xFD, 0xC3, 0xBF, 0xBF, 0xBD, 0xC3 },
	{ 0xDF, 0xCF, 0xD7, 0xDB, 0x03, 0xDF, 0xDF, 0x07 },
	{ 0xFF, 0xE3, 0xDD, 0xDF, 0xE3, 0xDF, 0xDD, 0xE3 },
	{ 0xC3, 0xBD, 0xBF, 0xBF, 0xCF, 0xF3, 0xFD, 0x81 },
	{ 0xEF, 0xE3, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83 },
	{ 0xC3, 0xBD, 0x7E, 0x7E, 0x7E, 0x7E, 0xBD, 0xC3 }
};//通过取模软件获取

void main(void)
{
	ENLED = 0;
	ADDR3 = 0;//使能U4 74HC138

	EA = 1;//打开中断总开关
	
	TMOD = 1;//设置定时器0为模式1
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值	
	TR0 = 1;//启动定时器0

	ET0 = 1;//打开定时器0的中断
	
	while (1);
}

void interruptTimer0() interrupt 1
{
	static unsigned char i = 0;
	static unsigned int sec = 0;
	static char iIndex = 9;
	TH0 = 0xFC;
	TL0 = 0x67;//设置定时器0的初值

	P0 = 0xff;//显示消隐
	switch (i)
	{
		case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = num[iIndex][0]; i++; break;//第一行
		case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = num[iIndex][1]; i++; break;//第二行
		case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = num[iIndex][2]; i++; break;//第三行
		case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = num[iIndex][3]; i++; break;//第四行
		case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = num[iIndex][4]; i++; break;//第五行
		case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = num[iIndex][5]; i++; break;//第六行
		case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = num[iIndex][6]; i++; break;//第七行
		case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = num[iIndex][7]; i = 0; break;//第八行
		default: break;
	}

	sec++;
	if (sec >= 1000)//1s一次更新
	{					  
		sec = 0;
		iIndex--;
		if (iIndex < 0)//最后一帧
			iIndex = 9;
	}

}
posted @ 2025-07-26 14:41  EricsT  阅读(184)  评论(0)    收藏  举报