#include"msp430g2553.h"
#define CPU_F ((double)1000000)//主时钟的频率1MHz
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))//__delay_cycles()延时函数为系统自带库函数
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//频率是物体1秒钟时间内震动的次数
//频率为1MHz就是说,1秒的时间内震动1000 000次
//也就是说要想得到1秒的延时,必须震动100 000次
//要想得到1ms的延时震动1000次
//要想得到1us的延时震动1次
//在MSP430中计一个数,需要时钟震动一次,上面的延时函数就是这样实现的
#define uchar unsigned char
#define uint unsigned int
#define RS_HIGN P2OUT|=BIT0 //P2.0-rs
#define RS_LOW P2OUT&=~BIT0
#define RW_HIGN P2OUT|=BIT1 //P2.1-rw
#define RW_LOW P2OUT&=~BIT1
#define E_HIGH P2OUT|=BIT2 //P2.2-e
#define E_LOW P2OUT&=~BIT2
//注意:接线时,1602的Vo引脚要接可调电阻或者直接接地
//不然对比度太低,看不到显示的字符
void write_com(uchar com) //写指令函数
{
RS_LOW;
RW_LOW;
P1OUT=com;
delay_ms(5);
E_HIGH;
delay_ms(5);
E_LOW;
}
void write_data(uchar data) //写数据函数
{
RS_HIGN;
RW_LOW;
P1OUT=data;
delay_ms(5);
E_HIGH;
delay_ms(5);
E_LOW;
}
void Init_lcd(void)
{
write_com(0x38);//设置8位格式,2行,5x7
delay_ms(5);
write_com(0x0c);//整体显示,关光标,不闪烁
delay_ms(5);
write_com(0x06);//设定输入方式,增量不移位
delay_ms(5);
write_com(0x01);//清除屏幕显示
delay_ms(5);
}
void display_xy(unsigned char x,unsigned char y)
{
if(y==0x01)
{
x = x+0x80; }
else
{
x = x+0xC0; //数据指针设置 80H+地址码 (0-27H,40H-67H)
}
write_com(x);
}
void Disp1Char(uchar x,uchar y,uchar data)
{
display_xy(x,y);
write_data(data); ////输出数据
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
//系统默认主时钟MCLK为1MHz左右,这里使用校正数据进行校正
//也可以不进行校正,为了得到精确一点的延时,建议进行校正
DCOCTL = CALDCO_1MHZ;
BCSCTL1 = CALBC1_1MHZ;
P1DIR=0XFF;
P2DIR=0xFF;
Init_lcd();
Disp1Char(0,1,'A');
Disp1Char(1,1,'B');
Disp1Char(2,1,'C');
Disp1Char(3,1,'D');
Disp1Char(4,1,'E');
Disp1Char(5,1,'F');
Disp1Char(6,1,'G');
while(1)
{
}
}