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

📄 xspmain.c.bak

📁 用8052写的一个LED大屏幕显示程序
💻 BAK
字号:
/***************************************************************************/
/* 名称:	车用LED显示屏主程序				   */
/* 时间:	2004.8.6						   */
/* 版本:	V2.0							   */ 	
/* 晶振频率 18.432MHz						   */	
/***************************************************************************/
//#pragma 	 small
//#pragma SRC(A.A51) small
#include	<reg52.h>
#include	<string.h>
#include	<intrins.h>
#include	"xsp.h"
#include	"UART.h"
#include	"asc8-16.h"

//#include	<ABSACC.H>	//绝对地址访问
/***************************************************************************/
/***************************************************************************/
/********************** 杭州尖峰********************************
显示屏扫描工作过程:
初始输出行扫描消隐信号(低电平)
1.输出行移位数据(pLD变低)
2.读取列数据写入165(并行转串行)
3.输出列数据串行移位时钟,有多少列输出多少个时钟
4.行扫描控制信号变低,即不允许行数据输出到口线(消隐)
5.输出行扫描移位信号,同时也控制列数据输出到口线
6.行扫描控制信号变高,允许行数据输出到口线,把这行数据显示出来。
7.行移位数据为高。(pLD变高)
8.重复2-7步,直到16行扫描完成,即完成一屏数据的显示
9.重复1-8步,完成。

/***************************************************************************/
//---------------------------------------------------------------------------
//\xC8\xFD\xCF\xEE\xB9\xFA\xB9\xFA 三项国
//code unsigned char 	StrHello2[]="欢迎光临欢迎乘坐你是我的最好的朋友";
code unsigned char 	StrHello2[]="欢迎乘坐电车公司284路公共汽车 电车公司热线:81814182 \
热烈祝贺广州市电车公司被评为“2003年度中国广州最具诚信度企业” 热烈祝贺广州市电车公司获得\
ISO9001质量管理体系、ISO14001环境管理体系、OHSAS18001职业健康安全体系三项国\
际标准认证 我公司管理方针是“优质服务、优先安全、优美环境、优化管理、建设绿色交通” ";

//code unsigned char 	StrHello[]=" ";
//code unsigned char 	StrKongGe[]=" ";

//code unsigned char 	StrHello[]="本系统由天目领航公司研制。12AZazok,.;'[]\`;']okwo我men们";
code unsigned char 	StrHello[]="本系统由天目领航公司研制。";
code unsigned char 	StrKongGe[]="     ";

code unsigned char 	RecvOk[]="[OK]";		//串行口接收数据完成应答
code unsigned char 	DispEnd[]="[END]";	//显示屏显示完成应答

//code unsigned char aa[]="\x55\x0aaRD";	

