
///////////////////////////////////////////////////////////////////////////////////////////////////////	 
//本程序用于简单验证/测试尚视界JC系列集成串口模块
//C51 STC12C5A60S2 开发板  RX-P30 ; TX-P31	   
//尚视界科技@工程部
//公司网站:www.sun-lcm.com
//淘宝店：https://shop151604432.taobao.com
//阿里企业店：https://sundisplay2008.1688.com
//业务支持：潘生 mobile:13509671256 QQ:3167153224
//技术支持：梁生 QQ:3085638545
//修改日期:2015/09/18 
//版本：V1.0
//版权所有，盗版必究。
//Copyright(C) 尚视界科技有限公司 2015-2021
//All rights reserved
//******************************************************************************************************
//V1.0修改说明
//初版
///////////////////////////////////////////////////////////////////////////////////////////////////////// 	  


/*************	本程序功能说明	**************
	测试方法：
	根据您的主时钟和波特率修改下面的相关定义，编译后下载到MCU。
	通过串口助手向MCU发送数据，MCU收到后原样返回。
	发单个字符'i'，将返回唯一ID号。
	发单个字符'r'，将返回内部震荡频率。
*/

 #include "stdio.h"
 #include "stdlib.h"
 #include "string.h"
// #include "cstdlib.h"
/*************** 用户定义参数 *****************************/

#define MAIN_Fosc	11059200L	//22118400L	//define main clock

#define Baudrate0	115200//9600//115200	//波特率 define the baudrate,
									//12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
									//1T  mode: 7200~1382400 for 22.1184MHZ, 3600~691200 for 11.0592MHZ

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


#include	<reg51.h>

sfr	AUXR = 0x8E;

bit		B_TI;

unsigned char id[7];
unsigned long Rosc,RoscZ;
unsigned char Command;

void	uart0_init(void);


/****************** 编译器自动生成，用户请勿修改 ************************************/

//#define T1_TimerReload		(256 - MAIN_Fosc / 192 / Baudrate0)		//Calculate the timer1 reload value	at 12T mode
#define T1_TimerReload	(256 - MAIN_Fosc / 16 / Baudrate0)		//Calculate the timer1 reload value ar 1T mode

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

void 	TxByte(unsigned char dat);
unsigned char HEX2DEC(unsigned char dat);
void	PrintStrings(unsigned char  *sts);

   void delay(unsigned short dl)
  {
  		unsigned short i,j;
		
		for(j=0;j<dl;j++);
		for(i=0;i<10000;i++);
  }
	


unsigned char RX_BUF[3];
unsigned char rx_flag_finished=0;
unsigned char rx_count=0;


void CheckBusy(void)  
{
	for(;;)
	{
		if(rx_flag_finished==0xc0)
		{
			if((RX_BUF[0]=='O')&&(RX_BUF[1]=='K'))
			{
				RX_BUF[0]=0;
				RX_BUF[1]=0;
				rx_flag_finished=0;	
				rx_count=0;
        break;				
			}	
				
		}	
	}
	//	busy_flag=1;
}




