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语言),显示几个字,或一些简单的图片就行!先谢谢了!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)