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液晶屏串行通信时序图与程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)