void	main(void)
{
	unsigned char i;
	unsigned int  j;
	unsigned char idata *p;
	char buf[128];
	char cmd[128]={0};	 //1.申明字符存储缓冲区
	unsigned char x=100;  //要显示字符的X位置
	unsigned char y=40;	  //显示字符的Y位置
	char ch[4];//2.申明转换后的字符存储空间，共显示3位数字
	int k=0;   //3.要显示的变量
    long pic_addr1=2097152;	   
	long pic_addr2=(2097152+240*400*2);
	p = 0xf1;
	for(i=0; i<7; i++)
	{
		id[i] = *p;
		p++;
	}
	
	Rosc = 0;
	for(p=0xf8; p<=0xfb; p++)	Rosc = (Rosc << 8) + *p;
	RoscZ = 0;
	for(p=0xfc; p>0; p++)	RoscZ = (RoscZ << 8) + *p;
	uart0_init();



	delay(500);

for(;;)

{	
		delay(500);

		PrintStrings("CLR(0);DIR(1);FSIMG(2097152,0,0,320,240,0);\r\n");//横屏显示，在(0,0)的位置显示地址为2097152图片,图片的宽度是320 高度是240，模式0表示正常显示
		CheckBusy();
		PrintStrings("FSIMG(2250752,0,0,320,240,0);\r\n");//横屏显示，在(0,0)的位置显示地址为2250752图片,图片的宽度是320 高度是240，模式0表示正常显示
		CheckBusy();
		PrintStrings("FSIMG(2404352,0,0,320,240,0);\r\n");//横屏显示，在(0,0)的位置显示地址为2404352图片,图片的宽度是320 高度是240，模式0表示正常显示
		CheckBusy();
		PrintStrings("FSIMG(2557952,0,0,320,240,0);\r\n");//横屏显示，在(0,0)的位置显示地址为2557952图片,图片的宽度是320 高度是240，模式0表示正常显示
		CheckBusy();
		PrintStrings("FSIMG(2711552,0,0,320,240,0);\r\n");//横屏显示，在(0,0)的位置显示地址为2711552图片,图片的宽度是320 高度是240，模式0表示正常显示
		CheckBusy();
		PrintStrings("FSIMG(2865152,0,0,320,240,0);\r\n");//横屏显示，在(0,0)的位置显示地址为2865152图片,图片的宽度是320 高度是240，模式0表示正常显示
		CheckBusy();
		PrintStrings("FSIMG(3018752,0,0,320,240,0);\r\n");//横屏显示，在(0,0)的位置显示地址为3018752图片,图片的宽度是320 高度是240，模式0表示正常显示
		CheckBusy();
		delay(80000);		
//		for(i=0;i<7;i++)  //153600 268800
//		{
//			sprintf(cmd,"DIR(1);FSIMG(%e,0,0,320,240,0);\r\n",2097152+240*320*2*i);//在（0,0）位置连续调取8张整屏图片，第一张从地址2097152开始，图片大小320x240，模式0表示正常显示
//			PrintStrings(cmd);//发送字符指令串
//			CheckBusy();	//等待模块执行完，也就是检测模块发送回来的"OK\r\n"
//	  }
		
			 
		PrintStrings("DIR(1);CLR(0);DC32(50,10,'深圳尚视界科技',4);\r\n");// 横屏显示，背景颜色为黑色，用黄色以(50,10)为起点,在屏幕上显示透明的'深圳尚视界科技'这四个字,字体大小为32,4为黄色的色表编号
		CheckBusy();

		PrintStrings("PL(0,60,320,60,15);\r\n");//画直线命令将屏幕上的(0,60)位置的点和（300,60）位置的点用白色(编号15)的直线连起来
		CheckBusy();
		//delay(800);
		
		PrintStrings("PL(0,60,320,60,15);\r\n");//画直线命令同上
		CheckBusy();
		//delay(800);
	
		PrintStrings("PL(0,120,320,120,15);\r\n");//画直线命令同上
		CheckBusy();
		//delay(800);
		
		PrintStrings("PL(0,180,320,180,15);\r\n");//画直线命令同上
		CheckBusy();
		//delay(800);
		
		PrintStrings("PL(0,239,320,240,15);\r\n");//画直线命令同上
		CheckBusy();
		//delay(800);
		
		PrintStrings("PL(0,60,0,239,15);\r\n");//画直线命令同上
		CheckBusy();
		//delay(800);
		
		PrintStrings("PL(105,60,105,239,15);\r\n");//画直线命令同上
		CheckBusy();
		//delay(800);
		
		PrintStrings("PL(210,60,210,239,15);\r\n");//画直线命令同上
		CheckBusy();
		//delay(800);
		
		PrintStrings("PL(319,60,319,239,15);\r\n");//画直线命令同上
		CheckBusy();
		//delay(800);
		
		PrintStrings("CIR(50,90,20,1);\r\n"); //(50,90)为圆心 20为半径用红色画一个线圆 ,1为红色的色表编号
		CheckBusy();
		
		PrintStrings("CIRF(60,90,20,2);\r\n"); //(60,90)为圆心 20为半径用绿色画一个填充圆, ,2为绿色的色表编号
		CheckBusy();
		//delay(800);
		
		PrintStrings("BOXF(140,75,180,100,3);\r\n");//对角线(140,75)和(180,100)画填充框 ,3为蓝色的色表编号 
		CheckBusy();
		
		PrintStrings("BOX(150,75,190,100,1);\r\n");//对角线(150,75)和(190,100)画线框 ,1为红色的色表编号
		CheckBusy();
		
		PrintStrings("PS(270,85,2);\r\n");//在屏幕的(270,85) 位置用绿色描绘一个点,2为绿色的色表编号
		CheckBusy();	
		
		PrintStrings("PL(250,95,300,95,1);\r\n");//画直线命令同上
		CheckBusy();
			
		PrintStrings("DC16(20,140,'ABC',3);\r\n");//刷字体命令同上
		CheckBusy();
		
		PrintStrings("SBC(15);DCV16(60,140,'ABC',0);\r\n"); //用黑色以(60,140)为起点,在屏幕显示带白色背景色的'ABC'这四个字母,字体大小为16,0为黑色的色表编号
		CheckBusy();
		
		PrintStrings("DC24(120,140,'123',2);\r\n");//刷字体命令同上
		CheckBusy();
		
		PrintStrings("SBC(4);DCV24(160,140,'123',0);\r\n");//刷字体命令同上
		CheckBusy();
		
		PrintStrings("DC32(230,140,'深圳',2);\r\n");//刷字体命令同上
		CheckBusy();
		
		PrintStrings("SBC(1);DCV32(20,190,'深圳',15);\r\n"); //刷字体命令同上
		CheckBusy();
		
		PrintStrings("DC48(110,190,'中国',6);\r\n");//刷字体命令同上
		CheckBusy();
		
		PrintStrings("DC48(220,190,'中国',1);\r\n"); //刷字体命令同上	
		CheckBusy();
    delay(3200);
	
		PrintStrings("CLR(0);DIR(1);FSIMG(3172352,0,0,320,240,0);\r\n");//横屏显示，在(0,0)的位置显示地址为3172352图片,图片的宽度是320 高度是240，模式0表示正常显示
		CheckBusy();	
		PrintStrings("DC48(25,10,'2017-06-25 ',15);\r\n");//刷字体命令同上	
		CheckBusy();
		PrintStrings("DC32(20,65,' 星期二',15);\r\n");//刷字体命令同上	
		CheckBusy();
		
		PrintStrings("DC32(150,65,' 20 ：',15);\r\n");//刷字体命令同上	
		CheckBusy();
		
		PrintStrings("PL(0,60,320,60,15);\r\n");//画直线命令同上
		CheckBusy();
		delay(10000);	 
		k=0;
		for(k=0;k<=60;k++)

	 {
			sprintf(cmd,"SBC(15);DCV32(250,65,'%2d',1);\r\n",k);//刷32号字体变化数字0-50
			k=k+1;
			delay(100);
			PrintStrings(cmd);
			CheckBusy();							 
		}

		 k=0;
		 for(k=0;k<=50;k++)
	 {
			sprintf(cmd,"SBC(15);DCV32(40,130,'%2d',1);\r\n",k);//刷32号字体变化数字0-50
			k=k+1;
			delay(100);
			PrintStrings(cmd);
			CheckBusy();	
			 
			sprintf(cmd,"SBC(15);DCV32(133,130,'%d',1);\r\n",k);//刷32号字体变化数字0-50
			k=k+1;
			delay(100);
			PrintStrings(cmd);
			CheckBusy();
			 
			 
			sprintf(cmd,"SBC(15);DCV32(233,130,'%d',1);\r\n",k);//刷32号字体变化数字0-50
			k=k+1;
			delay(100);
			PrintStrings(cmd);
			CheckBusy();	
						 
		}		
		 delay(12000);
	
		PrintStrings("CLR(0);DIR(1);FSIMG(3325952,0,0,320,240,0);\r\n");//刷图片指令同上
		CheckBusy();	
	
	{
				k=40;
		 {
			sprintf(cmd,"DCV32(120,110,'亮度：80 ',1);BL(%2d);\r\n",k);//刷32号字体，将亮度变量k转换成"BL(k);\r\n"的字符指令，范围：0为最亮 255为最暗 
			PrintStrings(cmd);
			CheckBusy();	
			delay(1000);
		 }	
	 }	
	
	
	{
				k=127;
		{
			sprintf(cmd,"DCV32(120,110,'亮度：50 ',1);BL(%2d);\r\n",k);//刷32号字体，将亮度变量k转换成"BL(k);\r\n"的字符指令，范围：0为最亮 255为最暗 
			PrintStrings(cmd);
			CheckBusy();	
			delay(1000);
		}	
	}	
		
		{
				k=200;
	{
			sprintf(cmd,"DCV32(120,110,'亮度：20 ',1);BL(%2d);\r\n",k);//刷32号字体，将亮度变量k转换成"BL(k);\r\n"的字符指令，范围：0为最亮 255为最暗 
			PrintStrings(cmd);
			CheckBusy();	
			delay(1000);
		}	
	}	
			
	{
				k=0;
		{
			sprintf(cmd,"DCV32(120,110,'亮度：100',1);BL(%2d);\r\n",k);//刷32号字体，将亮度变量k转换成"BL(k);\r\n"的字符指令，范围：0为最亮 255为最暗 
			PrintStrings(cmd);
			CheckBusy();	
			delay(10000);
		}	
	}		
	  delay(1000);
	
		PrintStrings("DIR(1);CLR(61);DC48(50,90,'演示结束！',15);\r\n");//刷字体命令同上 	
		CheckBusy();
	  delay(15000);

	}
	
}






