被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)
{
}
}
此驱动程序在pic16f1939上验证过,在atmega8515 atmega16上面内部1MHz晶振上都验证没有问题 不懂,帮顶 帮顶,降低晶振试试!! 熔丝位没配置正常 >1,电源是否正常;
>2,程序是否运行起来了;
>3,液晶的亮度对比度是否调好;
>4,示波器测试液晶驱动的管脚上的波形,是不是你所需要的波形 看看你的V0管脚是否正确连接 Delay延时函数是否验证过,检查一下时序,再调对比度 mdp_diy 发表于 2014-9-25 17:47
熔丝位没配置正常
应该怎么配置呢 jshp32 发表于 2014-9-25 18:46
Delay延时函数是否验证过,检查一下时序,再调对比度
延时函数用LED闪烁时常验证过,没有问题 yinglively 发表于 2014-9-25 18:29
看看你的V0管脚是否正确连接
RDJ试过50k的,10k的
skyfish_1989 发表于 2014-9-25 17:59
>1,电源是否正常;
>2,程序是否运行起来了;
>3,液晶的亮度对比度是否调好;
电源正常,程序确定跑起来了,亮度对比度这个不敢确定,没有示波器 外部晶振7372800Hz,192*64存储模式,读忙等待延时
确定烧写进去了吗...atmega64用ISP时MOSI和MISO对应的是PDI和PDO 调节RDJ可调电阻,量VO电压是否变化,若不变,ADJ引脚接错。 看看jtag禁用了没。 lsy5110 发表于 2014-9-25 21:23
看看jtag禁用了没。
显示出来了,是由于没有禁用jtag的原因
谢谢大家了。学到了很多。
页:
[1]