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);
}
} 如果不确定判忙是否有效,可以先去掉后试试。 看你的配置字和写时序对没有 DDRB=0xff;
改成DDRD=0xff;
试一下。 本帖最后由 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);
} 谢谢诸位! 正在研究这东西!
页:
[1]