单片机外设 12864 等

先贴资料

这个是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();  这两个函数还是搞不清楚用法  

 

 

 





已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



posted on 2011-10-19 11:58  x小白  阅读(181)  评论(0编辑  收藏  举报

导航