⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8_8led.c

📁 51单片机驱动的LED点阵万年历显示
💻 C
字号:
#include<reg52.h>
#include<rtx51tny.h>
#include"inc/define.h"
#include"inc/8_8led.h"
#include"inc/utility.h"
#include"inc/font.h"


#define dataP P0
#define scanP P2

sbit sel=P2^6;		//选择数据通道 0:选通上  1:选通下
sbit clr=P2^7;		//清零数据 0有效


vu8 idata for_showh[6]={0,8, 1,1, 3,0};	//年 月 日
vu8 idata for_showl[6]={2,2, 4,9, 5,6};	//时 分 秒
					  //---16*16的空格	周  	四	   8*16的空格	 2  	7  	摄氏度符号
vu8 idata week_tempert[8]={8, 			0 , 	4,     11,		 	 2, 	7, 	10};

vu8 code * idata  time_tab=time_tab_cgst[0];
vu8 code * idata  week_tab=week_tab_cgst[0];
vu8 code * idata  tempert=tempert_cgst[0];


u8 idata scroll_bp=0,scroll_bpt=0;
bit show_menu=0;
u8 * pmenu=menu[0];


struct Pad ph[6],pl[6];




/*****************************************************************
*程序运行的起始点,之后各个被创建的任务以5ms的时间片轮流运行
*函数名称:init()
*说明:这是一个RTX51任务,也是第一个被运行的任务
******************************************************************/
void init()	_task_ 0
{
	EA=0;
	EX0=1;		//使能外部中断0,用以侦测按键
	IT0=1;		//外部中断0设置为下降沿触发
	os_create_task(1);
	os_create_task(2);
	os_create_task(3);
	
	os_create_task(6);
	os_create_task(7);
	os_create_task(8);
	os_delete_task(0);
}



/*********************************************************************
*在LED点阵屏上显示时间、日期、和温度  或者  菜单命令
*函数名称:show()
*说明:这是一个RTX51任务,os_create_task(1)后开始运行
***********************************************************************/
void show(void )	_task_ 1
{
	setShowStyle();
 	while(1)
	{
	 	if(show_menu)
			showMenu();
		else
			showTime();
	}
}


void showTime(void )	
{
	u8 word,sect;		//word:可显示数字、汉字的个数  sect:每个字符的部分,
						//具体讲即每个字符的列

	for(word=0;word<7;word++)	//7:六个8*8数字	一个16*16汉字	
	{
		if(word<6)
		{
			for(sect=0;sect<8;sect++)
			{
			scanP=word*8+sect;	
			putData(word,sect);
			delay20US(10);										
			clr=0;		//消隐	
			}
		}
		else
		{
			 for(sect=0;sect<16;sect++)
			{
				scanP=word*8+sect;
				putData(word,sect);
				delay20US(10);
				clr=0;	//消隐
			}
		}
	}
	//以下内容用以文字移动,即动态显示内容基址的确定
	scroll_bpt++;
	if(scroll_bpt>8)
	{
		scroll_bpt=0;
		scroll_bp+=2;
	}
	if(scroll_bp>(16*3+8*4))		// 三个16*16汉字,四个8*16数字、字符
	{
		scroll_bp=0;
	}
}


extern u8 chge_time;
extern u8 idata chgeh[6];
extern u8 idata chgel[6];
void showMenu(void )	
{
	u8 word,sect;

	if(chge_time)
	{
		for(word=0;word<6;word++)
		{
		 	for(sect=0;sect<8;sect++)
			{
				scanP=word*8 + sect;
				clr=1;

				if(sect<pl[word].pn)
					dataP=pl[word].pad[sect];
				else if(!(sect<(pl[word].pn + 5)))
					dataP=pl[word].pad[sect-5];
				else 
					dataP=m_time[chgel[word]][sect-pl[word].pn];
				sel=1;
		
				if(sect<ph[word].pn)
					dataP=ph[word].pad[sect];	
				else if(!(sect<(ph[word].pn + 5)))
					dataP=ph[word].pad[sect-5];			
				else
					dataP=m_time[chgeh[word]][sect-ph[word].pn];
				sel=0;	

				delay20US(10);
				clr=0;
			}
		}
	}
	else
	{
		for(word=0;word<4;word++)
		{
			for(sect=0;sect<16;sect++)
			{
				scanP=word*16+sect;
				clr=1;
				dataP=pmenu[word*32+sect+16];
				sel=1;
				dataP=pmenu[word*32+sect];
				sel=0;
	
				delay20US(10);
				clr=0;
			}
		}
	}
}


