12864串行显示驱动程序(msp430单片机)

2019-07-15 15:47发布


/*************************************************************************
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);
  }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
呗呗√
1楼-- · 2019-07-15 21:44
好的好的好的好的谢谢
brisyramshere
2楼-- · 2019-07-16 01:35
能运行,,谢谢楼主,我亮了
Dream_stop
3楼-- · 2019-07-16 03:51
brisyramshere 发表于 2014-7-9 18:53
能运行,,谢谢楼主,我亮了

亲,想问一下管教你是怎么分布的呢?看不懂啊
liu1032042013
4楼-- · 2019-07-16 05:55
 精彩回答 2  元偷偷看……
brisyramshere
5楼-- · 2019-07-16 08:44
Dream_stop 发表于 2014-7-16 14:59
亲,想问一下管教你是怎么分布的呢?看不懂啊

P2.4接第5脚RW,P2.5接第6脚EN
4脚RS接正电源,15脚(PSB信号)接地选择串行方式->和GND焊盘相接(商家卖的12864分串行和并行,背后的0欧姆的电阻决定的,把0欧姆电阻去掉,然后PSB接GND也是串行方式)
17脚(RST信号)根据注释提示悬空,不接就行其他电源、地、VO的正常接就行
xyanggrubby
6楼-- · 2019-07-16 09:45
用作LCD测试程序很好

一周热门 更多>