cbl709 发表于 2009-7-8 15:32:31

为什么我的lcd1602会显示乱码?

我取消avr的jtag lcd就变成乱码了,重新恢复jtag还是乱码,大家遇到过这种情况吗?我是通过pc口控制lcd的输出内容,pa口作为lcd的数据线。。。

lionliu 发表于 2009-7-8 22:07:23

如果以前是正常的,把JTAG接口拔掉试一下,如果以前不是好的,看线接反没有,以前就是搞反了查了一个星期才发现

cbl709 发表于 2009-7-8 23:08:26

我根本没接jtag插口啊~~~还有第一行是乱码,第二行是正常的。。。把我郁闷的,搞了一天都不知到什么原因。。。

zc3909 发表于 2009-7-8 23:42:45

程序没问题吧

cbl709 发表于 2009-7-8 23:57:22

#include <iom16v.h>
#include <macros.h>
/*****************************************
         porta------DB0~DB7         PB0------RS
                              PB1------RW
                              PB2------E
*****************************************/
#define LCD_RS (1<<0)
#define LCD_RW(1<<1)
#define LCD_EN (1<<2)
#define lcd_set_e()(PORTB|= LCD_EN)   //置位与清零
#define lcd_set_rs()(PORTB|= LCD_RS)
#define lcd_set_rw() (PORTB |= LCD_RW)
#define lcd_clear_e()(PORTB &= ~LCD_EN)
#define lcd_clear_rs() (PORTB &= ~LCD_RS)
#define lcd_clear_rw() (PORTB &= ~LCD_RW)
#define LCD_DB PORTA
/******定义函数****************/
# define uchar unsigned char
# define uint unsigned int
void LCD_check_busy(void);
void PORT_init()
{DDRA=0xFF;
DDRB=0xFF;
DDRC=0xff;
}
void LCD_init(void);//初始化函数
void LCD_write_command(uchar command);//写指令函数
void LCD_write_data(uchar dat);//写数据函数
void LCD_disp_char(uchar x,uchar y,uchar *s);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)

void LCD_check_busy(void);//?
void delay_n40us(uint n);//延时函数
//********************************
//*******初始化函数***************
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
delay_n40us(100);//?
}
//********************************
//********写指令函数************
void LCD_write_command(uchar dat)
{LCD_check_busy();
LCD_DB=dat;
lcd_clear_rs();//指令
lcd_clear_rw();//写入
lcd_set_e();
lcd_clear_e();//允许

delay_n40us(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
//*******************************
//********写数据函数*************
void LCD_write_data(uchar dat)
{LCD_check_busy();
LCD_DB=dat;
lcd_set_rs();//指令
lcd_clear_rw();//写入
lcd_set_e();
lcd_clear_e();//允许


delay_n40us(1);
}
//********************************
//*******显示字符函数*********
void LCD_disp_char(uchar x,uchar y,uchar *s)
{
uchar address;
if(y==1)
         address=0x80+x;
else
    {address=0xc0+x;}
LCD_write_command(address);
while(*s)
{LCD_write_data(*s);
delay_n40us(10);
s++;}

}
//********************************
//*******检查忙函数*************//
void LCD_check_busy(void)   
{uchar temp;
do
{
DDRA=0x00;
lcd_set_rw(); // Set LCD to READ
lcd_clear_rs();
lcd_set_e();
delay_n40us(1);
temp=PINA;
lcd_clear_e(); // Disable LCD
lcd_set_e();
}
while(temp&0x80);
DDRA=0xff;
}
   
               
/******************************/
//********延时函数***************//
void delay_n40us(uint n)
{ uint i;
      uchar j;            
      for(i=n*20;i>0;i--)
         for(j=0;j<2;j++)
                   NOP();
                           
}                                       
//*******************************
//*********主函数*****************
void main(void)
{       PORT_init();
      LCD_init();
                               
               
       LCD_disp_char(0,1,"hijklmn");
          
                LCD_disp_char(0,2,"hijklmn");
               
      while(1);
}
原来这个程序可以正常显示的,就是我设置了jpag熔丝后才出现乱码的。。。

cbl709 发表于 2009-7-9 00:00:42

而且很奇怪的是第一行只有部分字母出现乱码,数字不会有乱码,第二行基本正常,但有时也会出现乱码。。。

xxq123 发表于 2009-11-30 08:43:44

本人也出现类似情况,显示数字的时候没有乱码,只要是显示字符串就出现,而且是非显示数字区域都是乱码

lwu_2008 发表于 2009-12-10 09:28:54

求解

Gorgon_Meducer 发表于 2009-12-10 09:34:59

把Busy check改为固定的延时,然后设置一个比较大的延时时间,看看是否故障解除。
如果解除,则逐渐减小延时……

fnems 发表于 2009-12-10 10:32:59

我用的是一个兼容1602的LCD,好像是JH162吧,初始化的时候要把0x38控制字连续写三遍才行。一开始不知道,也是显示乱码,当时差点把LCD当成坏件扔掉呢。

不知LZ的问题是不是与此类似
页: [1]
查看完整版本: 为什么我的lcd1602会显示乱码?