/*************************************************************************
12864液晶串行显示测试程序
LCD型号:FYD12864-0402C
P2.4模拟SID(接第5脚),P2.5模拟SCLK(接第6脚)
4脚(CS信号)接高电平选通,15脚(PSB信号)接地选择串行方式->和GND焊盘相接
17脚(RST信号)根据注释提示悬空
*************************************************************************/
#include <MSP430g2553.h>
#define uchar unsigned char
#define uint unsigned int
const unsigned char code[]={"你好世界你好世界"};
void int_port(void) //管脚初始化
{
P2SEL&=~BIT4; //P2.4模拟SID,设置为i/o口输出方向
P2DIR|=BIT4;
P2OUT&=~BIT4;
P2SEL&=~BIT5; //P2.5模拟SCLK,设置为i/o口输出方向
P2DIR|=BIT5;
P2OUT&=~BIT5;
}
/********************************************************************
* 名称 : delay()
*
* 输入 : t
* 输出 : 无
***********************************************************************/
void delay(uint t) //延时函数
{ //粗略延时,满足时序要求
uint i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口
通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(uchar zdata) //数据传送函数
{
uchar code_seg7;
uchar serial_clk;
uchar serial_shift;
code_seg7=zdata;
serial_shift=0x80;
for(serial_clk=0; serial_clk<8; serial_clk++)
{
if(code_seg7&serial_shift)
{
P2OUT|=BIT4; //SID为1
}
else
{
P2OUT&=~BIT4; //SID为0
}
P2OUT&=~BIT5; //产生时钟信号下沿
P2OUT|=BIT5; //产生时钟信号上沿
serial_shift=serial_shift>>1; //准备发送下一位数据
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
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); //延时等待
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口数据
* 输入 : Dispdata
* 输出 : 无
***********************************************************************/
void write_data(uchar Dispdata)//写数据函数
{
sendbyte(0xfa); //MCU向LCD发数据
sendbyte(Dispdata & 0xf0); //发高四位数据
sendbyte((Dispdata << 4) & 0xf0);//发低四位数据
delay(2);
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void lcdinit() //LCD初始化
{
delay(20000); //复位等待(内部自带上电复位
电路),时间较长
write_com(0x30); //功能设定:基本指令集操作
delay(50); //延时等待
write_com(0x0c); //整体显示,关游标
delay(50);
write_com(0x01); //清屏
delay(50);
write_com(0x06); //入口设置
delay(50);
}
/********************************************************************
* 名称 : print_string()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/
void print_string() //发送字符串
{
uchar i;
i=0;
while(code[i]!=' ') //C语言里字符串末尾自动加“ ”(ASCII码值为0)
{
write_data(code[i++]); //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址
delay(50);
}
}
/********************************************************************
* 函数名称 : LCD_12864_address_set( uchar x, y )
* 函数功能 : 12864地址坐标设置
* 函数参数 : X坐标,Y坐标
* 函数返回值: 无
*********************************************************************/
void LCD_12864_address_set( uchar x,uchar y )
{
uchar Address ;
switch( y )
{
case 1 : Address = 0x80 + (x - 1); break;
case 2 : Address = 0x90 + (x - 1); break;
case 3 : Address = 0x88 + (x - 1); break;
case 4 : Address = 0x98 + (x - 1); break;
default : break;
}
write_com(Address);
}
int main()
{
WDTCTL=WDTPW+WDTHOLD;
int_port();
lcdinit();
while(1)
{
LCD_12864_address_set(1,1);
print_string();
delay(1000);
}
}
一周热门 更多>