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

📄 led.c

📁 LED点阵显示屏扫描程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg52.h>
#include<comm.h>
#include <intrins.H>
#include <ABSACC.H>
#define SELROM_0 0x10 	//{P1^0=0;P1^1=0;P1^2=0;P1^5=0;P1^6=0;P1^7=0;}	//汉字库0区定义
#define SELROM_1 0x30 	//{P1^0=0;P1^1=0;P1^2=0;P1^5=1;P1^6=0;P1^7=0;}	//汉字库1区定义
#define SELROM_2 0x50 	//{P1^0=0;P1^1=0;P1^2=0;P1^5=0;P1^6=1;P1^7=0;}	//汉字库2区定义
#define SELROM_3 0x70 	//{P1^0=0;P1^1=0;P1^2=0;P1^5=1;P1^6=1;P1^7=0;}	//汉字库3区定义

#define SELRAM1_0 0xe1 	//{P1^0=1;P1^1=0;P1^2=0;P1^4=0} //外部RAM第一页
#define SELRAM1_1 0xf1 	//{P1^0=1;P1^1=0;P1^2=0;P1^4=1} //外部RAM第二页

#define RAM2 0xff  		//{P10=1;P11=1;P12=1;P13=1}
#define RAM3 0xf7

#define RAM23_Addr1 0x2038 //第1行待显示数据存储位置

unsigned char code *Temp_buf={
 "###<010023590771                你好                                           "};
 
void delay(Uchar t)
{	Uchar data i,j;
	for(i=0;i<t;i++)
		for(j=0;j<0xff;j++)			; 
}

//***********************************************
//串口初始化子程序
//波特率9600 晶振33MHZ
//***********************************************	   	   
/*void Com_Ini(void)
{	TMOD=0x20;
	TH1=0xF7; 			//256-(33000000/(9600*32*12))
	TL1=0xF7;
	TCON=0x40;			//启动定时器1
	SCON=0x50;			//允许接收
	IE=0x90;			//串口中断允许
}	*/
	
