📄 led.c
字号:
#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 + -