#include <msp430g2553.h> #include <intrinsics.h> #include <msp430.h> #define uint unsigned int #define LCD_EN_PORT P1OUT //以下2個要設為同一個口 #define LCD_EN_DDR P1DIR #define LCD_RS_PORT P1OUT //以下2個要設為同一個口 #define LCD_RS_DDR P1DIR #define LCD_DATA_PORT P2OUT //以下3個要設為同一個口 #define LCD_DATA_DDR P2DIR //一定要用高4位 #define LCD_RS BIT6 #define LCD_EN BIT7 #define LCD_DATA BIT7|BIT6|BIT5|BIT4 //4位數據線連接模式 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) //發送字符函數 { while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? 等待TX buffer為空 UCA0TXBUF = c; // TX ->RXed character 發送字符c } void putstr(char *s) //發送字符串函數 { IE2 &= ~UCA0RXIE; //發送時先關閉接收中斷,不接收 while((*s)!='\0') //如果沒有發完,就繼續循環發送 { putchar(*s); putchar('\n'); //發送換行符 s++; } IE2 |= UCA0RXIE; //發送完了打開接收中斷 } 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 其他默認:軟件復位使能 USCI邏輯保持在復位狀態,用于設置串口 UCA0BR0 = 8; // SMCLK1MHz 115200 8 UCA0BR1 = 0; // 1MHz115200 UCA0MCTL = UCBRS2 + UCBRS0; UCA0CTL1 &= ~UCSWRST; IE2|= UCA0RXIE; // 接收中斷使能 } void main()//主函數 { WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗 LCD_init_first(); LCD_init(); Init_USTAR(); _BIS_SR(LPM3_bits+GIE); // Enter LPM0, interrupts enabled } // LCD液晶操作函數 void LCD_init_first(void) //LCD1602液晶初始化函數(熱啟動) { delay_nms(500); LCD_DATA_DDR|=LCD_DATA; //數據口方向為輸出 LCD_EN_DDR|=LCD_EN; //設置EN方向為輸出 LCD_RS_DDR|=LCD_RS; //設置RS方向為輸出 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液晶初始化函數 void LCD_init(void) { delay_nms(500); LCD_DATA_DDR|=LCD_DATA; //數據口方向為輸出 LCD_EN_DDR|=LCD_EN; //設置EN方向為輸出 LCD_RS_DDR|=LCD_RS; //設置RS方向為輸出 delay_nms(500); LCD_write_command(0x28); //4位數據接口 delay_nms(50); LCD_write_command(0x28); //4位數據接口 delay_nms(50); LCD_write_command(0x28); //4位數據接口 delay_nms(50); LCD_en_write2(); delay_nms(50); LCD_write_command(0x28); //4位數據接口 delay_nms(500); LCD_write_command(0x01); //清屏 LCD_write_command(0x0c); //顯示開,關光標,不閃爍 LCD_write_command(0x06); //設定輸入方式,增量不移位 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; } //寫指令函數 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(); } //寫數據函數 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(); } //寫地址函數 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延時函數 void delay_1us(void) { asm("nop"); } //N us延時函數 void delay_nus(unsigned int n) { unsigned int i; for(i=0;i<n;i++) delay_1us(); } //1ms延時函數 void delay_1ms(void) { unsigned int i; for (i=0;i<1140;i++); } //N ms延時函數 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 發送接收到是數據 rev=UCA0RXBUF; putchar(rev); LCD_write_string(0,0,rev); delay_nms(10); }
|