#define FIRST_ADDR 0 //定义字符/汉字显示起始位置
unsigned char code zk[]={
0x08,0x20,0x1c,0x10,0x1c,0x1c,0xff,0x9e,0x7f,0x1e,0x1c,0x1f,0x3e,0x1f,0x3e,0x1f,
0x77,0x1f,0x41,0x3f,0x00,0x7e,0x00,0xfe,0x83,0xfc,0x7f,0xf8,0x3f,0xf0,0x0f,0xc0,
};
sbit sinA = P2^0; //信号A
sbit sinB = P2^1; //信号B
/*-----检查忙位----*/
void chk_busy()
{ RS=0;
RW=1;
E=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x01)==0x01);
E=0;
}
/*--延时子程序---*/
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/*-写命令到LCD----*/
void write_com(unsigned char cmdcode)
{
chk_busy();
RS=0;
RW=0;
E=1;
cmdcode = ((cmdcode&0x01)<<7)|((cmdcode&0x02)<<5)|((cmdcode&0x04)<<3)|((cmdcode&0x08)<<1)|((cmdcode&0x10)>>1)|((cmdcode&0x20)>>3)|((cmdcode&0x40)>>5)|((cmdcode&0x80)>>7);
Lcd_Bus=cmdcode;
delay(5);//
E=0;
delay(5);
}
/*---写数据到LCD----*/
void write_data(unsigned char Dispdata)
{
chk_busy();
RS=1;
RW=0;
E=1;
Dispdata = ((Dispdata&0x01)<<7)|((Dispdata&0x02)<<5)|((Dispdata&0x04)<<3)|((Dispdata&0x08)<<1)|((Dispdata&0x10)>>1)|((Dispdata&0x20)>>3)|((Dispdata&0x40)>>5)|((Dispdata&0x80)>>7);
Lcd_Bus=Dispdata;
delay(5);///
E=0;
delay(5);
}
/*-----初始化LCD屏----*/
void lcdreset()
{ delay(0.1);
write_com(0x30);
delay(10); //选择基本指令集
write_com(0x30); //选择8bit数据流
delay(5);
write_com(0x0c); //开显示(无游标、不反白)
delay(10);
write_com(0x01); //清除显 delay(500);
write_com(0x06); //指定示的移位
delay(0);
}
/*-----自定义一个字符代码(一个星星和月亮)----*/
void CGRAM()
{ int i;
write_com(0x30);
write_com(0x40);
for(i=0;i<16;i++)
{write_data(zk[i*2]);
write_data(zk[i*2+1]);
}
}
/*-----显示字符串-----*/
void hzkdis(unsigned char code *s)
{ while(*s>0)
{ write_data(*s);
s++;
delay(50);
}
}
/*-----首屏显示---*/
void ceshi()
{write_com(0x01);//清除
delay(5);
if(sinA==0&&sinB==0)
{
write_com(0x98);//第一行
hzkdis("5555");
delay(2500);
}
if(sinA==1&&sinB==0)
{
write_com(0x98);//第二行
hzkdis("4444");
delay(2500);
}
if(sinA==1&&sinB==1)
{
write_com(0x98);//第三行
hzkdis("3333");
delay(3000);
}
if(sinA==0&&sinB==1)
{
write_com(0x98);//第四行
hzkdis("1111");
delay(2500);
}
{
write_com(0x80);//第一行
hzkdis("222");
delay(3000);
}
{
write_com(0x90);//第四行
hzkdis("123456");
delay(3000);
}
}
/*----清屏命令----*/
void clrscreen()
{
write_com(0x01);
delay(10);
}
main()
{
while(10)
{
PSB=0;
delay(10);
PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
CGRAM();
ceshi(); //显示测试字样
clrscreen(); //清屏
}
}
不是背光灯和电的问题,应该是刷新屏幕的延时,可是我总是找不到是那一项造成的,
您好,请问去掉那一段初始化清屏,是最后一段吗,我去掉后,就不显示了,请详述,非常感谢!!
追答你在所有清屏指令后面加入延时1S的程序,然后看看闪烁是否得到缓解,如果有,就每去掉一清屏指令后的延时后看效果,这样就可以找到那个位置了。while循环里面的清屏,你放在主函数里面就可以了
追问/*------------------清屏命令--------------------------*/
main()
{
while(1)
{
PSB=0;
PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
ceshi(); //显示测试字样
}
}
这样还是闪,不好意思,我刚学,呵呵,还是没有完全弄明白,我的QQ976624836,谢谢1
/*-----首屏显示---*/
void ceshi()
{write_com(0x01);//清除
delay(5); //这里修改一下
delay(3000);
if(sinA==0&&sinB==0)
/*----清屏命令----*/
void clrscreen()
{
write_com(0x01);
delay(10); //这里修改一下延时
delay(3000);
}
main()
{
PSB=0;
delay(10);
PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
clrscreen(); //清屏
while(1)
{
//delay(3000);// 新加入的
// CGRAM();
delay(3000);// 新加入的
ceshi(); //显示测试字样
}
}
你先这样改了 看看还有闪没有 这里加的时间比较长 你可以适当改短 因为我不知道你的晶振是多少的 具体时间多少才合适你就自己改了 你先试试吧 一般如果不需要持续写入的话建议你就写一次 不要在while里重复的写
51单片机模拟串口控制lcd12864,显示不完全求解
第1种代码:单片机运行到while(1);这条语句后就不会往下走了,一直在这里死循环,运行空语句。就不会给液晶送数据了。第2种代码:单片机运行到while(1)后会往下执行,进入while循环,循环的给液晶送数据。循环的输出。就是有分号和没分号的区别。如果没有把while(1);语句放在末尾还是会循环输...
51单片机LCD12864显示乱码怎么回事
你这液晶屏带不带字库啊?这是显示乱码,要么程序不对,要么取模方式不对。程序中那table是显示图形一或汉字的点阵数据吧?液晶屏的型号不同,显示图形或汉字时,取模的方式有多种,下载一个液晶屏专用的取模软件,试一下几种取模方式,看哪种取模方式取得数据能正常显示。
51单片机实验,如何让LCD12864显示字符?程序如何下载到单片机里面呢?主 ...
也可以把12864的驱动程序单独编一个源文件(.c文件),添加到工程中 并用一个头文件(主要声明函数和变量)引导,主文件中包含头文件即可,编译链接不用你介入,都有是编译器的事 如我用STC12C单片机和液晶屏时:include<STC12C54.H> include<EEPROM.H> include<YEJING1602.H> 把液晶屏操作函数和EE...
单片机LCD12864液晶屏
我这里有串口方式的程序 今晚刚编好的 也测试了液晶能显示出来 你看看吧 把我的端口对应改一下就行 如果液晶再无法显示 那就是你硬件的问题了 比如PSB端口是否接了低电平 include<reg52.h> include<intrins.h> define uint unsigned int define uchar unsigned char sbit cs=P2^5; \/\/片选...
ISD4004 与 LCD12864通过STC51单片机程序如何写
你想用STC单片机控制语音芯片ISD4004,用LCD12864做显示屏,估计你是想做一个音乐播放器或录音器之类的吧。这个工作量有点大,对初学者也很有难度。我的建议是:1、你要了解ISD4004,首先先去下载ISD4004的DATA SHEET,最好是同时找中文和英文的。里面肯定会有硬件电路图,也会教你怎么去控制。但是一般...
51单片机128*64液晶C程序
简单一点吧,就完成一个功能,显示几个字就可以了,随便什么字,给我写个简单的程序我参考学习一下,谢谢了~!!!是51单片机哦,C语言程序谢绝留个网络地址让我去瞧瞧什么的,有程序加一点说明就OK,也可以是纯粹的用文字叙述的步凑,谢谢了!! 展开 我来答 1...
关于单片机液晶屏LCD12864的程序
void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)\/\/y-行数值0-3,x-列数值0-7,pstr-字符串指针 \/\/12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字 \/\/可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符 \/\/为了实现自动换行功能...
用51单片机做一个测电压电流的电路,LCD12864显示屏能否同时把电压电流...
当然没有问题,只要不要求刷新率过高就可以满足要求。
求51单片机LCD12864串行显示程序,只用SID口和SCLK口,能显示输出四行中文...
\/\/LCD12864字库系列(控制器ST7920A),单片机:89S52,晶振:12M,\/\/串口连接 与 并口连接 ( 串口时 屏蔽 并行模块)\/\/并行连接方式,P2.0-RS,P2.1-RW,P2.2-E#include<reg52.h>#include <intrins.h>sbit RS=P3^2; \/\/串口时为CSsbit RW=P3^1; \/\/串口为SIDsbit E=P3^0; \/\/串口为时钟SCLKsbit stop=P2...
proteus仿真LCD12864,屏幕一直为黑,找不到原因,高分求解
必须先写1才能读入外部信息RS=0; \/\/选择程序寄存器RW=1; \/\/读E=1; \/\/使能打开while( P0Data & 0x80 ) ; \/\/如果是忙P0data与0x80就不等于0,所以while语句总是执行。E=0; \/\/使能关闭}\/\/ 下面这个图是告诉你我是成功的,所以你不用怀疑我函数的正确性。