Other Parts Discussed in Thread: MSP430G2553
#include <msp430g2553.h>
#define SENDCOMM 0XF8 //0XF1000
#define SENDDATA 0XFA //0XF1010
#define E_CLK_0 P1OUT &= ~BIT6
#define E_CLK_1 P1OUT |=BIT6
#define RW_SID_0 P1OUT &= ~BIT4
#define RW_SID_1 P1OUT |= BIT4
void LCD_send_byte(unsigned char a);
unsigned char LCD_read_byte(void);
void LCD_comm(unsigned char comm);
void LCD_setxy(unsigned char x,unsigned char y);
void LCD_WriteStr(unsigned char dis_addr_x,unsigned char dis_addr_y,char* str);
void LCD_init(void);
/*********************主函数************************/
void main() {
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
P1OUT = 0x00;
LCD_init();
LCD_WriteStr(3,1,"^_^");
LCD_WriteStr(3,2,"哟西~!!");
while(1);
}
/****************发送字节函数*****************/
void LCD_send_byte(unsigned char a) {
unsigned char i; for(i=8;i>0;i--) {
if(a&(0x01<<(i-1))) RW_SID_1; else
RW_SID_0;
_delay_cycles(100); E_CLK_1;
_delay_cycles(100); E_CLK_0;
_delay_cycles(100); } }
/****************读取字节函数*****************/
unsigned char LCD_read_byte(void) {
unsigned char i,dat=0; for(i=8;i>0;i--) {
E_CLK_1;
_delay_cycles(100); if(RW_SID_1)
dat|=(0x01<<(i-1)); E_CLK_0;
_delay_cycles(100); }
return dat; }
/****************写指令函数*****************/
void LCD_comm(unsigned char comm) {
unsigned char temp; _delay_cycles(100);
LCD_send_byte(SENDCOMM);
temp=comm&0XF0;
LCD_send_byte(temp);
temp=((comm&0X0F)<<4)&0XF0;
LCD_send_byte(temp);
_delay_cycles(100); }
/****************写数据函数*****************/ void LCD_data(unsigned char lcd_data) //写数据 {
unsigned char temp;
_delay_cycles(100);
LCD_send_byte(SENDDATA);
temp=lcd_data&0xf0;
LCD_send_byte(temp);
temp=(lcd_data&0X0F)<<4;
LCD_send_byte(temp);
_delay_cycles(100); }
/**************** 设置显示坐标函数*****************/
void LCD_setxy(unsigned char x,unsigned char y) //设置显示位置 X(1~16),Y(1~4)
{
switch(y) {
case 1:LCD_comm(0X7F+x); break;
case 2:LCD_comm(0X8F+x);
break;
case 3:LCD_comm(0X87+x); break;
case 4:LCD_comm(0X97+x); break; } }
/****************显示函数函数*****************/
void LCD_WriteStr(unsigned char dis_addr_x,unsigned char dis_addr_y,char* str)// 在指定位置显示字符串
{
unsigned char LCD_temp;
LCD_setxy(dis_addr_x,dis_addr_y);
LCD_temp=*str;
while(LCD_temp != 0x00)
{
LCD_data(LCD_temp); //LCD_WriteStr(1,1,"方向设定:正转");
LCD_temp=*(++str); } }
/****************LCD初始化函数*****************/ void LCD_init(void) {
_delay_cycles(500);;
LCD_comm(0x30);//一次送8位数据
LCD_comm(0x0C);//整体显示,游标off,游标位置off
LCD_comm(0x01);//清DDRAM
LCD_comm(0x02);//DDRAM地址归位
LCD_comm(0x80);//设定DDRAM 7位地址000,0000到地址计数器AC }