//12864液晶串行显示测试程序
//P1.4模拟SID(接第5脚),P1.5模拟SCLK(接第6脚)
//4脚(CS信号)接高电平选通,15脚(PSB信号)接地选择串行方式
//17脚(RST信号)根据注释提示悬空
#include <MSP430g2231.h>
void int_port(void) //管脚初始化
{
P1SEL&=~BIT4; //P1.4模拟SID,设置为i/o口输出方向
P1DIR|=BIT4;
P1OUT&=~BIT4;
P1SEL&=~BIT5; //P1.5模拟SCLK,设置为i/o口输出方向
P1DIR|=BIT5;
P1OUT&=~BIT5;
}
void delay(unsigned int t) //延时函数
{ //粗略延时,满足时序要求
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
void sendbyte(unsigned char zdata) //数据传送函数
{
unsigned char code_seg7;
unsigned char serial_clk;
unsigned char serial_shift;
code_seg7=zdata;
serial_shift=0x80;
for(serial_clk=0; serial_clk<8; serial_clk++)
{
if(code_seg7&serial_shift)
{
P1OUT|=BIT4; //SID为1
}
else
{
P1OUT&=~BIT4; //SID为0
}
P1OUT&=~BIT5; //产生时钟信号下沿
P1OUT|=BIT5; //产生时钟信号上沿
serial_shift=serial_shift>>1; //准备发送下一位数据
}
}
void write_com(unsigned char cmdcode) //写命令函数
{ //串口控制格式(11111AB0)
//A数据方向控制,A=H时读,A=L时写
//B数据类型选择,B=H时为显示数据,B=L时为命令
sendbyte(0xf8); //MCU向LCD发命令
sendbyte(cmdcode & 0xf0); //发高四位数据(数据格式D7D6D5D4_0000)
sendbyte((cmdcode << 4) & 0xf0);//发低四位数据(数据格式D3D2D1D0_0000)
delay(2); //延时等待
}
void write_data(unsigned char Dispdata)//写数据函数
{
sendbyte(0xfa); //MCU向LCD发数据
sendbyte(Dispdata & 0xf0); //发高四位数据
sendbyte((Dispdata << 4) & 0xf0);//发低四位数据
delay(2);
}
void lcdinit() //LCD初始化
{
delay(20000); //复位等待(内部自带上电复位电路),时间较长
write_com(0x30); //功能设定:基本指令集操作
delay(50); //延时等待
write_com(0x0c); //整体显示,关游标
delay(50);
}
void print_string(unsigned char *s) //发送字符串
{
while(*s > 0) //C语言里字符串末尾自动加“\0”(ASCII码值为0)
{
write_data(*s); //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址
s++;
delay(50);
}
}
void Test()
{ unsigned char dat1,dat2,dat3,dat4;
dat1=1;dat2=2;dat3=3;dat4=4;
write_com(0x03); //发指令,地址归位
delay(50); //延时
write_com(0x80); //第一行首地址0x80
print_string("德州仪器MSP430 "); //第一行显示(必须加一个空格否则不能下载)
write_com(0x94); //第二行首地址0x90,从第四个开始显示
write_data(dat1+0x30); //发送dat1的ASCII码,显示dat1的值
write_data(dat2+0x30); //发送dat1的ASCII码,显示dat2的值
write_data(dat3+0x30); //发送dat1的ASCII码,显示dat3的值
write_data(dat4+0x30); //发送dat1的ASCII码,显示dat4的值
write_data('H'); //发送H的ASCII码,显示H
write_data('z'); //发送z的ASCII码,显示z
write_com(0x90);
print_string("频率: ");
delay(500); //较长时间延时,保证下次操作前LCD完成上述功能处于非忙状态
}
void main()
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
int_port(); //端口初始化
lcdinit(); //LCD初始化
Test(); //测试
while(1); //CPU空转
}