ping666999 发表于 2014-7-11 23:00:44

MEGA8控制ST7920怎么都没显示,求助高手!

MEGA8在8MHz,并口驱动,应该是很简单的程序,搞了几天,却怎么都没显示英文一个字!不要说中文呢。屏是好的,已换过几个了,工作在并口模式,在卖的时候已当场试过,PSB接高电平,请高手帮忙!

#include <mega8.h>
#include <DELAY.h>
#include <stdio.h>
#include <string.h>

typedef   unsigned int uint ;
typedefunsigned charuchar;

#define rsPORTC.0//H=data; L=command;
#define rwPORTC.1    //H=read; L=write;
#defineePORTC.2   //input enable;
//#define psb PORTD.3    //H=并口; L=串口;
#define rst PORTC.4    //Reset Signal 低电平有效


void RDBF(void)//忙判别
{
uchar temp;
DDRD=0x00;

rw=1;
rs=0;
e=0;
delay_us(10);
while(1)
{
   e=1;
temp=PIND;   

delay_us(10);
e=0;

if((temp&0x80)==0)
break;
}

}
   
//写数据到指令
void WRCommand(uchar comm)
{
RDBF();
DDRB=0xff;
e=0;
rw=0;
rs=0;
e=1;
PORTD=comm;
delay_us(10);
e=0;
}

//写数据到数据
void WRData(uchar data)
{
RDBF();
DDRB=0xff;
e=0;
rw=0;
rs=1;
e=1;

PORTD=data;
delay_us(10);
e=0;
}

//uchar F1English[]={0x46,0x31,0x2d,0x2d,0x45,0x6e,0x67,0x6c,0x69,0x73,0x68};
uchar F1English[]={"asdfghjkl"};
uchar lengthF1=11;

//初始化 LCD
void LCDInit(void)
{
WRCommand(0x30);      //8位并口 ,基本指令
delay_ms(10);
WRCommand(0x06);       //光标右移动方向   
delay_ms(10);
WRCommand(0x01);
      
   delay_ms(30);
WRCommand(0x0c);       //开显示关游标
delay_ms(10);
WRCommand(0x02);    // 地址归零
   delay_ms(10);
   //屏幕清零
}

//显示英文字符()16*8
void SHowEnglish(uchar addr,uchar *english,uchar count)
{
uchar i;   
delay_ms(10);
WRCommand(addr);
for(i=0;i<count;i++)
WRData(english);
}

void main(void)
{
PORTB=0xff;
DDRB=0xFF;

PORTC=0xff;
DDRC=0xff;

PORTD=0xff;
DDRD=0xFF;

rst=0;
delay_ms(10);
rst=1;

LCDInit();


//SHowEnglish(0x80,"abc",3);//用这句这也不行
delay_ms(1000);
while(1)
{      
SHowEnglish(0x80,F1English,lengthF1);
   
   PORTB=~ PORTB;//接LED判别是否运行
      delay_ms(100);
                  
      }
}

nsj21n 发表于 2014-7-11 23:44:56

如果不确定判忙是否有效,可以先去掉后试试。

x007qinyu 发表于 2014-7-12 09:08:38

看你的配置字和写时序对没有

GUOHUDONG 发表于 2014-7-12 09:24:41

DDRB=0xff;
改成DDRD=0xff;
试一下。

ping666999 发表于 2014-7-12 22:15:37

本帖最后由 ping666999 于 2014-7-12 22:18 编辑

感谢上述朋友费了时间看程序,谢谢指点,DDRB=0xff;是当初的改端口是忘了改了,改成DDRD=0xff;后也没用,现在问题已解决!判忙函数的延时问题,网上很多51的例子,由于51的速度远比AVR慢,如果完全移植过来,必有问题!
我是用的金鹏的OCMJ4*8-8/V3.2的LCD,如果用在杂牌的,可能延时还有问题,下列是关键的几个函数在ATmega8/8Mhz上通过(CVAVR/V2.05编译),望初学者参考,少走弯路。

//判忙函数
void RDBF(void)   
{
uchar temp;
DDRD=0x00;
rw=1;
rs=0;
e=0;
delay_us(2);   //****
while(1)
   {
   e=1;
   #asm ("nop")
   #asm ("nop")
   temp=PIND;   
   #asm ("nop")
   e=0;
   #asm ("nop")
   #asm ("nop")
   if((temp&0x80)==0)
      break;
   }
   DDRD=0xFF;
}
   
//写数据到指令
void WRCommand(uchar comm)
{
RDBF();
DDRD=0xff;
e=0;
rw=0;
rs=0;
e=1;
#asm ("nop")
#asm ("nop")
PORTD=comm;
#asm ("nop")
#asm ("nop")
e=0;
delay_us(2);
}

//写数据到数据
void WRData(uchar data)
{
RDBF();
DDRD=0xff;
e=0;
rw=0;
rs=1;
e=1;
#asm ("nop")
#asm ("nop")
PORTD=data;
#asm ("nop")
#asm ("nop")
e=0;
delay_us(2);
}

zk16 发表于 2014-7-18 18:47:05

谢谢诸位! 正在研究这东西!
页: [1]
查看完整版本: MEGA8控制ST7920怎么都没显示,求助高手!