role_2099 发表于 2014-9-24 22:58:10

被ATmega64配12864液晶屏给卡住了,上代码和图片

晶振使用外部的7.3728MHz,熔丝位FF911F,显示如图所示一个字都显示不出来
#include "iom64v.h"
#include "avrdef.h"

typedef unsigned char uint8_t;
typedef unsigned intuint16_t;

#define LCD_12864_DDR DDRF
#define LCD_12864_DATA PORTF
#define LCD_12864_PIN PINF
#define LCD_12864_RS_DDR   DDRE
#define LCD_12864_RS_PORT    PORTE
#define LCD_12864_RS_PIN   2
#define LCD_12864_RW_DDR   DDRE
#define LCD_12864_RW_PORT    PORTE
#define LCD_12864_RW_PIN   3
#define LCD_12864_EN_DDR   DDRE
#define LCD_12864_EN_PORT    PORTE
#define LCD_12864_EN_PIN   4

#define SET(port,bit)(port |= (1<<bit))   //set bit in port
#define CLR(port,bit)(port &= ~(1<<bit))//clear bit in port

uint8_t table1[]={"³úºÌÈÕµ±Î磬"};
uint8_t table2[]={"º¹µÎºÌÏÂÍÁ¡£"};
uint8_t table3[]={"Ë­ÖªÅÌÖвͣ¬"};
uint8_t table4[]={"Á£Á£½ÔÐÁ¿à¡£"};

void Initialization(void)
{
        //LCD_12864
        DDRF = 0xff;
        PORTF = 0x00;
SET(LCD_12864_RS_DDR,LCD_12864_RS_PIN);
        SET(LCD_12864_RW_DDR,LCD_12864_RW_PIN);
        SET(LCD_12864_EN_DDR,LCD_12864_EN_PIN);
}

void Delay_100xUs(uint16_t Us)
{
        uint16_t i,j;
        for(i=0;i<Us;i++)
        {
                for(j=0;j<114;j++);
        }
}

void Delay_Ms(unsigned int Ms)
{
        unsigned int i,j;
        for(i=0;i<Ms;i++)
        {
                for(j=0;j<1141;j++);
        }
}

/*******************************************

********************************************/
void Write_Cmd(uint8_t cmd)
{
    uint8_t lcdtemp = 0;
                       
    CLR(LCD_12864_RS_PORT,LCD_12864_RS_PIN);//LCD_RS_L;
    SET(LCD_12864_RW_PORT,LCD_12864_RW_PIN);//LCD_RW_H;
    DDRF = 0x00;//LCD_DataIn;
    do
    {   
      SET(LCD_12864_EN_PORT,LCD_12864_EN_PIN);//LCD_EN_H;
               _NOP();                                       
               lcdtemp = PINF;//LCD2MCU_Data;
               CLR(LCD_12864_EN_PORT,LCD_12864_EN_PIN);//LCD_EN_L;
    }
    while(lcdtemp & 0x80);
   
    DDRF = 0xFF;//LCD_DataOut;   
    CLR(LCD_12864_RW_PORT,LCD_12864_RW_PIN);//LCD_RW_L;               
    PORTF = cmd;
    SET(LCD_12864_EN_PORT,LCD_12864_EN_PIN);//LCD_EN_H;
    _NOP();                                                                         
    CLR(LCD_12864_EN_PORT,LCD_12864_EN_PIN);//LCD_EN_L;
}
/*******************************************

********************************************/
voidWrite_Data(uint8_t dat)
{
    uint8_t lcdtemp = 0;   
      
    CLR(LCD_12864_RS_PORT,LCD_12864_RS_PIN);//LCD_RS_L;
    SET(LCD_12864_RW_PORT,LCD_12864_RW_PIN);//LCD_RW_H;
    DDRF = 0x00;//LCD_DataIn;   
    do                     //??
    {   
      SET(LCD_12864_EN_PORT,LCD_12864_EN_PIN);//LCD_EN_H;
               _NOP();                                       
               lcdtemp = PINF;//LCD2MCU_Data;
               CLR(LCD_12864_EN_PORT,LCD_12864_EN_PIN);//LCD_EN_L;
    }
    while(lcdtemp & 0x80);
   
    DDRF = 0xFF;//LCD_DataOut;   
    SET(LCD_12864_RW_PORT,LCD_12864_RW_PIN);//LCD_RS_H;
    CLR(LCD_12864_RW_PORT,LCD_12864_RW_PIN);//LCD_RW_L;       
      
    PORTF = dat;
    SET(LCD_12864_EN_PORT,LCD_12864_EN_PIN);//LCD_EN_H;
    _NOP();                                                                         
    CLR(LCD_12864_EN_PORT,LCD_12864_EN_PIN);//LCD_EN_L;
}
void Ini_Lcd(void)
{                  
          SET(LCD_12864_RS_DDR,LCD_12864_RS_PIN);
                SET(LCD_12864_RW_DDR,LCD_12864_RW_PIN);
                SET(LCD_12864_EN_DDR,LCD_12864_EN_PIN);
   
    Write_Cmd(0x30);
    Delay_Ms(1);
    Write_Cmd(0x02);
    Delay_Ms(1);
    Write_Cmd(0x0c);
    Delay_Ms(1);
    Write_Cmd(0x01);
    Delay_Ms(1);
    Write_Cmd(0x06);
    Delay_Ms(1);
    Write_Cmd(0x80);
}

