求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。

求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。,第1张

绝对好用的串口程序

sbit SID=P2^1; //12864数据

sbit SCLK=P2^2; //12864时钟

init()

{

write(0,0x30); //8 位介面,基本指令集

write(0,0x0c); //显示打开,光标关,反白关

write(0,0x01); //清屏,将DDRAM的地址计数器归零

delaynms(10);

write(0,0x80); for(i=0;i<16;i++) write(1,datas11[i]);

write(0,0x90); for(i=0;i<16;i++) write(1,datas2[i]);

write(0,0x88); for(i=0;i<16;i++) write(1,datas3[i]);

write(0,0x98); for(i=0;i<16;i++) write(1,datas4[i]);

}

/12864/

void delaynms(unsigned int di) //延时

{

unsigned int da,db;

for(da=0;da<di;da++)

for(db=0;db<10;db++);

}

void sendbyte(unsigned char bbyte) //发送一个字节

{

unsigned char i;

for(i=0;i<8;i++)

{

SID=bbyte&0x80; //取出最高位

SCLK=1;

SCLK=0;

bbyte<<=1; //左移

}

}

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 lcdinit(void) //初始化LCD

{

delaynms(10); //启动等待,等LCM讲入工作状态

//PSB=0; ; //串口驱动模式

// RESET=0; delaynms(1); RESET=1; // 复位LCD

// CS=1;

write(0,0x30); //8 位介面,基本指令集

write(0,0x0c); //显示打开,光标关,反白关

write(0,0x01); //清屏,将DDRAM的地址计数器归零

}/

//1062液晶双行显示

// bravey 1127

#include<reg52h>

#define uint unsigned int

#define uchar unsigned char

sbit en=P2^7; //这些管脚要看原理图的,或许我的单片机和你的不一样。

sbit rs=P2^6;

sbit rw=P2^5;

uchar code d1[]={填入你要现实的字的码值,用取模软件 };

uchar code d2[]={填入你要现实的字的码值,用取模软件 };

void delay(uint z)//延迟函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=0;y<110;y++);

}

void write_com(uchar com) //送地址函数定义

{

rs=0;

rw=0;

P0=com;

delay(5);

en=1;

delay(5);

en=0;

}

void write_datt(uchar datt) //送数据

{

rs=1;

rw=0;

P0=datt;

delay(5);

en=1;

delay(5);

en=0;

}

void lcd_init() //初始化

{

en=0;

write_com(0x0c);//整体显示,无光标,不反白

write_com(0x07);//地址指针加一设置,且整体左移

write_com(0x01);//清屏

}

void main()

{

uchar i;

lcd_init();

write_com(0x80);//地址指针初始化,第一行显示拼音名字

for(i=0;i<13;i++)

{

write_datt(d1[i]);

delay(20);

}

write_com(0x90);

for(i=0;i<9;i++)

{

write_datt(d1[i]);//高位

write_datt(d2[i]);//低位

delay(20);

}

while(1);

}

这是一个简单的12864显示字的程序。LZ可以参考参考

clk=0;clk=1;clk=0;这是一个完整的CLK时钟周期,看图SCLK。

延时并没有实际的意义,主要功能是让电平保持一段时间供识别的,一般微秒级的延时就够了。

同步时钟信号,就是前面讲的clk=0;clk=1;clk=0;这样来实现的,只不过程序中是用的循环,8次循环,正好是可以传输8bit的数据。

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit CS=P2^5; //片选信号

sbit SID=P2^6; //数据信号

sbit SCLK=P2^7; //时钟信号

sbit RST=P2^2; //复位信号

sbit CH = P2^4; //并行、串行选择信号

/

名称 : delay()

功能 : 延时,延时时间为 100us t。这是通过软件延时,有一定误差。

输入 : t

输出 : 无

/

void delay(unsigned int t)

{

unsigned int i,j;

for(i=0; i<t; i++)

for(j=0; j<10; j++);

}

/

名称 : sendbyte()

功能 : 按照液晶的串口通信协议,发送数据

输入 : zdata

输出 : 无

/

void sendbyte(unsigned char zdata)

{

unsigned int i;

for(i=0; i<8; i++)

{

if((zdata << i) & 0x80)

{

SID = 1;

}

else

{

SID = 0;

}

SCLK = 0;

SCLK = 1;

}

}

/

名称 : write_com()

功能 : 写串口指令

输入 : cmdcode

输出 : 无

/

void write_com(unsigned char cmdcode)

{

CS = 1;

sendbyte(0xf8);

sendbyte(cmdcode & 0xf0);

sendbyte((cmdcode << 4) & 0xf0);

delay(2);

}

/

名称 : write_data()

功能 : 写串口指令

输入 : cmdcode

输出 : 无

/

void write_data(unsigned char Dispdata)

{

CS = 1;

sendbyte(0xfa);

sendbyte(Dispdata & 0xf0);

sendbyte((Dispdata << 4) & 0xf0);

delay(2);

}

/

名称 : lcdinit()

功能 : 初始化函数

输入 : cmdcode

输出 : 无

/

void lcdinit()

{

RST = 0;

delay(100);

RST = 1;

delay(20000);

write_com(0x30);

delay(50);

write_com(0x0c);

delay(50);

}

/

名称 : hzkdis()

功能 : 显示字符串

输入 : s

输出 : 无

/

void hzkdis(unsigned char code s)

{

while(s > 0)

{

write_data(s);

s++;

delay(50);

}

}

/

名称 : Test()

功能 : 显示子函数

输入 : 无

输出 : 无

/

void Test()

{

write_com(0x03);

delay(50);

write_com(0x81);

hzkdis(" HOT-51");

write_com(0x91);

hzkdis("单片机开发板");

write_com(0x89);

hzkdis(" ");

write_com(0x98);

hzkdis(" 东流电子");

}

/

名称 : Main()

功能 : 主函数

输入 : 无

输出 : 无

/

void Main()

{

CH = 0;

delay(1);

lcdinit();

delay(10);

while(1)

{

Test();

delay(5000);

}

}

问题有多种,一、对比度是否调好

(即是否有硬件问题)

二、void

WriteData(uchar

Data)

{

EN=0;/使能端/

RS=1;/根据时序图拉低,选择写指令/

RW=0;/根据时序图拉低,选择写模式/

P0=Data;/命令数据准备/

delay(0);

;;;;;;;;;;;;

此处延时(省略判忙)

EN=1;/使能端跳变/

EN=0;/使能端再次跳变/

}

三、确认你的初始化没有问题

四、你的模块是否带字库

五、

我推测你这个程序最可能出现的问题v

void

display(uchar

show[])

{

delay(1);

WriteData();

}

此处未写任何数据

如有不明白Q

451526010

以上就是关于求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。全部的内容,包括:求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。、求一个12864的测试程序。单片机是89C52RC型号的,显示屏是FM-12864M-12L型号的。、51单片机控制12864液晶屏串行通信时序图与程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9658020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存