標(biāo)題: msp430g2553的串口發(fā)送程序 [打印本頁]
作者: smiling07626 時間: 2017-2-16 17:03
標(biāo)題: msp430g2553的串口發(fā)送程序
#include <msp430g2553.h>
#include <intrinsics.h>
#include <msp430.h>
#define uint unsigned int
#define LCD_EN_PORT P1OUT //以下2個要設(shè)為同一個口
#define LCD_EN_DDR P1DIR
#define LCD_RS_PORT P1OUT //以下2個要設(shè)為同一個口
#define LCD_RS_DDR P1DIR
#define LCD_DATA_PORT P2OUT //以下3個要設(shè)為同一個口
#define LCD_DATA_DDR P2DIR //一定要用高4位
#define LCD_RS BIT6
#define LCD_EN BIT7
#define LCD_DATA BIT7|BIT6|BIT5|BIT4 //4位數(shù)據(jù)線連接模式
void LCD_init(void);
void LCD_init_first(void);
void LCD_en_write1(void); //上升沿使能
void LCD_en_write2(void); //下降沿使能
void LCD_write_command(unsigned charcommand);
void LCD_write_data(unsigned char data);
void LCD_set_xy (unsigned char x, unsignedchar y);
void LCD_write_string(unsigned charX,unsigned char Y, unsigned char s);
void LCD_write_char(unsigned charX,unsigned char Y, unsigned char data);
void delay_1ms(void);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
unsigned char rev;
void putchar(unsigned char c) //發(fā)送字符函數(shù)
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? 等待TX buffer為空
UCA0TXBUF = c; // TX ->RXed character 發(fā)送字符c
}
void putstr(char *s) //發(fā)送字符串函數(shù)
{
IE2 &= ~UCA0RXIE; //發(fā)送時先關(guān)閉接收中斷,不接收
while((*s)!='\0') //如果沒有發(fā)完,就繼續(xù)循環(huán)發(fā)送
{
putchar(*s);
putchar('\n'); //發(fā)送換行符
s++;
}
IE2 |= UCA0RXIE; //發(fā)送完了打開接收中斷
}
void Init_USTAR(void)
{
BCSCTL1 =CALBC1_1MHZ; // Set DCO為1MHz
DCOCTL =CALDCO_1MHZ;
P1SEL = BIT1 + BIT2; // P1.1 =RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2; //第二外圍模式選擇
UCA0CTL1 |= UCSSEL_2; // SMCLK 其他默認(rèn):軟件復(fù)位使能 USCI邏輯保持在復(fù)位狀態(tài),用于設(shè)置串口
UCA0BR0 = 8; // SMCLK1MHz 115200 8
UCA0BR1 = 0; // 1MHz115200
UCA0MCTL = UCBRS2 + UCBRS0;
UCA0CTL1 &= ~UCSWRST;
IE2|= UCA0RXIE; // 接收中斷使能
}
void main()//主函數(shù)
{
WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門狗
LCD_init_first();
LCD_init();
Init_USTAR();
_BIS_SR(LPM3_bits+GIE); // Enter LPM0, interrupts enabled
}
// LCD液晶操作函數(shù)
void LCD_init_first(void) //LCD1602液晶初始化函數(shù)(熱啟動)
{
delay_nms(500);
LCD_DATA_DDR|=LCD_DATA; //數(shù)據(jù)口方向?yàn)檩敵?/font>
LCD_EN_DDR|=LCD_EN; //設(shè)置EN方向?yàn)檩敵?/font>
LCD_RS_DDR|=LCD_RS; //設(shè)置RS方向?yàn)檩敵?/font>
delay_nms(50);
LCD_write_command(0x30);
delay_nms(50);
LCD_write_command(0x30);
delay_nms(5);
LCD_write_command(0x30);
delay_nms(500);
}
//LCD1602液晶初始化函數(shù)
void LCD_init(void)
{
delay_nms(500);
LCD_DATA_DDR|=LCD_DATA; //數(shù)據(jù)口方向?yàn)檩敵?/font>
LCD_EN_DDR|=LCD_EN; //設(shè)置EN方向?yàn)檩敵?/font>
LCD_RS_DDR|=LCD_RS; //設(shè)置RS方向?yàn)檩敵?/font>
delay_nms(500);
LCD_write_command(0x28); //4位數(shù)據(jù)接口
delay_nms(50);
LCD_write_command(0x28); //4位數(shù)據(jù)接口
delay_nms(50);
LCD_write_command(0x28); //4位數(shù)據(jù)接口
delay_nms(50);
LCD_en_write2();
delay_nms(50);
LCD_write_command(0x28); //4位數(shù)據(jù)接口
delay_nms(500);
LCD_write_command(0x01); //清屏
LCD_write_command(0x0c); //顯示開,關(guān)光標(biāo),不閃爍
LCD_write_command(0x06); //設(shè)定輸入方式,增量不移位
delay_nms(50);
}
//液晶使能上升沿
void LCD_en_write1(void)
{
LCD_EN_PORT&=~LCD_EN;
delay_nus(10);
LCD_EN_PORT|=LCD_EN;
}
//液晶使能下降沿
void LCD_en_write2(void)
{
LCD_EN_PORT|=LCD_EN;
delay_nus(10);
LCD_EN_PORT&=~LCD_EN;
}
//寫指令函數(shù)
void LCD_write_command(unsigned charcommand)
{
delay_nus(16);
P2SEL=0x00;
LCD_RS_PORT&=~LCD_RS; //RS=0
LCD_en_write1();
LCD_DATA_PORT&=0X0f; //清高四位
LCD_DATA_PORT|=command&0xf0; //寫高四位
delay_nus(16);
LCD_en_write2();
command=command<<4; //低四位移到高四位
LCD_en_write1();
LCD_DATA_PORT&=0x0f; //清高四位
LCD_DATA_PORT|=command&0xf0; //寫低四位
LCD_en_write2();
}
//寫數(shù)據(jù)函數(shù)
void LCD_write_data(unsigned char data)
{
delay_nus(16);
P2SEL=0x00;
LCD_RS_PORT|=LCD_RS; //RS=1
LCD_en_write1(); //E上升沿
LCD_DATA_PORT&=0X0f; //清高四位
LCD_DATA_PORT|=data&0xf0; //寫高四位
delay_nus(16);
LCD_en_write2();
data=data<<4; //低四位移到高四位
LCD_en_write1();
LCD_DATA_PORT&=0X0f; //清高四位
LCD_DATA_PORT|=data&0xf0; //寫低四位
LCD_en_write2();
}
//寫地址函數(shù)
void LCD_set_xy( unsigned char x, unsignedchar y )
{
unsigned char address;
if (y == 0) address = 0x80 + x;
else address = 0xc0 + x;
LCD_write_command( address);
}
//LCD在任意位置寫字符串,列x=0~15,行y=0,1
void LCD_write_string(unsigned charX,unsigned char Y,unsigned char s)
{
LCD_set_xy( X, Y ); //寫地址
LCD_write_data( s );
}
//LCD在任意位置寫字符,列x=0~15,行y=0,1
void LCD_write_char(unsigned charX,unsigned char Y,unsigned char data)
{
LCD_set_xy( X, Y ); //寫地址
LCD_write_data( data);
}
//1us延時函數(shù)
void delay_1us(void)
{
asm("nop");
}
//N us延時函數(shù)
void delay_nus(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay_1us();
}
//1ms延時函數(shù)
void delay_1ms(void)
{
unsigned int i;
for (i=0;i<1140;i++);
}
//N ms延時函數(shù)
void delay_nms(unsigned int n)
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? 等待TX buffer為空
UCA0TXBUF = UCA0RXBUF; //TX -> RXed character 發(fā)送接收到是數(shù)據(jù)
rev=UCA0RXBUF;
putchar(rev);
LCD_write_string(0,0,rev);
delay_nms(10);
}
作者: shuibo 時間: 2017-2-17 20:28
學(xué)習(xí)了
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |