历史上的今天
今天是:2025年02月22日(星期六)
2020年02月22日 | MSP430G2553操作LCD12864(并行/串行)
2020-02-22 来源:eefocus
1.MSP430驱动LCD12864
MSP430驱动12864有两种方式,
一种是并口驱动,优点是数据传输特别快,缺点是占用单片机资源太多.
一种是串口驱动,优点是只需要占用单片机两个引脚,缺点是相对于并口传输慢了许多.
2.LCD12864引脚
从上往下依次为
GND(接地),
VCC(接3.3V!!!一定要3.3V),
V0(偏压,接滑动变阻器或电位器再接5V),
RS(CS)(并口写0为命令传输,写1为数据传输)(串口为片选,接VCC即可),
R/W(SID)(并口写0为写操作,写1为读操作)(串口为数据位),
E(SCLK)(并口为使能端口)(串口为时钟端口),
DB0---->DB7(并口数据位)(串口空接),
PSB(写0为串口模式,写1为并口模式),
NC(悬空),
RST(复位端口)(低电平有效),
VOUT(12864内建的负压输出),(通常与VDD VO VEE(VOUT)一并接个10k或20k的可调电阻)(悬空),
BLA(背光灯+5V接入),
BLK(背光灯GND接入).
3.初始化流程
开电源->
功能设定0x30->
功能设定0x30->
显示开关0x0C->
清除屏幕0x01->
进入设定点0x06
4.并口驱动12864
(1).引脚接入

(2).时序
1).命令写:
EN=0;/*上升沿有效,先初始化为低电平*/
RS=0;/*低电平为命令*/
RW=0;/*低电平为写*/
EN=1;
P1OUT=COM/*命令直接写入*/
2).数据写:
EN=0;/*上升沿有效,先初始化为低电平*/
RS=1;/*高电平为数据*/
RW=0;/*低电平为写,高电平为读*/
EN=1;
P1OUT=Data/*数据直接写入*/
(3).代码书写
#include "LCD12864.h"
#define RS_Low P2OUT&=~BIT0
#define RS_High P2OUT|=BIT0
#define RW_Low P2OUT&=~BIT1
#define RW_High P2OUT|=BIT1
#define EN_Low P2OUT&=~BIT2
#define EN_High P2OUT|=BIT2
void PortInit(void)
{
/*初始化引脚*/
P1SEL=0x00;
P1DIR=0xFF;
P2SEL=0x00;
P2DIR=0xFF;
}
void LCD12864_Write_Com(unsigned char com)
{
/*写命令操作,参数com为命令*/
EN_Low;
RS_Low;
RW_Low;
delay_us(10);
EN_High;
delay_us(10);
P1OUT=com;
delay_us(10);
EN_Low;
delay_us(10);
}
void LCD12864_Write_Data(unsigned char data)
{
/*写数据操作,参数data为数据*/
EN_Low;
RS_High;
RW_Low;
delay_us(10);
EN_High;
delay_us(10);
P1OUT=data;
delay_us(10);
EN_Low;
delay_us(10);
}
void LCD12864_Init(void)
{
/*通过指令初始化LCD12864*/
LCD12864_Write_Com(0x30);
LCD12864_Write_Com(0x02);
LCD12864_Write_Com(0x0C);/**/
LCD12864_Write_Com(0x01);/*清除显示*/
LCD12864_Write_Com(0x06);
}
void LCD12864_Write_Line(unsigned char y,unsigned char x)
{
/*选择字符显示位置*/
switch(y)
{
case 1:
LCD12864_Write_Com(0x80+x);
break;
case 2:
LCD12864_Write_Com(0x90+x);
break;
case 3:
LCD12864_Write_Com(0x88+x);
break;
case 4:
LCD12864_Write_Com(0x98+x);
break;
}
}
void LCD12864_Write_Str(unsigned char *str)
{
/*字符写入显示*/
while(*str)
{
LCD12864_Write_Data(*str);
str++;
}
}
5.串口驱动12864
(1).引脚接入

(2).时序
CS持续保持高电平.
1).写入字节:
首先SCLK=0;(上升沿有效,初始化为低电平).
将要写入的8位数据与0x80进行&运算(也就是最高位10000000),
若是1则SID=1,否则SID=0;
SCLK=1;
2).写入命令
先发送11111 RW RS 0,
发送命令则是11111000,
再发送 DB7 DB6 DB5 DB4 0000,
再发送 DB3 DB2 DB1 DB0 0000.
3).写入数据
先发送11111 RW RS 0,
发送命令则是11111010,
再发送 DB7 DB6 DB5 DB4 0000,
再发送 DB3 DB2 DB1 DB0 0000.
(3).代码书写
#include "LCD12864.h"
#define rw_h P1OUT |= BIT0
#define rw_l P1OUT &= ~BIT0
#define en_h P1OUT |= BIT1
#define en_l P1OUT &= ~BIT1
void PortConfig(void)
{
/*引脚初始化*/
P1DIR = 0xFF;
P1SEL = 0x00;
}
uint Strlen(uchar *p)
{
/*返回字符串长度*/
uint i;
for(i=0;*(p+i);i++);
return i;
}
void WriteBytes(uchar byte)
{
/*写入字节*/
for (unsigned char i = 0; i < 8; i++)
{
en_l;
if (byte & 0x80)
{
rw_h;
}
else
{
rw_l;
}
en_h;
delay(1);
byte <<= 1;
}
}
void SerialWriteData(uchar send)
{
/*依据时序写入数据*/
WriteBytes(0xfa); //1111 1010向液晶写数据
WriteBytes(send & 0xf0); //取高4位
WriteBytes((send << 4) & 0xf0); //取低4位
}
void SerialWriteCmd(uchar send)
{
/*依据时序写入命令*/
WriteBytes(0xf8); //1111 1000向液晶写数据
WriteBytes(send & 0xf0); //取高4位
WriteBytes((send << 4) & 0xf0); //取低4位
}
void init_lcd()
{
SerialWriteCmd(0x30);
SerialWriteCmd(0x30);
SerialWriteCmd(0x02);
史海拾趣
|
我用PB定制了wince后,在最后编译的时候提示:first-chance exception in gwes.exe (0xc0000005:access violation) 就是不能出来wince界面,只出来一个黑框,没有我的电脑,回收站等 请问这是什么原因呢?… 查看全部问答> |
|
出问题的代码如下: #pragma memory = dataseg(DATA16_N) float fa; ... 我的本意是想把变量定义在非易失RAM中(0x200~5ff),在编译后,从第二句开始就提示如下警告信息: Warning[Be008]: a #pragma dataseg is active but is not applica××e to ...… 查看全部问答> |
|
您还在为pdg文件打不开而发愁吗?pdg转pdf工具帮您解决 很多时候我们都要下载一些电子资料,有许多是pdg格式的资料,这种格式的资料不仅需要专门的软件进行查阅,而且看起来很不方便。我给大家推荐的这个工具就可以帮大家解决很多问题。它不仅能将pdg文件转换为图像文件,还能将图像文件转换为pdf格式的 ...… 查看全部问答> |




