先贴资料
这个是12864的串行传输方式 还有就是pdf的说明 里面有指令
串行的代码如下:
#include <REGx51.H>
//引脚定义
#define RS P2_0 //片选 高电平有效 单片LCD使用时可固定高电平 cs
#define SID P2_1 //数据 rw
#define SCLK P2_2 //时钟 e
#define PSB P2_3 //低电平时表示用串口驱动,可固定低电平
#define RESET P2_4 //LCD复位,LCD模块自带复位电路。可不接
void write(bit start, unsigned char ddata);
void sendbyte(unsigned char bbyte);
void delaynms(unsigned int di);
void lcdinit(void);
void lcdtest(void);
void lcdcls(void);
unsigned char code ma[] =
{ " 汉字显示LCD "};
unsigned char code ma2[]=
{ "自带字库图文混排"};
unsigned char code ma3[]=
{ "控制IC:ST7920 "};
unsigned char code ma4[]=
{ "功能强大使用方便"};
void lcdinit(void) //初始化LCD
{
delaynms(10); //启动等待,等LCM讲入工作状态
PSB = 0;
; //串口驱动模式
RESET = 0;
delaynms(1);
RESET = 1; // 复位LCD
RS = 1;
write(0, 0x30); //8 位介面,基本指令集
write(0, 0x0c); //显示打开,光标关,反白关
write(0, 0x01); //清屏,将DDRAM的地址计数器归零
}
void write(bit start, unsigned char ddata) //写指令或数据
{
unsigned char start_data, Hdata, Ldata;
if (start == 0)
start_data = 0xf8; //写指令
else
start_data = 0xfa; //写数据
Hdata = ddata & 0xf0; //取高四位
Ldata = (ddata << 4) & 0xf0; //取低四位
sendbyte(start_data); //发送起始信号
delaynms(5); //延时是必须的
sendbyte(Hdata); //发送高四位
delaynms(1); //延时是必须的
sendbyte(Ldata); //发送低四位
delaynms(1); //延时是必须的
}
void sendbyte(unsigned char bbyte) //发送一个字节
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SID = bbyte & 0x80; //取出最高位
SCLK = 1;
SCLK = 0;
bbyte <<= 1; //左移
}
}
void delaynms(unsigned int di) //延时
{
unsigned int da, db;
for (da = 0; da < di; da++)
for (db = 0; db < 10; db++)
;
}
void lcdtest(void) //图形方式下屏幕全黑
{
unsigned char i, j;
for (i = 0; i < 32; i++)
{
write(0, 0x80 + i);
write(0, 0x80);
for (j = 0; j < 16; j++)
write(1, 0xff);
}
for (i = 0; i < 32; i++)
{
write(0, 0x80 + i);
write(0, 0x88);
for (j = 0; j < 16; j++)
write(1, 0xff);
}
}
void lcdcls(void) //图形方式下清屏
{
unsigned char i, j;
for (i = 0; i < 32; i++)
{
write(0, 0x80 + i); //先是写x的坐标
write(0, 0x80); //y的坐标
for (j = 0; j < 16; j++) //这里为什么要写16次
write(1, 0x00);
}
for (i = 0; i < 32; i++)
{
write(0, 0x80 + i);
write(0, 0x88);
for (j = 0; j < 16; j++)
write(1, 0x00);
}
}
void main(void)
{
unsigned char i;
lcdinit();
while (1)
{
write(0, 0x80);
for (i = 0; i < 16; i++)
write(1, ma[i]);
write(0, 0x90);
for (i = 0; i < 16; i++)
write(1, ma2[i]);
write(0, 0x88);
for (i = 0; i < 16; i++)
write(1, ma3[i]);
write(0, 0x98);
for (i = 0; i < 16; i++)
write(1, ma4[i]);
write(0, 0x36); //图形方式
lcdtest();
lcdcls();
}
}
在串行和并行的 RS 用法是不一样的 。 并行RS是用于指明传输的是数据还是命令 而 串行是片选信号
这里面lcdtest(); lcdcls(); 这两个函数还是搞不清楚用法