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

📄 uart1.c

📁 msp430红外串口通信
💻 C
字号:
/*
 *CopyRight  Reserved?
 *文件名:UART1.c
 *描述:提供UART底层驱动
 *
 *版本:v1.0
 *作者:fire
 *日期:2004/12/01
 */

#define	UART1_C

#include "uart1.h"

static bool   bSending	= false;					//正在发送标志
static uchar  sucTxBuf[UART_TX_BUF];				//发送缓冲
static uchar  sucTxBufHead = 0;						//发送缓冲头指针
static uchar  sucTxBufTail = 0;						//发送缓冲尾指针
static uchar  sucTxBufLen  = 0;						//发送缓冲有效数据长度

static uchar  sucRxBuf[UART_RX_BUF];				//接收数据缓冲。
static uchar  sucRxBufHead = 0;						//接收缓冲头指针					
static uchar  sucRxBufTail = 0;						//接收缓冲尾指针。
static uchar  sucRxBufLen  = 0;						//接收缓冲有效数据长度。

#define DIROUT P5DIR=0XFF
#define DIRIN  P5DIR=0X00
#define RS_1   P4OUT|=BIT6
#define RS_0   P4OUT&=~BIT6
#define RW_1   P4OUT|=BIT7
#define RW_0   P4OUT&=~BIT7
#define E_1    P4OUT|=BIT5
#define E_0    P4OUT&=~BIT5
void wr_lcd (uchar dat_comm,uchar content);
void chk_busy (void);
void Delay (uint);
uint show=0;
uint data=0;
 uchar dis1=0, dis2=0,dis3=0,dis4=0; 
