C51编程:请大侠指教液晶显示的问题:
请教AVR单片机(90S515)液晶显示问题:
我在ICCAVR开发平台上,编了一段液晶显示程序,用AVR STUDIO仿真时
好象没有什么问题,可在实际电路中,一点也不管用,什么显示也没有。实在发现
不了问题,希望请做过液晶显示的大侠指点 ,不胜感激。(我的液晶显示模块是HY128*64B,
控制芯片是三星的KS0108B,我对照了其它128*64显示模块,接口大都差不多)
#include<io8515.h>
#define cs1 0x01 //B口PB0
#define cs2 0x02 //B口PB1
#define rst 0x04 //B口PB2
#define rw 0x08 //B口PB3
#define di 0x10 //B口PB4
#define ea 0x20 //B口PB5
#pragma data:eeprom
unsigned char a[16]={0xff,0x00,0x00,0xff,0xaa,0xaa,0x55,0x55,
0xaa,0x55,0x55,0xaa,0xff,0xff,0x00,0x00};
unsigned char yu[32]=
{0x20,0x20,0x20,0xFE,0x20,0x20,0xFE,0x20,0x20,0x20,0x20,0xFE,0x20,0x20,0x20,0x00
,
0x00,0x00,0x00,0x3F,0x20,0x20,0x27,0x22,0x22,0x22,0x22,0x27,0x30,0x20,0x00,0x00}
;//16*16汉字数组
unsigned char xin[32]=
{0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0xFF,0xC9,0x49,0x49,0x49,0xFF,0x00,0x00,0x00
,
0x00,0x08,0x08,0x84,0x44,0x22,0x1D,0x00,0x00,0xFD,0x02,0x02,0x04,0x0C,0x04,0x00}
;//16*16汉字数组
void init8515(void)
{
DDRC=0xff;PORTC=0xff;//C口输出(液晶显示输入输出口)
DDRB=0xff;PORTB=0xff;//B口输出(液晶显示模块控制位)
}
void delay(int dly)
{
while(dly--);
}
void waitidle1(void) //判断芯片1的状态
{
PORTB&=~cs1;PORTB|=cs2; //低电平选中(cs1=0,cs2=1)
PORTB&=~di;PORTB|=rw;PORTB|=ea; //di=0表示指令,1表示数据;rw=0表示写;1表示
读
for(;(PINC&0x80)==0x80;); //判断是READY OR BUSYING 如BUSYING,则等
待;
}
void waitidle2(void) //判断芯片1的状态
{
PORTB|=cs1;PORTB&=~cs2; //低电平选中(cs1=1,cs2=0)
PORTB&=~di;PORTB|=rw;PORTB|=ea; //di=0表示指令,1表示数据;rw=0表示写;1表示
读
for(;(PINC&0x80)==0x80;); //判断是READY OR BUSYING 如BUSYING,则等待
}
void initlcm(void)
{ PORTB&=~rst;delay(2);PORTB|=rst;delay(8);
PORTB&=~ea&~di&~rw;PORTB|=cs1|cs2;
waitidle1(); //判断芯片1是否准备好?如准备好则继续,否则,等待
PORTB&=~cs1;PORTB|=cs2;PORTB&=~di&~rw;//di=0表示指令,1表示数据;rw=0表示写;1表示
读
PORTC=0x3f;PORTB|=ea;delay(2);PORTB&=~ea;delay(2); //控制指令0x3f表示正常显示
waitidle1();PORTB&=~cs1;PORTB|=cs2;PORTB&=~di&~rw;
PORTC=0xc0;PORTB|=ea;delay(2);PORTB&=~ea;delay(2); //控制指令0xc0表示显示起始
位置从屏幕最顶端开始
PORTB|=cs1|cs2;waitidle2();
PORTB|=cs1;PORTB&=~cs2;PORTB&=~di&~rw;
PORTC=0x3f;PORTB|=ea;delay(2);PORTB&=~ea;delay(2);
waitidle2();PORTB|=cs1;PORTB&=~cs2;PORTB&=~di&~rw;
PORTC=0xc0;PORTB|=ea;delay(2);PORTB&=~ea;delay(2);
PORTB|=cs1|cs2;
}
void lw(unsigned char x,unsigned char y,unsigned char dd)
{
if (x<64)
{ //当x地址小于64时,转到第1号
芯片处理
PORTB|=cs1|cs2;
waitidle2();
PORTB&=~di&~rw;PORTB|=cs1;PORTB&=~cs2;
PORTC=0xb8|y;PORTB|=ea;delay(2);PORTB&=~ea;delay
(2); //0xb8|y表示y地址
waitidle2();
PORTB&=~di&~rw;PORTB|=cs1;PORTB&=~cs2;
PORTC=0x40|x;PORTB|=ea;delay(2);PORTB&=~ea;delay
(2); //0x40|x表示x地址
waitidle2();
PORTB|=di;PORTB&=~rw;PORTB|=cs1;PORTB&=~cs2;
PORTC=dd;PORTB|=ea;delay(2);PORTB&=~ea;delay(2); //向该
地址写数据
PORTB|=cs1|cs2;
}
else
{
PORTB|=cs1|cs2;x=x-64; //当x地址大于64时,转到第2
号芯片处理
waitidle1();
PORTB&=~di&~rw;PORTB&=~cs1;PORTB|=cs2;
PORTC=0xb8|y;PORTB|=ea;delay(2);PORTB&=~ea;delay(2); //0xb8|y表
示y地址
waitidle1();
PORTB&=~di&~rw;PORTB&=~cs1;PORTB|=cs2;
PORTC=0x40|x;PORTB|=ea;delay(2);PORTB&=~ea;delay
(2); //0x40|x表示x地址
waitidle1();
PORTB|=di;PORTB&=~rw;PORTB&=~cs1;PORTB|=cs2;
PORTC=dd;PORTB|=ea;delay(2);PORTB&=~ea;delay
(2); //向该地址写数据
PORTB|=cs1|cs2;
}
PORTC=0xff;
}
void write_chinese(unsigned char x,unsigned char y,unsigned char array[])
{
unsigned char j,dd;
for(j=0;j<32;j++)
{
dd=array[j];
if(j<16) lw(x+j,y,dd);
else lw(x+j-16,y+1,dd);
}
}
void main(void)
{
unsigned char i;
init8515();
while(1)
{
initlcm();
write_chinese(20,0,yu); //在指定位置显示汉字
write_chinese(40,2,xin);
delay(60000);
for(i=0;i<8;i++)
{
unsigned char x,y;
for(y=0;y<8;y++)
{
for(x=0;x<128;x++)
{
if(x%2==0)
lw(x,y,a[2*i]);
else
lw(x,y,a[2*i+1]);
}
}
delay(60000);
}
}
}
发表时间:2002年1月22日0:40:00