unsigned char HEX2DEC(unsigned char dat)
{
	dat &= 0x0f;
	if(dat <= 9)	return (dat+'0');
	else			return (dat+55);
}

void TxByte(unsigned char dat)
{
	B_TI = 0;
	SBUF = dat;
	while(!B_TI)	;
	B_TI = 0;
}

/**********************************************/
void	PrintStrings(unsigned char  *sts)
{
    for (; *sts != 0; sts++)	TxByte(*sts);
}

void	uart0_init(void)
{
	PCON |= 0x80;		//UART0 Double Rate Enable
	SCON = 0x50;		//UART0 set as 10bit , UART0 RX enable
//	TMOD &= ~(1<<6);		//Timer1 Set as Timer, 12T
	TMOD = (TMOD & ~0x30) | 0x20;	//Timer1 set as 8 bits auto relaod
	AUXR |=  (1<<6);		//Timer1 set as 1T mode
	TH1 = T1_TimerReload;		//Load the timer
	TR1  = 1;
	ES  = 1;
	EA = 1;
}







/**********************************************/
void UART0_RCV (void) interrupt 4
{
	if(RI)
	{
		RI = 0;
		Command = SBUF;
		if(rx_flag_finished!=0xc0)//?????
		{
			if(rx_flag_finished&0x40)//????0x0d
			{
				if(Command==0x0a)
				{
					rx_flag_finished|=0x80;	//????? rx_flag_finished=0xc0
					RX_BUF[rx_count]='\0'; //??????????????
				}
				else 
				{
					rx_flag_finished=0;//????,????					
					rx_count=0;
				}
			}
			else //????0X0D
			{	
				if(Command!=0x0d)
				{
					RX_BUF[rx_count++]=Command ;	
				}
				else
				{
					rx_flag_finished|=0x40;
				}
			}
		}  
	}

	if(TI)
	{
		TI = 0;
		B_TI = 1;
	}
}
