本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
调试的结果是,如果没有读数据这一步,12864可以正确在相应位置显示一个点,但是因为没有读数据,不能在同一个坐标下面重复画两个点。
如果加了读数据,无法正确显示一个点,乱显示的,
看了N遍datasheet,改了各种延时,时序也变了好多种,老是出现同样的问题。
我的12864没有问题,而且我换了一个用,结果没变。
程序如下,高手帮下忙呀,纠结了2天了
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^5; //数据,指令切换
sbit rw=P1^6; //读,写切换
sbit en=P1^7; //使能端
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void CheckBusy( void ) //忙检测函数
{
unsigned int nTimeOut = 0 ;
P0 = 0x80 ;
rw=1;
rs=0;
en=0;
en=1;
while( ( P0 == 0x80 ) && ( ++nTimeOut != 0 ) ) ;
en=0;
}
void writecom(uchar com) //写指令
{
CheckBusy();
rw=0;
rs=0;
delay(1);
en=0;
en=1;
delay(1);
P0=com;
delay(3);
en=0;
}
void writedata(uchar date) //写数据
{
CheckBusy();
rw=0;
rs=1;
delay(1);
en=0;
en=1;
delay(1);
P0=date;
delay(3);
en=0;
}
uchar readdata() //读数据
{
uchar shuju;
CheckBusy();
P0=0xff;
rs=1;
rw=1;
en=0;
delay(1);
en=1;
delay(1);
shuju=P0;
delay(3);
en=0;
return shuju;
}
void writeaddress(uchar x,y)
{
switch(y)
{
case 1:x=x; break ;
case 2:x=x+16; break ;
case 3:x=x+8; break ;
case 4:x=x+24; break ;
}
writecom(0x80-1+x);
}
void play(uchar x,uchar y,uchar *Data)
{
writeaddress(x,y);
while(*Data != '\0')
{
writedata(*Data++);
}
}
void inint()
{
writecom(0x30); //功能设定
delay(2);
writecom(0x01); //清屏
writecom(0x06); //光标右移
writecom(0x03); //地址归零
writecom(0x0c); //开显示
delay(1);
}
void draw_point(uchar x,y) //画点程序
{
uchar udate,date,b,out,point_bit,point_num;
writecom(0x34);
writecom(0x34);
point_num=x/16;
point_bit=x%16;
if(y<32)
{
writecom(0x80+y); //确定y轴位置)
writecom(0x80+point_num); //X轴为第N个汉字位置
}
else
{
writecom(0x80-32+y);
writecom(0x88+point_num);
}
if(point_bit<8) //
{} //
else // 若余数位8-16,虚读1次数据,使用光标右移动1字节,到达2字节的低位
{ //
udate=readdata(); //
}
date=readdata(); //读取该位置的8位数据
if(y<32) //由于读取数据,光标将右移动1字节,所以再次锁定X Y位置
{
writecom(0x80+y);
writecom(0x80+point_num); //X轴的汉字位置
}
else
{
writecom(0x80-32+y); //(y轴位置)
writecom(0x88+point_num); //X轴的汉字位置
}
if(point_bit<8) //
{
b=(0x80>>(point_bit));
} //
else // 若余数位8-16,
{
b=(0x80>>(point_bit-8));
udate=readdata(); //
}
out=b|date;
writedata(out); //若是直接writedata(b) 是可以任意画出点,读取后的就出问题
writecom(0x36);
}
void clrgdram() //清除RAM数据
{
unsigned char i, j, k ;
writecom( 0x34 ) ;
writecom( 0x36 ) ;
for( i = 0 ; i < 2 ; i++ )
{
for( j = 0 ; j < 32 ; j++ )
{
writecom( 0x80 + j ) ;
if( i == 0 )
{
writecom( 0x80 ) ;
}
else
{
writecom( 0x88 ) ;
}
for( k = 0 ; k < 16 ; k++ )
{
writedata( 0x00 ) ;
}
}
}
writecom( 0x30 ) ;
}
void main()
{
delay(10);
inint();
clrgdram();
draw_point(0,0);
while(1)
{
}
} |