code unsigned char	Asc_Table[][2]	=
{
" ",					  //ASCII		
" "," "," "," "," "," "," "," ",  //1-8
" "," "," "," "," "," "," "," ",  //9-16
" "," "," "," "," "," "," "," ",  //17-24
" "," "," "," "," "," "," "," ",  //25-32
"!","“","#","¥","%","—","'","(",   //33-40
")","*","+",",","-","。","/","0",  //41-48
"1","2","3","4","5","6","7","8",  //49-56
"9",":",";","《","=","》","?","·",  //57-64
"A","B","C","D","E","F","G","H",  //65-72
"I","J","K","L","M","N","O","P",  //73-80
"Q","R","S","T","U","V","W","X",  //81-88
"Y","Z","[","\","]","︿","_","`",  //89-96
"a","b","c","d","e","f","g","h",  //97-104
"i","j","k","l","m","n","o","p",  //105-112
"q","r","s","t","u","v","w","x",  //113-120
"y","z","{","|","}","~"," "," "   //121-128
};

xdata unsigned char 	StrHello1[USART_RECV_FIFO_SIZE];
xdata unsigned char	StrHelloBuf[USART_RECV_FIFO_SIZE+60];			

//xdata unsigned char pp[1000] _at_ 0x00;
//extern xdata unsigned char	DispBuf[HANGSHU][LIEBYTE];// _at_ 0x00;	//16*80点阵显示屏 显示缓冲区
//extern xdata unsigned char	DispYingXiangBuf[HANGSHU][LIEBYTE]; 	//_at_ 1000;	//16*80点阵显示屏 映像显示缓冲区
xdata unsigned char	DispBuf[HANGSHU][LIEBYTE] _at_ 0x00;	//16*80点阵显示屏 显示缓冲区
xdata unsigned char	DispYingXiangBuf[HANGSHU][LIEBYTE]; 	//_at_ 1000;	//16*80点阵显示屏 映像显示缓冲区

//data unsigned char 			*p;
data unsigned char 			DptrBakHi=0;
data unsigned char 			DptrBakLo=0;


xdata unsigned char	DispShuBuf[(USART_RECV_FIFO_SIZE+60)/(LIEBYTE/2)+1][HANGSHU][LIEBYTE];	// _at_ 320;	//显示数据存放区
data  unsigned char	Timer1Count;
data  unsigned int	UartTimerCount;
data  unsigned char	ShowTimeCount=0;
//extern data  unsigned char	LeftShiftDelayCount;
data  unsigned int	LeftShiftDelayCount;
data unsigned char	PingShu;

data unsigned char	DisplayHangShu=0;

xdata unsigned char	UsartRecvFifo[USART_RECV_FIFO_SIZE];			//串口接收缓冲区	
xdata unsigned char	UsartRecvBzFifo[USART_RECV_FIFO_SIZE];


//extern data unsigned char	UartEnd;
data unsigned int	UsartRecv_rp = 0;
bit	    UartStart=0;
bit 	UartEnd=0;
bit 	HelloOk=0;
bit     ResetBit=0;
bit 	BaoZhaBit=0;
bit 	LoopBaoZhaBit=0;
bit		GuanMenBit=0;
bit 	LoopXianShiBit=0;


data unsigned char	UartStep=0;
data unsigned char	UartCommand[5]="";

//bit 	UartEnd=0;
bit 	Uartok=0;
bit 	Uartok1=0;
bit 	Uartok2=0;
bit 	Uartok3=0;
data unsigned char	P3Bak;

/***************************************************************************/
//函数定义
void 				InitAsp();
//extern void 				WDT_RESET();
void 				WDT_RESET();
void 				TingZhi();
//void 				Dshu();
//void 				Fontshu();
void 				MapDrawString(unsigned char *);
void 				DataCopy(unsigned char );
//void 	            MemDataCopy(unsigned char *,unsigned char *);
//extern void				MapDrawLeftShift();
void				MapDrawLeftShift();
void                MapDrawZhiJie(unsigned char);

void 				uart_init();
void 				ClrPing(unsigned char *);

void                InitX5045();
void 				IicWaitSclHigh();
void 				IicSendByte(unsigned char);
unsigned char 			IicReadByte();
bit  				IicReadData(unsigned char *str);
void				IicWriteData(unsigned char *str);
unsigned char 			IicStatusData();

void 				UartSend(unsigned char * );

extern  void DispScan();

void main()
{
unsigned char MainState;
unsigned char Step=1;
//data unsigned char	temp;
//WrReset:
	InitAsp();
	UART_init();
	//IicWriteData(StrHello2);
/*
	if (IicReadData(StrHello1)){
		strcpy(StrHelloBuf,StrHello);
		strcat(StrHelloBuf,StrHello1);
		strcat(StrHelloBuf,StrKongGe);
//		MapDrawString(StrHelloBuf);
	}	
	else{
		strcpy(StrHelloBuf,StrHello);
		strcat(StrHelloBuf,StrKongGe);
    }*/
		MapDrawString(StrHello);
    	     MapDrawZhiJie(0);
//        	while (1) WDT_RESET();
//       	ShowTimeCount=50;
 	
	while (1){
	     	if (GPRSRecvResponse()){
	     		UARTSend(RecvOk,4);
			MainState = GPRSSaveBuff[2];
		    	switch (MainState) {
    			case	5:
				MapDrawString(GPRSSaveBuff+0x05);
//    				MapDrawString(GPRSSaveBuff+0x04,ShowBuff);	
				memcpy(&DispShuBuf[1][0][0],DispShuBuf,HANGSHU*LIEBYTE);
				if (!Uartok1) Uartok1=1;			
		     		UARTSend(DispEnd,5);
    				break;
    			case	10:
				MapDrawString(GPRSSaveBuff+0x05);
				memcpy(&DispShuBuf[2][0][0],DispShuBuf,HANGSHU*LIEBYTE);
//    				MapDrawString(GPRSSaveBuff+0x04,ShowBuff);	
//				memcpy(&DispShuBuf[1][0][0],ShowBuff,HANGSHU*LIEBYTE);
				if (!Uartok2) Uartok2=1;			
		     		UARTSend(DispEnd,5);
    				break;
    			case	15:
				MapDrawString(GPRSSaveBuff+0x05);
				memcpy(&DispShuBuf[3][0][0],DispShuBuf,HANGSHU*LIEBYTE);
//    				MapDrawString(GPRSSaveBuff+0x04,ShowBuff);	
//			 	memcpy(&DispShuBuf[2][0][0],ShowBuff,HANGSHU*LIEBYTE);
				if (!Uartok3) Uartok3=1;			
		     		UARTSend(DispEnd,5);
    				break;
			}
    		}
		if (Uartok1||Uartok2||Uartok3){
			if (!ShowTimeCount){
				if (Uartok1 && Step==1)	MapDrawZhiJie(1);
				if (Uartok2 && Step==2)	MapDrawZhiJie(2);
				if (Uartok3 && Step==3)	MapDrawZhiJie(3);
			       	if (++Step>=4) Step=1;
			       	if ((Uartok1&&Uartok2)||(Uartok2&&Uartok3)||(Uartok1&&Uartok3)) ShowTimeCount=GPRSSaveBuff[4];
			}
			
		}
		WDT_RESET();
	}	// Main loop
}
/*----------------------------------------------*/
/*----------------------------------------------*/
/*----------定时扫描----------------------------*/
void Timer0Int() interrupt 1 using 1{
   static  bit   pCEtemp; 
//   static data unsigned char	DisplayHangShu=0;
#ifdef ChangJia_ShangHaiKaiLun
   static data unsigned char	DisplayHangSao=0xc3;
#endif

   data unsigned char		i;
   data unsigned char		ii;
 
 
   	pCEtemp=pCE;					//片选保護
   	pCE=0;
   	TH0=-MSCOUNT>>8;		// 1ms
	TL0=-MSCOUNT; 
	if (Timer1Count++>=100){
		Timer1Count=0;
		if (ShowTimeCount) ShowTimeCount--;
	}

	if (LeftShiftDelayCount) LeftShiftDelayCount--;
/*
//	if (Timer1Count++>=10){
//		Timer1Count=0;
		LeftShiftDelayCount--;
//	}
	if(UartStart){
    	UartTimerCount--;
    		if(UartTimerCount==0) {
        	    	UartStep=0;
            		UartStart=0;
        	}
    	}*/
    	DPH=DptrBakHi;
    	DPL=DptrBakLo;
    	
		pRCLK=0;
//	if (DisplayHangShu<HANGSHU){	
		for (i=0;i<LIEBYTE;i++){
//		DispYingXiangBuf[DisplayHangShu][i]=DispYingXiangBuf[DisplayHangShu][i];		
//		temp=*(p++);		
/*
#pragma asm
        MOVX A,@DPTR
        INC DPTR
#pragma endasm
*/
            	DispScan();
		for (ii=8;ii>0;ii--){				
		    pCLK=0;
		    pCLK=1;
		}
	}
       	pOE=1;		
		for (ii=8;ii>0;ii--);				
		pRCLK=1;
//		for (ii=8;ii>0;ii--);				
   	    pOE=0;

		
/*	    	pOE=0;		//4094改为595时需要此信号
		pOE=1;*/
		
       	DptrBakHi=DPH;
       	DptrBakLo=DPL;

//上海凯伦
#ifdef ChangJia_ShangHaiKaiLun
        	P3=DisplayHangSao;
#endif


//杭州尖峰
#ifdef ChangJia_HangZhouJianFeng
		pLD=1;
#endif

		DisplayHangShu++;

#ifdef ChangJia_ShangHaiKaiLun
		DisplayHangSao+=0x04;
#endif

if (DisplayHangShu>=HANGSHU){
		DisplayHangShu	=0;

#ifdef ChangJia_ShangHaiKaiLun
		DisplayHangSao=0xc3;
#endif
        	DptrBakHi=0;
        	DptrBakLo=0;

//杭州尖峰
#ifdef ChangJia_HangZhouJianFeng
		pLD=0;
#endif
	}
   	pCE=pCEtemp;					//片选 
}

/*----------------------------------------------*/
/* Title  : Initialize 				*/
/* Action :	初始化				*/
/*----------------------------------------------*/
void InitAsp(){
#ifdef ChangJia_HangZhouJianFeng
data unsigned char		i;
#endif
	TMOD=0x21;		//定时器1工作在方式2(自动重装载)
    TH0=-MSCOUNT>>8;		// 1ms
    TL0=-MSCOUNT; 
//   IE=0x00;	     		// EA=1,允许定时器0 	
    IE=0x82;	     		// EA=1,允许定时器0 	
    P1=0xFF;
    pCE=0;

//杭州尖峰
#ifdef ChangJia_HangZhouJianFeng
    pLD=1;	
    for (i=0;i<16;i++){
	      pRCLK=0;
		  pRCLK=1;
    }
    pLD=0;	
#endif

//上海凯伦    
#ifdef ChangJia_ShangHaiKaiLun
    P3=0xc3;
#endif
//    p=&DispBuf[0][0]; 
    ClrPing(&DispBuf[0]);
    TR0=1;	       			// Start count
//    pOE=0;	
}

/*************************************************/
/*
void 	MapDrawLeftShift(){
	   data unsigned char		i;
	   data unsigned char		j;
	   data signed char		k;
	   data signed char		h;
	   data unsigned char		temp;
	   data unsigned char		temp1;

	for (i=0;i<LIEBYTE;i++){
		for (h=7;h>=0;h--){
			for (j=0;j<HANGSHU;j++){
				temp=DispYingXiangBuf[j][i]>>h;		
				for (k=LIEBYTE-1;k>=0;k--){
					temp1=DispBuf[j][k];	
					DispBuf[j][k]=(temp1<<1)|temp;	
					temp=temp1>>7;
				}	
			}
		if (UartEnd) return;
		WDT_RESET();
		LeftShiftDelayCount=1;
		while(LeftShiftDelayCount);	
		}
	}			
}*/
void MapDrawZhiJie(unsigned char temp){
	 	memcpy(DispBuf,&DispShuBuf[temp][0][0],HANGSHU*LIEBYTE);
}
/*
void MapDrawZhiJie(){
	 	memcpy(DispBuf,DispYingXiangBuf,HANGSHU*LIEBYTE);
		LeftShiftDelayCount=255;
		while(LeftShiftDelayCount)	WDT_RESET();	
}*/

/**************************************************************************/
/*
void 	DataCopy(unsigned char temp){
	 	memcpy(DispYingXiangBuf,& DispShuBuf[temp][0][0],HANGSHU*LIEBYTE);
}*/
/*
void 	MemDataCopy(unsigned char *c,unsigned char *d){
    data unsigned int		i;
    for (i=0;i<HANGSHU*LIEBYTE;i++) {
       c[i]=d[i];
 	  if (c[i]!=d[i]) break;
    }
}*/
/*********************************************************/
void MapDrawString(unsigned char *str)
{
    data unsigned char	       *pFont;
    idata unsigned char	       Font[32];
    

    data unsigned int		FontIndex=0;
    data unsigned int		FontIndexok=0;
    idata unsigned long		FontCount;
//    data unsigned int		FontCountL;
  //  data unsigned char		FontCountH;

    data unsigned char		i;
    data unsigned int		temp;
    data unsigned int		LieShu=0;
    
    data unsigned char		j;
    data unsigned char		c, d;
  
  
    
//	for (k = 0; k <LIEBYTE; k=k+2) {

//	while ((c = str[FontIndex]) != '\0'){
	while (FontIndex < LIEBYTE){
		c = str[FontIndex];
		if (c<0x80){
			temp=c*16;
			for (i = 0; i < 16; i++) {
	    			Font[i]= Asczk[temp+i];
	    		}
			for (j = 0; j < HANGSHU; j++) {
				DispShuBuf[0][j][FontIndex]= Font[j];     		
			}	
			FontIndex ++;
/*
			d = Asc_Table[c][1];
			c= Asc_Table[c][0];			
			FontIndex ++;*/
		}
		else{
		   	d = str[FontIndex + 1];
//			WDT_RESET();
			FontCount = 32*((unsigned long)(c - 160 - 1) * 94 + (d -160 - 1));
//			FontCountH=P1;	
			P1=(P1&0x8f)|((FontCount>>12)&0x70);	//送页面地址
//			P1=(FontCountH&0x9f)|((FontCount>>16)<<5);	//送页面地址
			
			pFont = (unsigned char *)((unsigned long)FontCount&0x0ffff|0x10000);
//		 	memcpy(Font,pFont,32);
		   	pCE=1;					//片选 选中020字库储存器
			for (i = 0; i < 32; i++) {
		    		if ( ( (&pFont[i]) ==0 )&& (i!=0)) P1=P1+0x10;
		    		Font[i]= pFont[i];
			}		
			pCE=0;		
//			PingShu	= FontIndexok/LIEBYTE;					
			for (j = 0; j < HANGSHU; j++) {
//				temp=LieShu%LIEBYTE;
				DispShuBuf[0][j][FontIndex]= Font[ 2 * j];     		
				DispShuBuf[0][j][FontIndex+1]=Font[2 * j + 1];     		
			}	
	         	FontIndex += 2;
//			FontIndexok += 2;
//			LieShu +=2;
		}
	}
/*	
	while( (temp=LieShu%LIEBYTE) >0){
			for (j = 0; j < HANGSHU; j++) {
				DispShuBuf[PingShu][j][temp]= 0;     		
				DispShuBuf[PingShu][j][temp+1]=0;     		
			}	
		LieShu += 2;
	}			*/
}

/**************************************************************/
void ClrPing(unsigned char *p){
    data unsigned int	i;
	for (i = 0; i < HANGSHU*LIEBYTE; i++)  p[i]=0x0;
}


/***************************************************************/

void 	WDT_RESET(){
	p5045CS=0;
	p5045CS=1;
}
	

⌨️ 快捷键说明

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