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

📄 lcdmain.c

📁 51单片机接受SPI口数据
💻 C
字号:
#include "lcddrive.h"
#include  <reg51f.h>
sbit  RUN_LED = P3^4;
sbit  RESET=P1^0;
sbit  RDB=P3^7;
//sbit  TDA=P1^3;
//sbit P15=P1^5;
//sbit TCK=P3^2;
sfr SPCTL=0xD5;
sfr SPCFG=0xAA;
sfr SPDAT=0x86;
sfr WDTC=0xc0;
sfr WDTD=0x85;
void LCD_WriteData(char dat);
void LCD_WriteCommand(char com);
extern unsigned char xdata DispBuff[GUI_LCM_YMAX][GUI_LCM_XMAX/8];
uchar xdata i=0,disnum=0;
uchar data dispbuf[8];
uchar xdata fflag=0;
//char xdata strpct[20]="CT: A=   B=   C=   ";
#define strpnum 9
#define receibufnum 8
data char strp[6]="FHKZ";
//data char strpu[20]="U:   .     .     . ";
//data char strpi[20]="I: .     .     .   ";
char xdata strpui[7][11]; 
data uchar receibuf[receibufnum];
const uchar xdata ledcode[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xDE,0xEE,0xF8,0x72,0xBC,0xF2,0xE2};
void refresh()
{
 	uchar col,row;
    for(row=0; row<16; row++)
		for(col=0; col<20; col++)
			DispBuff[row][col]=0x0;
  
   	for(row=0; row<160; row++)
		for(col=0; col<81; col++)
			LCD_WriteData(0x00); 
}

findnum()
{
	uchar i,j,codenum;
	
		for(i=3,j=0;i<receibufnum;i++,j++)
		{
			for(codenum=0;codenum<strlen(ledcode);codenum++)
			{
				if(ledcode[codenum]==dispbuf[i])
				break;
		    }
			if(codenum<10)
			strp[j]=codenum+0x30;
			else
			strp[j]=codenum+0x57;
		}
    		
		if((dispbuf[0]==0x7e)&&(dispbuf[1]==0xee||dispbuf[1]==0xf8||dispbuf[1]==0x72))

		{
			if(dispbuf[1]==0xee)
			{
				strpui[0][3]=strp[0];
				strpui[0][4]=strp[1];
				strpui[0][5]=strp[2];
				strpui[0][7]=strp[4];
				disnum=1;	
			}	
			if(dispbuf[1]==0xf8)
			{
				strpui[1][3]=strp[0];
				strpui[1][4]=strp[1];
				strpui[1][5]=strp[2];
				strpui[1][7]=strp[4];
				disnum=2;				
			}
			if(dispbuf[1]==0x72)
			{
				strpui[2][3]=strp[0];
				strpui[2][4]=strp[1];
				strpui[2][5]=strp[2];
				strpui[2][7]=strp[4];
				disnum=3;
			}
		}	
		else if((dispbuf[0]==0x0c)&&(dispbuf[1]==0xee||dispbuf[1]==0xf8||dispbuf[1]==0x72))
		{
			if(dispbuf[1]==0xee)
			{
				strpui[3][3]=strp[0];
				strpui[3][4]=strp[1];
				strpui[3][6]=strp[2];
				strpui[3][7]=strp[4];
				disnum=4;	
			}	
			if(dispbuf[1]==0xf8)
			{
				strpui[4][3]=strp[0];
				strpui[4][4]=strp[1];
				strpui[4][6]=strp[2];
				strpui[4][7]=strp[4];
				disnum=5;				
			}
			if(dispbuf[1]==0x72)
			{
				strpui[5][3]=strp[0];
				strpui[5][4]=strp[1];
				strpui[5][6]=strp[2];
				strpui[5][7]=strp[4];
				disnum=6;
			}
		}
		else
		{
			for(i=0,j=0;i<receibufnum;i++,j++)
			{
				for(codenum=0;codenum<strlen(ledcode);codenum++)
				{
					if(ledcode[codenum]==dispbuf[i])
					break;
			    }
				if(codenum<10)
				strp[j]=codenum+0x30;
				else
				strp[j]=codenum+0x57;
			}
				strpui[6][3]=strp[0];
				strpui[6][4]=strp[1];
				strpui[6][5]=strp[2];
				strpui[6][6]=strp[3];
				strpui[6][7]=strp[4];
				strpui[6][8]=strp[5];
				disnum=7;
					
		}	

		if(disnum >=1 ) GUI_DispStringAt(&strpui[disnum-1][0], 0, 0);
}
void datapro()
{
	uchar a;
	uchar tempqian,temphou,temp7;
	for(a=0;a<7;a++)
	{
		tempqian=receibuf[a];
		temphou=receibuf[a+1];
		tempqian=tempqian<<1;
		temphou=(temphou&0x80)>>7;
		dispbuf[a]=tempqian|temphou;
	}
	temp7=receibuf[7];
	temp7=temp7<<1;
	dispbuf[7]=temp7;
	findnum();			
}

