之前做51的时候,点亮1602觉得很简单,玩过德飞莱的板子,今天第一次拿到MSP430F5529,手里头只有几根杜邦线和一块1602,想着把它点亮,数据口用的P3,RS、 RW、 EN这三根线分别是P1.3 P1.4 P1.5. 废话不多说,代码如下:
#include <msp430.h>
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define DataDir P3DIR
#define DataPort P3OUT
//#define Busy 0x80
//#define CtrlDir P1DIR
#define RS_CLR P1OUT&=~BIT3; //RS = P1.3
#define RS_SET P1OUT|=BIT3;
#define RW_CLR P1OUT&=~BIT4; //RW = P1.4
#define RW_SET P1OUT|=BIT4;
#define EN_CLR P1OUT&=~BIT5; //EN = P1.5
#define EN_SET P1OUT|=BIT5;
/*------------------------------------------------
判忙函数
------------------------------------------------*/
int LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
delay_ms(5);
EN_SET;
return (DataPort & 0x80);
}
void Port_init()
{
P1DIR |= BIT3+BIT4+BIT5;
DataDir = 0xFF;
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
// while(LCD_Check_Busy()); //忙则等待
delay_ms(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
delay_ms(5);
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data) //ok
{
//while(LCD_Check_Busy()); //忙则等待
delay_ms(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
delay_ms(5);
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
delay_ms(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) //ok
{
if (y == 0)
{
LCD_Write_Com(0x80 + x); //表示第一行
}
else
{
LCD_Write_Com(0xC0 + x); //表示第二行
}
while (*s)
{
LCD_Write_Data( *s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) //OK
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data(Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
void LCD_Init(void) //ok
{
LCD_Write_Com(0x38); /*显示模式设置*/
delay_ms(5);
LCD_Write_Com(0x38);
delay_ms(5);
LCD_Write_Com(0x38);
delay_ms(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
delay_ms(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
Port_init();
delay_ms(10);
LCD_Init();
LCD_Clear();//清屏
while (1)
{
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
LCD_Write_String(0,1,"make it possible");
while(1);
}
}
//end
初始化那段也是按照1602的手册来的,有点啰嗦,本来想加个判忙,后面懒得再去弄了,感兴趣的可以直接调用了
希望可以对大家有点用
说实话,1602用的没那么多了,回头有空了再写个OLED的