C51编程:关于点阵液晶显示求助!
我在编写点阵液晶显示的时候发现一个这样的问题让我没有高明白是怎回事,请求大家
帮助。
我选用用的液晶片是Truly MFC-G12864DPLY-1N型点阵液晶显示模块。单片机选用的是
89C51或52。P2口同液晶片的D0~D7相联。P1口的低5位接读写和片选信号。
问题:
在对模块的左半边进行写的时候,起先定义一个页和一个起始列写字的上半部分,写完
后在定义另外一页,再重先定以列同前面定义的列相同(对齐)。一般来说只要定义一个起
始列后再进行写的时候列计数自动相加。那么重先定义列,他会自动从新定以列处再自动相
加,这样达到前后两页的数据对齐,不如写一个字就会上下半对齐。但是我却发现程序执行
的时候没有按我预期的设想工作。即列记数一直再相加,导致上下部分出现错位。同样的程
序我把片选设在右半部分时结果又是正确的。这到底是怎么回事?!
我的源程序如下:
请各位大侠帮忙分析一下我的程序,到底是什么原因导致这个问题的?谢谢!
#include <stdio.h>
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int
#define bool bit
sbit y_rs = P1^0; /*定以寄存器选择信号引脚*/
sbit y_rw = P1^1; /*定义使能引脚*/
sbit y_e = P1^2; /*定义读写引脚*/
sbit y_cs1 = P1^3; /*定义片选1引脚*/
sbit y_cs2 = P1^4; /*定义片选2引脚*/
sbit y_rstb = P1^5; /*定义复位引脚*/
/*P2口为D0-D7数据线*/
uchar code buff[]= /*显示一个重字*/
{
0x10,0x10,0x12,0xF2,0x52,0x52,0x52,0xFE,0x52,0x52,0x51,0x31,0xF1,0x10,0x08,0x08,
0X80,0XA0,0XA0,0XA7,0XA5,0XA5,0XA5,0XFF,0XA5,0XA5,0XA5,0XA5,0XA7,0X90,0X80,0X80
};
/*-----------------------------------------------------------------*/
void init(void);
void L_WriteState(uchar L_WRSTATE);
void L_WriteData(uchar L_WRDATA);
void Clear(void);
void Write(void);
void main(void)
{
y_cs1 = 0;
_nop_();
y_cs1 = 1;
_nop_();
y_cs1 = 0;
init();
Write();
while(1);
}
void init(void)
{
uchar temp;
y_rstb=0; /*显示复位*/
_nop_();
_nop_();
y_rstb=1;
P1 = 0X38; /*使能片选1和2*/
y_rw=1; /*读写允许;读取状态字*/
y_rs=0; /*清除寄存器选择信号口*/
temp=P2 | 0XFF;
while ((temp & 0X10)==0X10) /*复位状态*/
{
while ((temp & 0X80)==0X80) /* 处于忙状态 */
{
P2|=0XFF; /*将P2口全部置1*/
y_e=1; /*使能液晶显示模块*/
temp=P2;
y_e=0;
}
}
temp=0XC0; /*设置起始行*/
L_WriteState(temp);
temp=0X3F; /*开显示*/
L_WriteState(temp);
Clear(); /*清屏*/
}
void L_WriteState(uchar L_WRSTATE) /*写控制信息*/
{ uchar mm;
mm=0X80;
y_rs=0;
y_rw=1;
_nop_();
_nop_();
while(mm==0X80) /*判断是否忙?*/
{
P2|=0XFF;
y_e=1;
mm=P2 & 0X80;
_nop_();
_nop_(); /*取忙标志*/
y_e=0;
}
y_rw=0;
y_rs=0;
P2=L_WRSTATE;
y_e=0;
_nop_();
_nop_();
y_e=1;
_nop_();
_nop_();
y_e=0;
}
void Clear(void) /* 清屏 */
{
uchar rr,ss,cc;
P1=0X38; /*清除 显示 RAM*/
for (cc=0xB8;cc<=0XC0;cc++)
{
rr=cc;
ss=0XC0; /*设置起始行*/
L_WriteState(ss);
ss=rr; /*设置页地址*/
L_WriteState(ss);
ss=0X40; /*设置列地址起始位置*/
L_WriteState(ss);
rr=0X40; /*清64列*/
while(rr--)
{
ss=0X00;
L_WriteData(ss);
}
}
}
void L_WriteData(uchar L_WRDATA) /*输出数据*/
{
uchar mm;
mm=0X80;
y_rs=0;
y_rw=1;
_nop_();
_nop_();
while(mm==0X80) /*判断是否忙?*/
{
P2|=0XFF;
y_e=1;
mm=P2 & 0X80;
_nop_();
_nop_(); /*取忙标志*/
y_e=0;
}
y_rs=1;
y_rw=0;
_nop_();
_nop_();
P2=L_WRDATA; /*端口写数*/
y_e=0;
_nop_();
y_e=1;
_nop_();
y_e=0;
}
void Write(void) /*写数据*/
{
uchar L_Wr1,L_Wr2,L_Wr3,L_Wr4;
int ii;
Clear();
y_cs1=1;
y_cs2=0;
_nop_();
L_Wr1=0XBA; /*第3页*/
L_WriteState(L_Wr1);
L_Wr1=0X50; /*第49列*/
L_WriteState(L_Wr1);
for (ii=0;ii<16;ii++) /*写字的上半部分*/
{
L_Wr3=buff[ii];
L_WriteData(L_Wr3);
}
y_cs1=1;
y_cs2=0;
_nop_();
L_Wr1=0XBB; /*第4页*/
L_WriteState(L_Wr1);
L_Wr1=0X50; /*第49列*/
L_WriteState(L_Wr1);
for(ii=16;ii<32;ii++) /*写下半部分*/
{
L_Wr3=buff[ii];
L_WriteData(L_Wr3);
}
_nop_();
}
发表时间:2003年1月30日15:55:00