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

📄 uart.c

📁 单片机驱动32X64点阵资料
💻 C
字号:
#include "NEW_8051.H"
#include "main.h"
//起始标志 0x5A 结束标志 0xA5  0x00 无反应
#define START 0X5A //起始位
#define END   0XA5 //结束位
sbit LED1=P2^5;
/*
	0x5a+C+L+DATA+CS+0xA5
	C 控制码 
	L 长度
	DATA 数据
	CS  较验和  C+L+DATA


 和取模
    接收成功返回1字节:0x06
*/

bit uart_rBIT=0;
uchar ReceVeryfy=0;
uint uiAddressCount=0x200;
uchar ReceState=0;
uchar ucDataBuff[220];
uchar ReceCount=0;
bit bEanle=0;
uchar ucControlCode;
uchar ucLength;
void uart_init()
{
    SCON = 0x50;
  	BRT= 0xf4;  //0xfb: 30MHz,12T,SMOD=0,9600bps
  	AUXR   |= 0x11;	// 使用独立波特率发生器
	ES=1;
    PS = 1;         //"串行中断优先"
	
    PSH;
	EA=1;
}
/*******************************************/
void MAIN_RS_INT(void) interrupt 4
{
    uchar DataTemp;
	
     //uart_rBIT=1;
    if(RI)  // 接收
    {
		RI = 0;
		//ucUdateTime=200;
		DataTemp = SBUF;
		bEanle=1;
		/************************************/
		switch (ReceState)
		{
			case 0:
				if(START == DataTemp)
                {
                    ReceState = 1;
                }
				break;
			case 1:
				ucControlCode=DataTemp;	//接收控制码
				ReceVeryfy += ucControlCode;//开始计算校验和			
				 ReceState = 2;							
				break;
			case 2:
				ucLength=DataTemp;
				ReceVeryfy += ucLength;//计算校验和
				ReceState = 3;		
				break;
			case 3:			
				if(ReceCount<ucLength)
				{
					ReceVeryfy += DataTemp;
					ucDataBuff[ReceCount]=DataTemp;
					ReceCount++;					
					
				}
				else
				{
					if(ReceVeryfy == DataTemp)
                     {
                        
						ReceVeryfy=0;
						ReceCount=0;
						ReceState=4;
						//LED1=~LED1;
                     }
					 else
					 {
					  	ReceState=0;
					 }	
				}
				break;
			   	case 4:
					 if(END == DataTemp)
					 {
					 	uart_rBIT=1;
						ReceState=0;
					 }
				break;
			default:				 
				ReceState=0;
				break;
		}
/********************************************/	
		if( uart_rBIT )
		{
			uart_rBIT = 0;
			switch (ucControlCode)
			{
				case 0x01://扇区擦除命令
						for(i=1;i<=ucDataBuff[0];i++)
					    {
							sector_erase(i*0x200);
						}
						Send_data(0x06);
					break;
				case 0x02://字幕数据命令
						
						for(BuffCount=0;BuffCount<ucLength;BuffCount++)
						{
							byte_program(0x200+BuffCount+uiBaseAddress,ucDataBuff[BuffCount]);//把字幕数据写入EEP
						}
						uiBaseAddress=uiBaseAddress+ucLength;
						if(ucLength<180)
						{
							uiFontNumber=uiBaseAddress;//字模的总数量
							byte_program(0x100,uiFontNumber>>8);
							byte_program(0x101,uiFontNumber);
							uiBaseAddress=0;
							bEanle=0;	
						}
						//ucEEPArray=1;//EEP有字幕数据标志

						Send_data(0x06);
					break;
				case 0x03://参数设置命令						
					    sector_erase(0);
						for(BuffCount=0;BuffCount<ucLength;BuffCount++)
						{
							byte_program(BuffCount,ucDataBuff[BuffCount]); //把设置的参数写入EEP
						}
						byte_program(0x100,uiFontNumber>>8);
						byte_program(0x101,uiFontNumber);
						ucSpeed=ucDataBuff[0]<<1; //移动速度
						ucFontSize=ucDataBuff[1]<<4; //字体大小
						ucFontColor=ucDataBuff[2]; //字体颜色
						ucPlateNum=ucDataBuff[3]<<3; //级联块数(32*64一块)
						ucShowMode=ucDataBuff[4];//显示模式
						
						Send_data(0x06);
					break;
					case 0x04:
						ES = 0;
						//Send_data(uiBaseAddress>>8);
						//Send_data(uiBaseAddress);			
						/*for( i=0;i<250;i++ )
						{
							SBUF = byte_read(0x200+i);
							while( TI == 0 );
							TI = 0;
						}*/			
						ES = 1;
					 break;
				default:
					break;
			}
	
		}		
	}
/*****************************************/
/*	if(TI)
    {
        TI = 0;
	}  */

}

⌨️ 快捷键说明

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