📄 uart1.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 + -