|
大家帮我看一下下面这个程序,哪里有问题。我用的 LCD1602液晶屏。我想让它显示一个A。为什么不能显示。我实在想不出来。发个贴请教下大家。
哪位高用能帮我分析一下。小弟感激不尽。
//定义引脚。
#define LCD_DATA P0
#define LCD_EN P2_3
#define LCD_RS P2_1
#define LCD_RW P2_2
typedef unsigned char uint8;
typedef unsigned int uint16;
#include <REGX51.H>
//主函数。
void main ( void )
{
delay_ms ( 400 );
LCD_intal ( );
delay_ms ( 2 );
writer_addr ( 0, 5,'A' );
delay_ms ( 2 );
}
//写数据时序。
void writer_date_timing ( uint8 date )
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = date;
delay_us ( 3 );
LCD_EN = 0;
LCD_EN = 1;
delay_ms ( 1 );
LCD_EN = 0;
}
//写命时序。
void writer_Command ( uint8 order )
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = order;
delay_us ( 3 );
LCD_EN = 0;
LCD_EN = 1;
delay_ms ( 1 );
LCD_EN = 0;
}
//初始化LCD1602
void LCD_intal ( void )
{
uint8 n = 3;
LCD_DATA = 0;
while ( n-- ) //设三次模式。
{
writer_Command ( 0x38 );
delay_ms ( 5 );
}
Lcd_WaitBusy ( ); //检测是否为忙时。
writer_Command ( 0x38 );
Lcd_WaitBusy ( );
writer_Command ( 0x01 ); //清屏。
Lcd_WaitBusy ( );
writer_Command ( 0x06 ); //功能设置画面不动。
Lcd_WaitBusy ( );
writer_Command ( 0x0c ); //开显示开关。
;
}
//检测是否为忙时。
uint8 Lcd_WaitBusy ( void )
{
uint8 Busy = 0x80;
LCD_DATA = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 0;
LCD_EN = 1;
delay_ms ( 1 );
LCD_EN = 1;
while ( LCD_DATA & Busy ); //检测忙信号
LCD_EN = 0;
return(LCD_DATA); //若不处于忙状态显示字符
}
//设置显示位置。
void writer_addr ( uint8 x, uint8 y, uint8 addr )
{
y &= 0x1;
x &= 0xF;
LCD_RS = 0;
LCD_RW = 0;
x |= 0x80; // 算出指令码
if ( x )
LCD_DATA = x;
delay_us ( 5 );
LCD_EN = 0;
LCD_EN = 1;
delay_us ( 1 );
LCD_EN = 0;
writer_date_timing ( addr ); 写入字符。
}
//延时MS
void delay_ms ( uint16 ms )
{
uint16 i,n;
for ( i = 0; i < ms; i++ )
for ( n = 0; n < 1000; n++ );
}
//延时US。
void delay_us ( uint16 us )
{
while ( us-- );
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|