uint ss[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar tab31[]={
"  兰州交通大学  "
 
};
uchar tab32[]={
"速度:      m/s "
};
uchar tab33[]={
"车程:        m"};
uchar tab34[]={
"2009年04月24日ok"};

/**************************************与具体芯片相关的函数定义**********************************************/
/*
 *函数性质:私有
 *入口:通讯波特率ucBrate
 *出口:无
 *功能:按给定的波特率初始化AT通讯端口,只适用于MSP430芯片,对其它类型的芯片,
 *由使用者自己定制
 */
static const ulong culBrateLst[] = {600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200};	
static const uchar cucResidue[9] = {0x00,0x80, 0x44, 0x52, 0x55, 0x6d, 0x77, 0x7f, 0xff};

static void SetCommBrate(uchar ucBrate)
{
	uint uiCurBrate;	
	uiCurBrate = BRCLK/culBrateLst[ucBrate];
	UBR01 = ( (uchar)uiCurBrate & 0X00FF);			//设定波特率寄存器。
	UBR11 = ( (uiCurBrate>>8) & 0X00FF);
													//求出波特率的余数
	uiCurBrate = ( (ulong)(BRCLK%culBrateLst[ucBrate])*8
				+ culBrateLst[ucBrate]/2 ) /culBrateLst[ucBrate];
	UMCTL1 = cucResidue[(uchar)uiCurBrate];
}
/******************************************************************************************
* 函数名称    :init_lcd
* 功能描述    : LCD初始化子程序
* 返回值      :无
******************************************************************************************/
void init_lcd (void)
{
   wr_lcd(comm,0x30);  /*30---基本指令动作*/ 
   wr_lcd(comm,0x01);  /*清屏,地址指针指向00H*/
        wr_lcd(comm,0x06);  /*光标的移动方向*/
        wr_lcd(comm,0x0c);  /*开显示,关游标*/
}
/******************************************************************************************
* 函数名称    :chn_disp1
* 功能描述    : 上半屏显示汉字或字符,字库汉字与字符
* 返回值      :无
******************************************************************************************/
 void chn_disp1(uchar  *chn)
{
   uchar i,j;
   wr_lcd(comm,0x30);
        Delay(5);
   wr_lcd(comm,0x80);     //第1行
        j=0;
   for(i=0;i<16;i++)
        {
            wr_lcd(dat,chn[j*16+i]); 
        }
       
} 
  /******************************************************************************************
* 函数名称    :chn_disp1
* 功能描述    : 上半屏显示汉字或字符,字库汉字与字符
* 返回值      :无
******************************************************************************************/
 void chn_disp2 (uchar  *chn)
{
   uchar i,j;
   wr_lcd(comm,0x30);
        Delay(5);
   wr_lcd(comm,0x90);     //第2行
        j=0;
   for(i=0;i<16;i++)
        {
            wr_lcd(dat,chn[j*16+i]); 
        }
 } 
 
  /******************************************************************************************
* 函数名称    :chn_disp1
* 功能描述    : 上半屏显示汉字或字符,字库汉字与字符
* 返回值      :无
******************************************************************************************/
void chn_disp3 (uchar  *chn)
{
   uchar i,j;
   wr_lcd(comm,0x30);
        Delay(5);
   wr_lcd(comm,0x88);     //第3行
        j=0;
   for(i=0;i<16;i++)
        {
            wr_lcd(dat,chn[j*16+i]); 
        }
 } 
   /******************************************************************************************
* 函数名称    :chn_disp1
* 功能描述    : 上半屏显示汉字或字符,字库汉字与字符
* 返回值      :无
******************************************************************************************/
 void chn_disp4 (uchar  *chn)
{
   uchar i,j;
   wr_lcd(comm,0x30);
        Delay(5);
   wr_lcd(comm,0x98);     //第4行
        j=0;
   for(i=0;i<10;i++)
        {
            wr_lcd(dat,chn[j*16+i]); 
        }
 } 
  /******************************************************************************************
* 函数名称    :chn_disp1
* 功能描述    : 上半屏显示汉字或字符,字库汉字与字符
* 返回值      :无
******************************************************************************************/
 void chn_disp5 (uchar  *chn)
{
   uchar i,j;
   wr_lcd(comm,0x30);
        Delay(5);
   wr_lcd(comm,0x92);     
        j=0;
   for(i=0;i<16;i++)
        {
            wr_lcd(dat,chn[j*16+i]); 
        }
 }
 /******************************************************************************************
* 函数名称    :wch_disp
* 功能描述    :向指定位置写入汉字和字符,(字库汉字和字符)
* 返回值      :无,x字节数,nbyte写入的汉字和字符个数
******************************************************************************************/
void wch_disp(uchar *chn,uint x,uint nbyte)
{
   uchar i;
   wr_lcd(comm,0x30);  //一般功能
   wr_lcd(comm,x);  //显示起始位置,x坐标是自加的,注意显示地址
     for(i=0;i<(2*nbyte);i++)
        {
            wr_lcd(dat,chn[i]); //写数据
        }
}

/******************************************************************************************
* 函数名称    :chk_busy
* 功能描述    : 检查忙信号子程序
* 返回值      :无
******************************************************************************************/
void chk_busy(void)
{
   int temp;
        DIRIN;   //端口设置为输入方式
   RS_0;
   RW_1;
        do
        {
          E_1;   //读端口状态
     temp=P5IN;
          E_0;
        }while((temp&0X80)!=0);  //高位为1为忙信号
        DIROUT;
}
//****************
//*延时子程序
//****************
void Delay(uint n)
{
   uint i;
   for (i=n; i>0; i--)
   {
      ;
   }
}
/******************************************************************************************
* 函数名称    :wr_lcd
* 功能描述    : 写数据和指令子程序,0时写指令,1写数据
* 返回值      :无
******************************************************************************************/
void wr_lcd(uchar dat_comm,uchar content)
{
   chk_busy ();
   if(dat_comm)
    {
         RS_1;  //写数据
         RW_0;   
    }
   else 
    {
         RS_0;   //写指令
         RW_0;   
    }
   P5OUT=content;   //数据载入
        Delay(10);
   E_1;
   E_0;
}



/*函数性质:私有
 *入口:无	
 *出口;无
 *功能:初始化AT指令通讯口,串行口的数据格式为
 *8数据位,1停止位,无奇偶校验位
 */
static void RS232Ini(void)
{												//以下代码需要使用者根据具体的芯片定制。
	UCTL1 	= CHAR;								//8数据位、1停止位、无奇偶校验位
	UTCTL1	= SSEL0 + SSEL1;					//选择SMCLK作为通讯时钟。
	ME2 	= URXE1 + UTXE1;					//使能行发送与接收;
	IE2		= URXIE1 + UTXIE1;					//使能发送与接收中断。
	P3SEL 	|= 0xC0;            				// P3.6,7选择为UART1通讯端口
  	P3DIR 	|= 0x40;           					// P3.6的方向设为输出模式。
	INT_EN(); 									//开启中断
}
void dataprocess(void)
{      uchar temp1=0,temp2=0;
      
       
       dis1=data/1000;
       dis2=data%1000/100;
       dis3=data%100/10;
       dis4=data%10;
       temp2=temp1;
       temp1=data;
      
       show= temp1-temp2 ;
       show=show/10;   
     
       
}
void disp(void)
{     uchar bit0=0,bit1=0;
      
      
             bit0= show/10;
	     bit1= show%10;
	     if(data>10000)
	     data=0;

   wr_lcd(comm,0x30);  //一般功能
   wr_lcd(comm,0x93); 
              
   wr_lcd(dat,ss[ bit0] );
   wr_lcd(comm,0x30);
   wr_lcd(comm,0x94);
   wr_lcd(dat,ss[bit1] );
        
  
   wr_lcd(comm,0x30);
   wr_lcd(comm,0x8b);
   wr_lcd(dat,ss[dis1] );//车程千位
   wr_lcd(comm,0x30);
   wr_lcd(comm,0x8c);
   wr_lcd(dat,ss[dis2] );//车程百位 
   wr_lcd(comm,0x30);
   wr_lcd(comm,0x8d);
   wr_lcd(dat,ss[dis3] );//车程十位
   wr_lcd(comm,0x30);
   wr_lcd(comm,0x8e);
   wr_lcd(dat,ss[dis4] );//车程个位
   Delay(58000 );

}
/******************************************************************************************
* 函数名称    :clrram
* 功能描述    : 清DDRAM
* 返回值      :无
******************************************************************************************/
void clrram(void)
{
   wr_lcd(comm,0x30);
   wr_lcd(comm,0x01);
}
void dip(void)
{
            chn_disp1(tab31);
             
             chn_disp2(tab32);
             
             chn_disp3(tab33);
             
             chn_disp4(tab34);
}


/*
 *函数性质:中断函数
 *入口:无
 *出口:无
 *功能:处理串行中断的发送程序
 */
#pragma vector=USART1TX_VECTOR
__interrupt void Uart1TX_int (void)
{
	if ( sucTxBufLen > 0 )
	{
		TX_DATA(sucTxBuf[sucTxBufHead++]);
		if (sucTxBufHead >= UART_TX_BUF)
		{
			sucTxBufHead = 0;	
		}
		sucTxBufLen--;
		bSending = true;
	}
	else
	{
		bSending = false;	
	}
}



/*
 *函数性质:中断函数
 *入口:无
 *出口:无
 *功能:处理串行中断的接收程序
 */
 #pragma vector=USART1RX_VECTOR
__interrupt void Uart1RX_int (void)
{      
	uchar i;
	i = RX_DATA;
	
	if (sucRxBufLen < UART_RX_BUF)
	{
		sucRxBuf[sucRxBufTail++] = i;
	
	}
	else
	{	
		sucRxBufTail = 0;
	}
	sucRxBufLen++;	
	 data++;
} 



/*
 *函数性质:公共
 *入口:待发送的数据缓冲pData, 待发送的数据长度ucLen,
 *出口:发送成功标志,成功返回true,失败返回false
 *功能:向UART发送数据。
 */
bool WriteUart1Port(uchar *pData, uchar ucLen)
{
	if ((ucLen > (UART_TX_BUF - sucTxBufLen)) )		
	{
		return false;								//无更多空间装数据
	}
	while(ucLen--)
	{
		sucTxBuf[sucTxBufTail++] = *pData++;		//存入数据。
		sucTxBufLen++;						
		if (sucTxBufTail >= UART_TX_BUF)			
		{
			sucTxBufTail = 0;						//处理队列回绕				
		}	
	}
	if ( (!bSending) && sucTxBufLen)
	{
		sucTxBufLen--;
		TX_DATA(sucTxBuf[sucTxBufHead++]);			//发送数据。		
		if (sucTxBufHead >= UART_TX_BUF)
		{
			sucTxBufHead = 0;	
		}
		bSending = true;							//置位正在发送标志				
	}
	return true;		
}


/*
 *函数性质:公共
 *入口:需要的返回状态值如OK等
 *出口:MODEM返回的状态值,如OK BUSY等。
 *功能:检测MODEM返回的状态值。
 */
uchar ReadUart1Port(uchar *pData)
{
	uchar i;
	
	for (i = 0; i < sucRxBufLen; i++)
	{
		*pData++ = sucRxBuf[sucRxBufHead++];
		if (sucRxBufHead >= UART_RX_BUF)
		{
			sucRxBufHead = 0;	
		}
	}
	sucRxBufLen -= i;
	return *pData;
}





 /*
  *函数性质:公共
  *入口:波特率ucbpRate
  *出口:无
  *功能:以给定的波特率打开端口
  */
void Uart1PortIni(uchar ucbpRate)
{
	RS232Ini();
	SetCommBrate(ucbpRate);	
}
 /******************************************************************************************
* 函数名称    :wch_disp
* 功能描述    :向指定位置写入汉字和字符,(字库汉字和字符)
* 返回值      :无,x字节数,nbyte写入的汉字和字符个数
******************************************************************************************/
void wch_disp1(uint chn,uint x,uint nbyte)
{
   uchar i;
   wr_lcd(comm,0x30);  //一般功能
   wr_lcd(comm,x);  //显示起始位置,x坐标是自加的,注意显示地址
     for(i=0;i<(2*nbyte);i++)
        {
            wr_lcd(dat,chn ); //写数据
        }
}


⌨️ 快捷键说明

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