void show(void)
{
uint8_t i;
Write_Cmd(0x81);
for(i=0;i<12;i++)
{
    Write_Data(table1);
                Delay_100xUs(20);//Delay_Ms(1);
}
        Write_Cmd(0x91);
for(i=0;i<12;i++)
{
    Write_Data(table2);
                Delay_100xUs(20);//Delay_Ms(1);
}
        Write_Cmd(0x89);
for(i=0;i<12;i++)
{
    Write_Data(table3);
                Delay_100xUs(20);//Delay_Ms(1);
}
        Write_Cmd(0x99);
for(i=0;i<12;i++)
{
    Write_Data(table4);
                Delay_100xUs(20);//Delay_Ms(1);
}
}

void main(void)
{
unsigned char temp;
Initialization();

        Ini_Lcd();

        show();
        while (1)
        {
}
}

role_2099 发表于 2014-9-24 23:44:15

此驱动程序在pic16f1939上验证过,在atmega8515 atmega16上面内部1MHz晶振上都验证没有问题

Jesen 发表于 2014-9-24 23:47:37

不懂,帮顶

jack12345 发表于 2014-9-25 08:11:33

帮顶,降低晶振试试!!

mdp_diy 发表于 2014-9-25 17:47:12

熔丝位没配置正常

skyfish_1989 发表于 2014-9-25 17:59:22

>1,电源是否正常;
>2,程序是否运行起来了;
>3,液晶的亮度对比度是否调好;
>4,示波器测试液晶驱动的管脚上的波形,是不是你所需要的波形

yinglively 发表于 2014-9-25 18:29:37

看看你的V0管脚是否正确连接

jshp32 发表于 2014-9-25 18:46:28

Delay延时函数是否验证过,检查一下时序,再调对比度

role_2099 发表于 2014-9-25 21:05:28

mdp_diy 发表于 2014-9-25 17:47
熔丝位没配置正常

应该怎么配置呢

role_2099 发表于 2014-9-25 21:06:16

jshp32 发表于 2014-9-25 18:46
Delay延时函数是否验证过,检查一下时序,再调对比度

延时函数用LED闪烁时常验证过,没有问题

role_2099 发表于 2014-9-25 21:09:45

yinglively 发表于 2014-9-25 18:29
看看你的V0管脚是否正确连接

RDJ试过50k的,10k的

role_2099 发表于 2014-9-25 21:12:43

skyfish_1989 发表于 2014-9-25 17:59
>1,电源是否正常;
>2,程序是否运行起来了;
>3,液晶的亮度对比度是否调好;


电源正常,程序确定跑起来了,亮度对比度这个不敢确定,没有示波器

askme 发表于 2014-9-25 21:16:56

外部晶振7372800Hz,192*64存储模式,读忙等待延时

Hhhhhhhh 发表于 2014-9-25 21:17:13

确定烧写进去了吗...atmega64用ISP时MOSI和MISO对应的是PDI和PDO

jshp32 发表于 2014-9-25 21:20:44

调节RDJ可调电阻,量VO电压是否变化,若不变,ADJ引脚接错。

lsy5110 发表于 2014-9-25 21:23:05

看看jtag禁用了没。

role_2099 发表于 2014-9-25 23:10:58

lsy5110 发表于 2014-9-25 21:23
看看jtag禁用了没。

显示出来了,是由于没有禁用jtag的原因
谢谢大家了。学到了很多。
页: [1]
查看完整版本: 被ATmega64配12864液晶屏给卡住了,上代码和图片