搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2014-7-11 23:00:44 | 显示全部楼层 |阅读模式
MEGA8在8MHz,并口驱动,应该是很简单的程序,搞了几天,却怎么都没显示英文一个字!不要说中文呢。屏是好的,已换过几个了,工作在并口模式,在卖的时候已当场试过,PSB接高电平,请高手帮忙!

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

typedef   unsigned int uint ;
typedef  unsigned char  uchar;

#define rs  PORTC.0  //H=data; L=command;
#define rw  PORTC.1    //H=read; L=write;
#define  e  PORTC.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[i]);
}

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);
                    
      }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-7-11 23:44:56 | 显示全部楼层
如果不确定判忙是否有效,可以先去掉后试试。

出0入0汤圆

发表于 2014-7-12 09:08:38 | 显示全部楼层
看你的配置字和写时序对没有

出0入0汤圆

发表于 2014-7-12 09:24:41 | 显示全部楼层
DDRB=0xff;
改成DDRD=0xff;
试一下。

出0入0汤圆

 楼主| 发表于 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);
}  

出0入0汤圆

发表于 2014-7-18 18:47:05 | 显示全部楼层
谢谢诸位! 正在研究这东西!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 13:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表