/*******************************************************************
*设置时间、日期的显示格式
*函数名称:setShowStyle()
*说明:
********************************************************************/
void setShowStyle()
{	
	//设置显示 年月日 的格式:08:11:24
	ph[0].pn=2;			   
	ph[0].pad[0]=ph[0].pad[1]=ph[0].pad[2]=0x00;
	ph[1].pn=1;
	ph[1].pad[0]=ph[1].pad[1]=0x00;
	ph[1].pad[2]=0x66;

	ph[2].pn=2;
	ph[2].pad[0]=0x66;
	ph[2].pad[1]=ph[2].pad[2]=0x00;
	ph[3].pn=1;
	ph[3].pad[0]=ph[3].pad[1]=0x00;
	ph[3].pad[2]=0x66;

	ph[4].pn=2;
	ph[4].pad[0]=0x66;
	ph[4].pad[1]=ph[4].pad[2]=0x00;
	ph[5].pn=1;
	ph[5].pad[0]=ph[5].pad[1]=ph[5].pad[2]=0x00;

	//设置显示 时分秒 的格式:22:23:56
    pl[0].pn=2;			   
	pl[0].pad[0]=pl[0].pad[1]=pl[0].pad[2]=0x00;
	pl[1].pn=1;
	pl[1].pad[0]=pl[1].pad[1]=0x00;
	pl[1].pad[2]=0x66;

	pl[2].pn=2;
	pl[2].pad[0]=0x66;
	pl[2].pad[1]=pl[2].pad[2]=0x00;
	pl[3].pn=1;
	pl[3].pad[0]=pl[3].pad[1]=0x00;
	pl[3].pad[2]=0x66;

	pl[4].pn=2;
	pl[4].pad[0]=0x66;
	pl[4].pad[1]=pl[4].pad[2]=0x00;
	pl[5].pn=1;
	pl[5].pad[0]=pl[5].pad[1]=pl[5].pad[2]=0x00;
}


/*****************************************************************
*将待显示数据送到P0口,并锁入适当的锁存器在上排或下排8*8LED显示他们
*函数名称:putData()
*说明;每排前六个LED点阵与后两个LED点阵放置数据方式不同
******************************************************************/
void putData(u8 word,u8 sect)
{	
	u8 row,col;
	clr=1;

	if(word<6)			//先放上行在仿真中只显示下行,不知道为社么
	{		
		if(sect<pl[word].pn)
			dataP=pl[word].pad[sect];
		else if(!(sect<(pl[word].pn + 5)))
			dataP=pl[word].pad[sect-5];
		else 
			dataP=*(time_tab + 6*for_showl[word] + sect - pl[word].pn);
		sel=1;

		if(sect<ph[word].pn)
			dataP=ph[word].pad[sect];	
		else if(!(sect<(ph[word].pn + 5)))
			dataP=ph[word].pad[sect-5];			
		else
			dataP=*(time_tab + 6*for_showh[word] + sect-ph[word].pn);
		sel=0;		
	}
	else
	{
	 	if((scroll_bp+sect)<16*3)
		{	
			row=(scroll_bp+sect)/16;
			col=(scroll_bp+sect)%16;
			dataP=*(week_tab + 32*week_tempert[row] + col+16);
			sel=1;	
			dataP=*(week_tab + 32*week_tempert[row] + col);
			sel=0;
		}
		else if((scroll_bp+sect)<(16*3+8*4))
		{
			row=(scroll_bp+sect)/8-3;
			col=(scroll_bp+sect)%8;
			dataP=*(tempert + 16*week_tempert[row] + col+8);
			sel=1;
		    dataP=*(tempert + 16*week_tempert[row] + col);
			sel=0;
		}
	}
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -