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

📄 uart.c

📁 基于SPMC75F2413A的LCD驱动程式序, 使用128X64的液晶模块,包含有画线,画圆和BMP,字符串等显示处理,全部源码,完整的工程.愿对从事单片机开发的工程式师有用.
💻 C
字号:

//========================================================================
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//             (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
//                    ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================================

//========================================================================
// Filename: UART.c
// Author: Lianshu  Mou (email: Lianshu@sunnorth.com.cn)
// Date: 2004/08/05
// Description: 
//
// Reference:
// Revision:
//      2004/08/05      First version
//========================================================================
#include "Spmc75_regs.h"
#include "mcMACRO.h"
#include "Queue.h"

static int RX_Err_counter = 0;
static int RX_counter = 0;

unsigned int RX_Data_Buffer[16];
unsigned int TX_Data_Buffer[16];

unsigned int RX_Data_a[10];

FIFO_QUEUE  UART_RX_Buffer = 
{
	RX_Data_Buffer,
	RX_Data_Buffer + sizeof(RX_Data_Buffer) - 1,
	RX_Data_Buffer,
	RX_Data_Buffer
};
GEN_REG_DEF UART_flag;
#define	RX_flag_head		UART_flag.B.bit0
#define	RX_Work_complete	UART_flag.B.bit1
#define	TX_Work_complete	UART_flag.B.bit2
#define	UART_Err_flag   	UART_flag.B.bit3

#define OK 0x00ff

