打印

LCD12864程序无法显示

[复制链接]
1937|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lasic|  楼主 | 2012-4-24 14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主控为ST7920的12864.由于手头上Mega8 I/O口不够,只好用PC0-PC3接DB0~3口,PD0~3接DB4~7口。PSB写高电平,用并行输入。
    12864一直没反应,求路过的高手帮忙看看,指点迷津。以下是程序:

#include <avr/io.h>
#include "lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
#define DB0  PC0
#define DB1  PC1
#define DB2  PC2
#define DB3  PC3
#define DB4  PD0
#define DB5  PD1
#define DB6  PD2
#define DB7  PD3

#define LCD_RS  PD7
#define LCD_RW  PD6
#define LCD_EN  PD5
#define LCD_RET PC6//接Mega8 RESET口,低电平有效
#define SET_DATA()  (1<<LCD_RS)    //写数据
#define SET_INC()   (~(1<<LCD_RS)) //写命令
#define SET_READ()  (1<<LCD_RW)    //读
#define SET_WRITE() (~(1<<LCD_RW)) //写
#define SET_EN()    (1<<LCD_EN)    //使能
#define CLR_EN()    (~(1<<LCD_EN)) //空闲
uchar LCD_DataPortRead(void)
{
   uchar a;
   a=((PINC&0x0f)|((PIND&0x0f)<<4));
   return a;
}
void LCD_DataPort(uchar Data)
{
     if(Data&0x80) PORTD|=(1<<PD3);
     if(Data&0x40) PORTD|=(1<<PD2);
     if(Data&0x20) PORTD|=(1<<PD1);
     if(Data&0x10) PORTD|=(1<<PD0);
     if(Data&0x08) PORTC|=(1<<PC3);
     if(Data&0x04) PORTC|=(1<<PC2);
     if(Data&0x02) PORTC|=(1<<PC1);
     if(Data&0x01) PORTC|=(1<<PC0);
}
void LCD_CheckBusy(void)
{
   uint temp,Timeout=0;
   SET_INC();
   SET_READ();
   CLR_EN();
   SET_EN();
   Delay(5);
      temp=LCD_DataPortRead();
   CLR_EN();
   while((temp&0x80)&&(++Timeout!=0));
}
void LCD_SendCmd(uchar Cmd)
{
      LCD_CheckBusy();
   SET_INC();
   SET_WRITE();
   SET_EN();
   LCD_DataPort(Cmd);
   _delay_us(100);  
   CLR_EN();
}
void LCD_SendData(uchar Data)
{
      LCD_CheckBusy();
   SET_DATA();
   SET_WRITE();
   SET_EN();
   
   LCD_DataPort(Data);
   Delay(5);
   CLR_EN();
}
void Delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
void LCD_Init(void)
{     
      Delay(50);
   LCD_SendCmd(0x30); //基本指令集
   Delay(5);
   LCD_SendCmd(0x30);
   Delay(5);
   LCD_SendCmd(0x0c); //开显示
   Delay(5);
   LCD_SendCmd(0x01); //清屏
   Delay(5);
   LCD_SendCmd(0x06); //光标右移
}
void LCD_SetAddress(uchar x,uchar y)
{
      uchar Address;
   switch(y)
   {
     case 0: Address=0x80+x;break;
  case 1: Address=0x90+x;break;
  case 2: Address=0x88+x;break;
  case 3: Address=0x98+x;break;
  default:
  break;
   }
   LCD_SendCmd(Address);
}
void LCD_PutString(uchar x,uchar y,uchar *pData)
{
       LCD_SetAddress(x,y);
    while(*pData!='\0')
    {
      LCD_SendData(*pData++);
    }
}

主程序如下:
#include <avr/io.h>
#include <util/delay.h>
#include "lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
void Port_Init(void)
{
  DDRB = 0xEC;
  PORTB =0xF3;
  DDRC = 0x0F; //PC0~3设置输出,无上拉
  PORTC =0xF0;
  DDRD = 0x0F;
  PORTD =0xF0;
}
void main(void)
{
  Port_Init();
  PORTB|=(1<<PB5);
  
  LCD_Init();
  while(1)
{
  LCD_PutString(2,0,"12864");
  Delay(500);
  LCD_PutString(2,1,"OK");
  LCD_PutString(0,2,"LCD12864ST7920");
  LCD_PutString(0,3,"★○◇◆※☆■△");
  }
}

相关帖子

沙发
lasic|  楼主 | 2012-4-24 14:29 | 只看该作者
:) 求路过的前辈指点下,谢谢了!

使用特权

评论回复
板凳
lasic|  楼主 | 2012-4-26 14:06 | 只看该作者
:)自己顶起来,菜鸟求助

使用特权

评论回复
地板
lasic|  楼主 | 2012-4-26 14:09 | 只看该作者
看来好几遍,只有接口跟例程有些不一样:void LCD_DataPort(uchar Data)
{
     if(Data&0x80) PORTD|=(1<<PD3);
     if(Data&0x40) PORTD|=(1<<PD2);
     if(Data&0x20) PORTD|=(1<<PD1);
     if(Data&0x10) PORTD|=(1<<PD0);
     if(Data&0x08) PORTC|=(1<<PC3);
     if(Data&0x04) PORTC|=(1<<PC2);
     if(Data&0x02) PORTC|=(1<<PC1);
     if(Data&0x01) PORTC|=(1<<PC0);
}
莫非是这样把数据拆了 分别赋值 不能用并口通讯?

使用特权

评论回复
5
joing1999| | 2012-4-27 09:52 | 只看该作者
你这个赋值,错了吧?你自己看看

使用特权

评论回复
6
joyme| | 2012-4-27 15:18 | 只看该作者
在使能前调这个函数赋值,你这样PC0上电平变化比PD3上慢几十个us,怎么能把正确值写进去

使用特权

评论回复
7
lasic|  楼主 | 2012-5-4 17:05 | 只看该作者
谢谢LS两位,这样赋值的确是不对的,不过还有其他地方有错,还在改。

使用特权

评论回复
8
airwill| | 2012-5-5 10:42 | 只看该作者
什么叫一直没有反应呢?
读 READY 信号, 有没有反应呢? 如果一直没有 READY, 会不会上拉和时序方面的问题.
如果有 READY, 正常写了, 会不会液晶的对比度负压没有调好?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

1

粉丝