为什么我的lcd1602会显示乱码?
我取消avr的jtag lcd就变成乱码了,重新恢复jtag还是乱码,大家遇到过这种情况吗?我是通过pc口控制lcd的输出内容,pa口作为lcd的数据线。。。 如果以前是正常的,把JTAG接口拔掉试一下,如果以前不是好的,看线接反没有,以前就是搞反了查了一个星期才发现 我根本没接jtag插口啊~~~还有第一行是乱码,第二行是正常的。。。把我郁闷的,搞了一天都不知到什么原因。。。 程序没问题吧 #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熔丝后才出现乱码的。。。 而且很奇怪的是第一行只有部分字母出现乱码,数字不会有乱码,第二行基本正常,但有时也会出现乱码。。。 本人也出现类似情况,显示数字的时候没有乱码,只要是显示字符串就出现,而且是非显示数字区域都是乱码 求解 把Busy check改为固定的延时,然后设置一个比较大的延时时间,看看是否故障解除。
如果解除,则逐渐减小延时…… 我用的是一个兼容1602的LCD,好像是JH162吧,初始化的时候要把0x38控制字连续写三遍才行。一开始不知道,也是显示乱码,当时差点把LCD当成坏件扔掉呢。
不知LZ的问题是不是与此类似
页:
[1]