unsigned int RX_XOR_check(unsigned int *Data,int Num);
unsigned int TX_XOR_create(unsigned int *Data,int Num);
void Daly_Time(int Time);
//****************************************************************************************************
// UART_IRQ中断服务  UART_IRQ
// 设计者: 牟联树
// 描  述: 串行通信中断服务
// 日  期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
//    if(((*P_UART_Command2 & 0x0080) == 0x0080)&&(TX_Work_complete == 1))                        //判断是接收还是发关中断
    {		//接收中断
    	if(RX_flag_head)
    	{
    		if(RX_counter < 13)
    		{
    			FIFO_Push_Queue(&UART_RX_Buffer,(P_UART_Data->W)&0x00ff);
    			RX_counter ++;
    		}
    		if(RX_counter > 12)
    		{
    			if(RX_XOR_check(RX_Data_Buffer,11) == OK)
    			{   //校验正确
    				if(RX_Data_Buffer[0] == 0x00fb)
					{
    			    	RX_Data_a[0] = (RX_Data_Buffer[1] << 8) + RX_Data_Buffer[2];
    					RX_Data_a[1] = (RX_Data_Buffer[3] << 8) + RX_Data_Buffer[4];	//将数据送到指定的数据单元.
    					RX_Data_a[2] = (RX_Data_Buffer[5] << 8) + RX_Data_Buffer[6];
    					RX_Data_a[3] = (RX_Data_Buffer[7] << 8) + RX_Data_Buffer[8];
    					RX_Data_a[4] = (RX_Data_Buffer[9] << 8) + RX_Data_Buffer[10];
    				}
    				if(RX_Data_Buffer[0] == 0x00fa)
    				{
    			    	RX_Data_a[5] = (RX_Data_Buffer[1] << 8) + RX_Data_Buffer[2];
    					RX_Data_a[6] = (RX_Data_Buffer[3] << 8) + RX_Data_Buffer[4];	//将数据送到指定的数据单元.
    					RX_Data_a[7] = (RX_Data_Buffer[5] << 8) + RX_Data_Buffer[6];
    					RX_Data_a[8] = (RX_Data_Buffer[7] << 8) + RX_Data_Buffer[8];
    					RX_Data_a[9] = (RX_Data_Buffer[9] << 8) + RX_Data_Buffer[10];
    				}
					//RX_Data_Buffer[9],RX_Data_Buffer[10]是室外机的状态标志

    				//读标志设置
    				RX_Work_complete = 1;
    				RX_Err_counter = 0;
    				RX_flag_head = 0;
    				UART_Err_flag = 0;
    			}
    			else
    			{
					RX_flag_head = 0;
					RX_Work_complete = 0;
					RX_Err_counter ++;
					if(RX_Err_counter > 3)
						UART_Err_flag = 1;
				}
    		}
    	}
    	else if((P_UART_Data->W&0x00ff) == 0xaa)
    		{
    			RX_flag_head = 1;
    			RX_counter = 0;
    			FIFO_Reset_Queue(&UART_RX_Buffer);
    		}
    }
}
//=============================================================
// ----Function: void UART_putchar(int NUM);
// -Description: 系统定时服务的分中断处理函数
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=============================================================
void UART_putchar(int NUM)
{
	int i;
	TX_Work_complete = 0;
//	*P_UART_Command1 = 0;
	P_IOB_Buffer->W |= 0x0003;//切换为发送方式
	Daly_Time(20);
//	while((*P_UART_Command2 & 0x0040) == 0);
	for(i=0;i<NUM;i++)
	{
		P_UART_Data->W = TX_Data_Buffer[i];
//		while((*P_UART_Command2 & 0x0040) == 0);
	}
	Daly_Time(10);
	P_IOB_Buffer->W &= 0xfffc;					//切换回接收方式
	TX_Work_complete = 1;
//	*P_UART_Command1 = 0x80;
}
//=============================================================
// ----Function: void Sys_TXD_Work(void);
// -Description: 
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=============================================================
void Sys_TXD_Work(unsigned int Data)
{	//系统信息发送
	TX_Data_Buffer[0] = 0xaa;
	TX_Data_Buffer[1] = Data;
	TX_Data_Buffer[2] = 0;
	TX_Data_Buffer[3] = 0;
	TX_Data_Buffer[4] = 0;
	TX_Data_Buffer[5] = 0;
	TX_Data_Buffer[6] = 0;
	TX_Data_Buffer[7] = 0;
	TX_Data_Buffer[8] = 0;
	TX_Data_Buffer[9] = 0;
	TX_Data_Buffer[10] = 0;
	TX_Data_Buffer[11] = 0;
	TX_Data_Buffer[12] = TX_XOR_create(TX_Data_Buffer,11);
	TX_Data_Buffer[13] = 0xcc;
	UART_putchar(14);//发送数据
}
//=============================================================
// ----Function: void UART_Init(void);
// -Description: 系统定时服务的分中断处理函数
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=============================================================
void UART_Init(void)
{
	unsigned int Temp;
	P_IOB_Attrib->W |= 0x0483;
	P_IOB_Dir->W &= 0xff7f;
	P_IOB_Dir->W  |= 0x0403;
	P_IOB_Buffer->W |= 0x0480;
	P_IOB_Buffer->W &= 0xfffc;
	
//	*P_UART_BaudScalarLow = 0xff;
//	*P_UART_BaudScalarHigh = 0x1f;
	
//	*P_UART_Command1 = 0x80;
//	*P_UART_Command2 = 0xc0;
	Temp = P_UART_Data->W;
	TX_Work_complete = 1;
}
//=============================================================
// ----Function: unsigned int RX_CRC_check(unsigned int *Data,int Num);
// -Description: 
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=============================================================
unsigned int RX_XOR_check(unsigned int *Data,int Num)
{
	int i;
	unsigned int Temp;
	Temp = Data[0];
	for(i = 1;i < Num;i ++ )
		Temp ^= Data[i];
	if((Temp == Data[i])&&(Data[i+1] == 0xcc))
		Temp = OK;
	else Temp = 0;
	return(Temp);
}
//=============================================================
// ----Function: unsigned int TX_CRC_create(unsigned int *Data,int Num);
// -Description: 
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=============================================================
unsigned int TX_XOR_create(unsigned int *Data,int Num)
{
	int i;
	unsigned int Temp;
	Temp = Data[1];
	for(i = 2;i < (Num + 1);i ++ )
		Temp ^= Data[i];
	return(Temp);
}
//=============================================================
// ----Function: void Daly_Time(int Time);
// -Description: 延时程序
// --Parameters: Time 延时时间的大小
// -----Returns: None
// -------Notes: 
//=============================================================
void Daly_Time(int Time)
{
	int i;
	while(--Time > 0)
	{
		for(i = 0;i < 1000;i++)
		{ ;}
	}
}

⌨️ 快捷键说明

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