init()
{
	RDB=1;
	RESET=0;
	delay(200);
	RESET=1;
	delay(200);
	init_uc1698();
	RAM_ADDRESS();
	refresh();		
}

void init_serial()
{	
	TMOD=0x20;
	TH1=0xcb;
	TL1=0xcb;
	TR1=1;
	SM0=0;
	SM1=1;
	REN=1;
	ES=1;	
}
SPI_init()
{
	EA=1;
	ES=1;		 //开串口中断 (须和SPI中断使能位都置高 才能使能SPI中断)
	SPCTL=0xc8;	//SPI控制寄存器	 (从机模式 时钟极性为低有效 时钟线后延触发移位)
	SPCFG=0x00;	 //该配置寄存器最高位--SPI字节数据传送结束标志位
	
}
void look()
{
	unsigned char cnt;
	for(cnt=0;cnt<receibufnum;cnt++)
	{
		ES=0;
		SBUF=dispbuf[cnt];
		while(!TI);
		TI=0;
		ES=1;
	}	
}
void initstrpui(void)
{
	uchar i, j;

	for(i=0; i<7; i++)
		for(j=0; j<11; j++)
		{strpui[i][j]=0;}

	strpui[0][0] ='U';
	strpui[0][1] ='a';
	strpui[0][2] =':';
	strpui[0][6] ='.';
	strpui[0][8] ='V';

	strpui[1][0] ='U';
	strpui[1][1] ='b';
	strpui[1][2] =':';
	strpui[1][6] ='.';
	strpui[1][8] ='V';

 	strpui[2][0] ='U';
	strpui[2][1] ='c';
	strpui[2][2] =':';
	strpui[2][6] ='.';
	strpui[2][8] ='V';

 	strpui[3][0] ='I';
	strpui[3][1] ='a';
	strpui[3][2] =':';
	strpui[3][5] ='.';
	strpui[3][8] ='A';

 	strpui[4][0] ='I';
	strpui[4][1] ='b';
	strpui[4][2] =':';
	strpui[4][5] ='.';
	strpui[4][8] ='A';

 	strpui[5][0] ='I';
	strpui[5][1] ='c';
	strpui[5][2] =':';
	strpui[5][5] ='.';
	strpui[5][8] ='A';

 	strpui[6][0] ='C';
	strpui[6][1] ='T';
	strpui[6][2] =':';
	for(i=0; i<7; i++)
	{
		GUI_DispStringAt(&strpui[i][0], 0, 0);
		CopyRAMToLCD(0, i*16, 81, 15+i*16);
	}
}
	
void main(void)
{	
	RUN_LED=0;
	init();
	init_serial(); //串口初始化
	SPI_init();//SPI初始化
//	GUI_DispStringAt(strp, 0, 0); 
//	CopyRAMToLCD(0, 0, 159, 15);  //写液晶"XJT-5000/f"
	RUN_LED=1;
	initstrpui();
	while(1)
	{	 
		RUN_LED=1;
		if(fflag==1)
		{
			fflag=0;	
			RUN_LED=0;
			datapro();
			look();

//			for(i=0; i<7; i++)
//			{GUI_DispStringAt(&strpui[0][0], 0, 0);}
			if(disnum >=1 ) CopyRAMToLCD(0, (disnum-1)*16, 81, 15+(disnum-1)*16);
#if 0
			if((disnum==1)||(disnum==2)||(disnum==3))
			{
				GUI_DispStringAt(strpu, 0, 0); 
	    		CopyRAMToLCD(0, 0, 159, 15);  //写液晶"XJT-5000/f"
			}
			else if((disnum==4)||(disnum==5)||(disnum==6))
			{
				GUI_DispStringAt(strpi, 0, 0);
				CopyRAMToLCD(0, 16, 159, 31);  //写液晶"XJT-5000/f	
			}
#endif
		}																																						
	}
}
void serial() interrupt 4
{
	while(!SPCFG);	//等待SPI接受数据结束,SPI中断硬件置位SPCFG最高位(一字节数据传送结束标志,须软件清零)
	receibuf[i++]=SPDAT;
	SPCFG=0;  //软件清零数据传送结束标志位
	if(i==8)
	{
		i=0;
		fflag=1;
	}	
}

⌨️ 快捷键说明

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