求大家的帮助,12864
时间:10-02
整理:3721RD
点击:
公司有很多SYB12864的液晶屏,就想拿来做个东西,本来是想用STM32的,后来一直不显示,就想先拿51试试。也上网查了好些资料。用PROTEUS仿真,可以显示,在开发板上却无论如何显示不了。调延时,查接线,都没有问题。想是不是屏是坏的,拿到车间测试了下,也是好的。不知道是哪里的问题 。
不知道大家能不能看清楚,最后我看数码管和LED灯都有显示闪烁,程序肯定是运行起来了,就是屏幕不显示。下面是程序。
#include<reg52.h>
#include<intrins.h>
#include<math.h>
/*
sbit RS=P3^3;
sbit RW=P3^2;
sbit E=P3^4;
sbit MCS=P3^7;
sbit SCS=P3^5;
*/
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit MCS=P2^3;
sbit SCS=P2^4;
#define LCD_BUS P0
#define uchar unsigned char
#define FIRST_ADDR 0
char code ce[] = {
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08, 0x31, 0x86, 0x60, 0x00, 0xFE, 0x02, 0xF2, 0x02, 0xFE, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00,
0x04, 0xFC, 0x03, 0x00, 0x80, 0x47, 0x30, 0x0F, 0x10, 0x67, 0x00, 0x07, 0x40, 0x80, 0x7F, 0x00
};
char code shi[] = {
/*-- 文字: 试 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40, 0x42, 0xDC, 0x08, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0x10, 0x12, 0x1C, 0x10, 0x00,
0x00, 0x00, 0x7F, 0x20, 0x10, 0x20, 0x20, 0x1F, 0x10, 0x10, 0x01, 0x06, 0x18, 0x20, 0x78, 0x00
};
char code kai[] = {
/*-- 文字: 开 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40, 0x42, 0x42, 0x42, 0x42, 0xFE, 0x42, 0x42, 0x42, 0x42, 0xFE, 0x42, 0x42, 0x42, 0x42, 0x00,
0x00, 0x40, 0x20, 0x10, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00
};
char code shi3[]= {
/*-- 文字: 始 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10, 0x90, 0x70, 0x1F, 0x12, 0xF0, 0x00, 0x20, 0x70, 0x28, 0x27, 0x22, 0x28, 0x70, 0x20, 0x00,
0x40, 0x21, 0x12, 0x0C, 0x06, 0x09, 0x30, 0x00, 0x7F, 0x21, 0x21, 0x21, 0x21, 0x7F, 0x00, 0x00
};
void chk_busy()
{
RS=0;
RW=1;
E=1;
LCD_BUS=0x00;
while((LCD_BUS&0x80)==0x80);
E=0;
}
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
void write_com(uchar cmdcode)
{
chk_busy();
RS=0;
RW=0;
E=1;
LCD_BUS=cmdcode;
delay(10);
E=0;
delay(10);
}
void write_data(uchar Dispdata)
{
chk_busy();
RS=1;
RW=0;
E=1;
LCD_BUS=Dispdata;
delay(10);
E=0;
delay(10);
}
void lcdreset()
{
delay(2000);
write_com(0x30);
delay(10);
write_com(0x30);
delay(10);
write_com(0x0c);
delay(10);
write_com(0x01);
delay(10);
write_com(0x06);
delay(10);
}
void hz_disp16(uchar pag,uchar col,uchar code *hzk)
{
uchar i=0,j=0;
for(j=0;j<2;j++)
{
write_com(0xb8+pag+j);
write_com(0x40+col);
for(i=0;i<16;i++)
write_data(hzk[16*j+i]);
}
}
/*
void hzkdis(uchar code*s)
{
while(*s!='\0')
{
write_data(*s);
s++;
delay(50);
}
}
void ceshi(void)
{
write_com(0x01);
delay(50);
MCS=1;
SCS=0;
write_com(0x80);
hzkdis("aaa");
write_com(0x90);
hzkdis("bbb");
write_com(0x88);
hzkdis("abcd");
write_com(0x98);
hzkdis("1234");
}
*/
void main(void)
{
lcdreset();
MCS=1;
SCS=0;
hz_disp16(3,32,ce);
delay(2000);
hz_disp16(3, 48, shi);
delay(2000);
MCS = 0;SCS = 1;
hz_disp16(3, 0, kai);
delay(2000);
hz_disp16(3, 16, shi3);
delay(2000);
}
最后谢谢大家!
不知道大家能不能看清楚,最后我看数码管和LED灯都有显示闪烁,程序肯定是运行起来了,就是屏幕不显示。下面是程序。
#include<reg52.h>
#include<intrins.h>
#include<math.h>
/*
sbit RS=P3^3;
sbit RW=P3^2;
sbit E=P3^4;
sbit MCS=P3^7;
sbit SCS=P3^5;
*/
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit MCS=P2^3;
sbit SCS=P2^4;
#define LCD_BUS P0
#define uchar unsigned char
#define FIRST_ADDR 0
char code ce[] = {
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08, 0x31, 0x86, 0x60, 0x00, 0xFE, 0x02, 0xF2, 0x02, 0xFE, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00,
0x04, 0xFC, 0x03, 0x00, 0x80, 0x47, 0x30, 0x0F, 0x10, 0x67, 0x00, 0x07, 0x40, 0x80, 0x7F, 0x00
};
char code shi[] = {
/*-- 文字: 试 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40, 0x42, 0xDC, 0x08, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0x10, 0x12, 0x1C, 0x10, 0x00,
0x00, 0x00, 0x7F, 0x20, 0x10, 0x20, 0x20, 0x1F, 0x10, 0x10, 0x01, 0x06, 0x18, 0x20, 0x78, 0x00
};
char code kai[] = {
/*-- 文字: 开 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40, 0x42, 0x42, 0x42, 0x42, 0xFE, 0x42, 0x42, 0x42, 0x42, 0xFE, 0x42, 0x42, 0x42, 0x42, 0x00,
0x00, 0x40, 0x20, 0x10, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00
};
char code shi3[]= {
/*-- 文字: 始 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10, 0x90, 0x70, 0x1F, 0x12, 0xF0, 0x00, 0x20, 0x70, 0x28, 0x27, 0x22, 0x28, 0x70, 0x20, 0x00,
0x40, 0x21, 0x12, 0x0C, 0x06, 0x09, 0x30, 0x00, 0x7F, 0x21, 0x21, 0x21, 0x21, 0x7F, 0x00, 0x00
};
void chk_busy()
{
RS=0;
RW=1;
E=1;
LCD_BUS=0x00;
while((LCD_BUS&0x80)==0x80);
E=0;
}
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
void write_com(uchar cmdcode)
{
chk_busy();
RS=0;
RW=0;
E=1;
LCD_BUS=cmdcode;
delay(10);
E=0;
delay(10);
}
void write_data(uchar Dispdata)
{
chk_busy();
RS=1;
RW=0;
E=1;
LCD_BUS=Dispdata;
delay(10);
E=0;
delay(10);
}
void lcdreset()
{
delay(2000);
write_com(0x30);
delay(10);
write_com(0x30);
delay(10);
write_com(0x0c);
delay(10);
write_com(0x01);
delay(10);
write_com(0x06);
delay(10);
}
void hz_disp16(uchar pag,uchar col,uchar code *hzk)
{
uchar i=0,j=0;
for(j=0;j<2;j++)
{
write_com(0xb8+pag+j);
write_com(0x40+col);
for(i=0;i<16;i++)
write_data(hzk[16*j+i]);
}
}
/*
void hzkdis(uchar code*s)
{
while(*s!='\0')
{
write_data(*s);
s++;
delay(50);
}
}
void ceshi(void)
{
write_com(0x01);
delay(50);
MCS=1;
SCS=0;
write_com(0x80);
hzkdis("aaa");
write_com(0x90);
hzkdis("bbb");
write_com(0x88);
hzkdis("abcd");
write_com(0x98);
hzkdis("1234");
}
*/
void main(void)
{
lcdreset();
MCS=1;
SCS=0;
hz_disp16(3,32,ce);
delay(2000);
hz_disp16(3, 48, shi);
delay(2000);
MCS = 0;SCS = 1;
hz_disp16(3, 0, kai);
delay(2000);
hz_disp16(3, 16, shi3);
delay(2000);
}
最后谢谢大家!
这个不是屏幕的问题,是protues软件上面的12864和现实我们用的12864不同,protues中的12864已经很老了。
一直在调延时,还是没有显示,不知道是哪里卡住了,纠结中!
恩,看到了啊,昨天一天的努力调出来了,今天在做画点的程序,还没有弄出来!
求 32 的 12864的程序