//**********************************************************
//功能:判断发送的数据是否接收完,回车(0x0D)、换行(0x0A),为结束字符
//全局变量:R_Buf 数据接收缓冲区的地址
//输出:0xaa:一次发送的数据接收完
//		0x55:一次发送的数据未接收完
//***********************************************************
/*Uchar Is_End()
{
	Uchar xdata *Temp;
	Uchar data Data1,Data2;
	Temp=Temp_P;		//Temp指向数据接收区
	P1=SELRAM1_0;	//外部RAM1的第一页 片选
	Data1=*--Temp;
	Data2=*--Temp;
	if(Data1==0x0A&&Data2==0x0D)
		return(0xaa);	//一次数据接收完毕
	else 
		return(0x55);	//未接收完
}	*/	
//**************************************************************
//功能:判断接收到的数据是否有效,如果接收到的起始字符为"###"则接收到的数据有效
//全局常量:Data_Sec,数据接收缓冲区起始地址
//输出:	0xAA:接收到的数据有效
//			0x55:接收到的数据无效
//**************************************************************
/*unsigned char Is_Valid(){
	Uchar data Temp0,Temp1,Temp2;				
	Uchar xdata *Temp;		//临时数据存储指针,用于取出三个起始字符
	
	Temp=Data_Sec;
	P1=SELRAM1_0;	//外部RAM1的第一页 片选
	
	Temp0=*Temp++;			//取出三个固定字符###
	Temp1=*Temp++;
	Temp2=*Temp;

	if(Temp0==0x23&&Temp1==0x23&&Temp2==0x23)	
		return(0xaa);	//如果起始字符为三个###则数据有效
	else 
		return(0x55);	//数据无效返回0x55
}  */
//****************************************************
//功能:数据存储位置计算,根据段号(00~10 21~30)来确定数据的存储位置;
//输入:Data_Sec 取出段号,判断存储位置
//输出:Data_Save 存储地址
//****************************************************
Uint Addres_Catch()
{	//Uchar xdata *Temp_P;			//临时指针,用于取出段号
	Uint data Data_Adr;			//数据存储地址,
	Uchar data Temp_SecH,Temp_SecL;	//段号存储变量,两个字节
	Uint xdata *Temp_Addr; //用于取出一段空间中已占用的空间数量,确定添加方式时的存储地址

	//Temp_P=Data_Sec;			//取出段号
	P1=SELRAM1_0;	//外部RAM1的第一页 片选
	Temp_P=Data_Sec;
	Temp_SecH=Temp_P[12];		//取出段号的高位
	Temp_SecL=Temp_P[13]; 		//取出段号的低位
	//===============自动找段号======================================
	if(Temp_SecH==0x30&&Temp_SecL==0x30)//00自动找段号
	{
		if(B0==0)	 //如果第一段没有放数据,则放在第一段
		{
			R_Tag|=0x0001;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec1;
			return(Data_Adr);	  //2008/01/30 用一个return,以精减代码
		}	 

		if(B1==0)
		{
			R_Tag|=0x0002;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec2;
			return(Data_Adr);
		}
		if(B2==0)
		{
			R_Tag|=0x0004;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec3;
			return(Data_Adr);
		}
		if(B3==0)
		{
			R_Tag|=0x0008;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec4;
			return(Data_Adr);
		}
		if(B4==0)
		{
			R_Tag|=0x0010;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec5;
			return(Data_Adr);
		}
				
		if(B5==0)
		{
			R_Tag|=0x0020;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec6;
			return(Data_Adr);
		}

		if(B6==0)
		{
			R_Tag|=0x0040;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec7;
			return(Data_Adr);
		}

		if(B7==0)
		{
			R_Tag|=0x0080;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec8;
			return(Data_Adr);
		}
        
		if(B8==0)
		{
			R_Tag|=0x0100;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec9;
			return(Data_Adr);
		}

		if(B9==0)
		{
			R_Tag|=0x0200;
			P1=SELRAM1_0;
			Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
			Data_Adr=Data_Sec10;
			return(Data_Adr);
		}	
    }	 //自动找段号

	//====================覆盖方式=====================================				
	else if(Temp_SecH==0x30&&Temp_SecL!=0x30)
	{
		switch(Temp_SecL)
		{
			case '1':Data_Adr=Data_Sec1;R_Tag|=0x0001;break; //01 第一段,覆盖方式
			case '2':Data_Adr=Data_Sec2;R_Tag|=0x0002;break;
			case '3':Data_Adr=Data_Sec3;R_Tag|=0x0004;break;
			case '4':Data_Adr=Data_Sec4;R_Tag|=0x0008;break;
			case '5':Data_Adr=Data_Sec5;R_Tag|=0x0010;break;
			case '6':Data_Adr=Data_Sec6;R_Tag|=0x0020;break;
			case '7':Data_Adr=Data_Sec7;R_Tag|=0x0040;break;
			case '8':Data_Adr=Data_Sec8;R_Tag|=0x0080;break;
			case '9':Data_Adr=Data_Sec9;R_Tag|=0x0100;break;	//09 第九段,覆盖方式
			default:break;
		}
		P1=SELRAM1_0;
		Tag=R_Tag; //存入外部RAM,以便掉电保存数据
	}
	else if(Temp_SecH==0x31&&Temp_SecL==0x30)			//10 第十段,覆盖方式
	{	Data_Adr=Data_Sec10;
		R_Tag|=0x0200;
		P1=SELRAM1_0;
		Tag=R_Tag;		//存入外部RAM,以便掉电保存数据
	}  //覆盖方式

	//===================添加方式==========================================
	else if(Temp_SecH==0x32&&Temp_SecL!=0x30)//21~29 	//添加方式1~9段	
	{	switch(Temp_SecL)
		{
			case '1':Temp_Addr=Data_Sec1;Data_Adr=*Temp_Addr;break;
			case '2':Temp_Addr=Data_Sec2;Data_Adr=*Temp_Addr;break;
			case '3':Temp_Addr=Data_Sec3;Data_Adr=*Temp_Addr;break;
			case '4':Temp_Addr=Data_Sec4;Data_Adr=*Temp_Addr;break;
			case '5':Temp_Addr=Data_Sec5;Data_Adr=*Temp_Addr;break;
			case '6':Temp_Addr=Data_Sec6;Data_Adr=*Temp_Addr;break;
			case '7':Temp_Addr=Data_Sec7;Data_Adr=*Temp_Addr;break;
			case '8':Temp_Addr=Data_Sec8;Data_Adr=*Temp_Addr;break;
			case '9':Temp_Addr=Data_Sec9;Data_Adr=*Temp_Addr;break;
			default:break;
		}	 
	}								
	else if(Temp_SecH==0x32&&Temp_SecL==0x30) //30添加第10段
	{ 
 			Temp_Addr=Data_Sec10;
			Data_Adr=*Temp_Addr;
	}	 //添加方式

	//======================================================================
	else 
	{
		; //Clear_Buf();	//如果指定段命令错误则接收到的数据无效,清除
	}
		
		return(Data_Adr);	//返回地址;		   
}	
//****************************************************
//数据存储子程序,字符点阵的起始地址3个字节
//输入:调用子程序Addres_Catch()获取地址
//输出:无
//存储格式:字节数2字节+字符空间数2字节+13位控制码+点阵地址
//****************************************************
void Data_Save()
{
	Uchar data QM,WM,Temp1,Temp2,i,c=0x00;
	Uint data x,y;
	Uchar xdata *Data_SaveP;	//数据存储指针变量	
	Uint data NmCnt=0;

	//Data_SaveP=Data_Sec1;
	Data_SaveP=Addres_Catch();	//取出地址
	//Save_Addr=Data_SaveP;
	P1=SELRAM1_0;			//外部RAM1的第一页 片选
	QM=*(Temp_P+12);
	if(QM=='2'||QM=='3')	//在添加方式下,数据显示方式跟随前面数据的显示方式
	{	
		Temp_P+=16;		//在添加方式下,跳过控制码,以便直接取内码数据
	}
	else //在覆盖方式下,需要存下控制码,以确定数据的显示方式
	{
		Temp_P+=3;				//控制码地址	   					
		Data_SaveP++;
		Data_SaveP++;
		Data_SaveP++;
		Data_SaveP++;
		for(i=0;i<13;i++)
		{	P1=SELRAM1_0;
			Temp1=*Temp_P++;
			*Data_SaveP++=Temp1;	//取出13位控制码
		}
	}

	//-----------------数据存储----------------------------------------- 	
	while(1){
		P1=SELRAM1_0;
		QM=Temp_P[NmCnt];
		WM=Temp_P[NmCnt+1];
		//--------------汉字--------------------------------------------
		if(QM>0x80&&WM>0x80)
		{	x=(QM-0xa1)*94+(WM-0xa1);
			//----------点阵存于汉字库第0页--------------------------------------------
			if(x<2048)
			{	y=x*32;
				for(i=0;i<32;i+=2) //取出32个字节的点阵数据
				{	
					P1=SELROM_0;
					Temp1=XBYTE[i+y];
					Temp2=XBYTE[i+y+1];

					P1=SELRAM1_0;
					Data_SaveP[4*i+2*c]=Temp1;	//在一个单元板上调试,每行只能显示4个字
					Data_SaveP[4*i+2*c+1]=Temp2;
				} 
			}
			//-----------点阵存于汉字库第1页---------------------------------------------
			if((x>=2048)&&(x<4096))
			{	y=x-2048;
				y*=32;
				for(i=0;i<32;i+=2)
				{	P1=SELROM_1;
					Temp1=XBYTE[i+y];
					Temp2=XBYTE[i+y+1];
					P1=SELRAM1_0;
					Data_SaveP[4*i+2*c]=Temp1;
					Data_SaveP[4*i+2*c+1]=Temp2;				
				}		
		 	}
			//----------点阵存于汉字库第2页-----------------------	
			if((x>=4096)&&(x<6144))
			{	y=x-4096;

⌨️ 快捷键说明

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