51单片机控制12864液晶屏串行通信时序图与程序

51单片机控制12864液晶屏串行通信时序图与程序,第1张

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

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

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

12864的图形输入啊,这个我前段时间写贪吃蛇的时候研究过。一句话,就是液晶工作于扩充指令集(图形显示)的时候,往图形缓冲GDRAM里写数据,然后开显示即可。我这儿有个自己已经写现成的液晶驱动,但是没有时间去优化,能实现点级点亮与熄灭以及横竖直线的画线,但是任意直线的算法我没有写,因为本身做贪吃蛇不需要那个功能。你要的话我可以给你看看。

#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);

}

}

当有按键按下时 停止1302 然后更改寄存器数值,再接着读取寄存器数值显示,然后开启1302就好了,这些 *** 作都得放到键盘扫描中,设置一个标志,当有按键按下是停止主函数中的大循环

void key_scan()

{

P31=0;//将232的键盘引脚设为0 将跳线变

if(P04==0)

{ send_com(0x0f);

jianpanF=1;

delay(5); //去斗

if(P04==0)

{

while(P04==0); //等待按键松开再加一

sj_para++;

send_com(0x0f);

if(sj_para==7) {sj_para=0;} //选择时间参

switch (sj_para)

{

case 1:

send_addr(3, 0);

send_data(table[Read_DS1302(0x85)/10]); //读小时

send_data(table[Read_DS1302(0x85)%10]);

send_addr(3, 0);

break;

case 2:

send_addr(3, 2);

send_data(table[Read_DS1302(0x83)/10]); //读分钟

send_data(table[Read_DS1302(0x83)%10]);

send_addr(3, 2);

break;

case 3:

send_addr(3, 4);

send_data(table[Read_DS1302(0x81)/10]); //读秒

send_data(table[Read_DS1302(0x81)%10]);

send_addr(3, 4);

break;

case 4:

send_addr(2, 1);

send_data(table[Read_DS1302(0x8d)/10]); //读年

send_data(table[Read_DS1302(0x8d)%10]);

send_addr(2, 1);

break;

case 5:

send_addr(2, 3);

send_data(table[Read_DS1302(0x89)/10]); //读月

send_data(table[Read_DS1302(0x89)%10]);

send_addr(2, 3);

break;

case 6:

send_addr(2, 5);

send_data(table[Read_DS1302(0x87)/10]); //读日

send_data(table[Read_DS1302(0x87)%10]);

send_addr(2, 5);

break;

}

}

}

if(P05==0)

{

delay(5); //去斗

if(P05==0)

{

while(P05==0); //等待按键松开再加一

jianpanF=1; //时间调节

switch (sj_para) //在这里为了能显示光标 在键盘中加入读取数据和显示数据的程序

{

case 1: shi=Read_DS1302(0x85)+1;

if(shi>=25) shi=0; modify_time(0x84,shi);

send_data(table[Read_DS1302(0x85)/10]); //读小时

send_data(table[Read_DS1302(0x85)%10]);

send_addr(3, 0); //时

break;

case 2: fen=Read_DS1302(0x83)+1;

if(fen>=60)fen=0; modify_time(0x82,fen);

send_data(table[Read_DS1302(0x83)/10]); //读分钟

send_data(table[Read_DS1302(0x83)%10]);

send_addr(3, 2);

break; //分

case 3:

miao=Read_DS1302(0x81)+1;

if(miao>=60) miao=0; modify_time(0x80,miao);

send_data(table[Read_DS1302(0x81)/10]); //读秒

send_data(table[Read_DS1302(0x81)%10]);

send_addr(3, 4);

break; //秒

case 4:

nian=Read_DS1302(0x8d)+1;

if(nian>=99) nian=0; modify_time(0x8c,nian);

send_data(table[Read_DS1302(0x8d)/10]); //读年

send_data(table[Read_DS1302(0x8d)%10]);

send_addr(2, 1);

break; //秒

case 5:

yue=Read_DS1302(0x89)+1;

if(yue>=12) yue=0; modify_time(0x88,yue);

send_data(table[Read_DS1302(0x89)/10]); //读月

send_data(table[Read_DS1302(0x89)%10]);

send_addr(2,3);

break; //秒

case 6:

ri=Read_DS1302(0x87)+1;

if( ri>=31) ri=0; modify_time(0x86, ri);

send_data(table[Read_DS1302(0x87)/10]); //读日

send_data(table[Read_DS1302(0x87)%10]);

send_addr(2, 5);

break; //秒

}

}

}

if(P06==0)

{ delay(5);

if(P06==0);

while(P06==0);

send_com(0x0c);

if(jianpanF==1)

jianpanF=0;

send_com(0x01); // 清空DDRAM

send_addr(1, 0);

for(q=0;q<6;q++)

{

send_data(wendu[q]);

}

send_addr(2, 0);

for ( q=0;q<14;q++)

{

send_data(shijian[q]);

}

}

}

以上就是关于51单片机控制12864液晶屏串行通信时序图与程序全部的内容,包括:51单片机控制12864液晶屏串行通信时序图与程序、单片机用的是at89c52,LCD(TG-12864)来显示模拟时钟的程序,c或汇编都可以。、c51单片机控制12864程序(c语言),显示几个字,或一些简单的图片就行!先谢谢了!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存