朋友们,帮我看看这段程序,谢谢


我正在学习单片机,学到1602液晶的时候,自己编了这段程序,功能就是让液晶显示一个字母a。就是这个简单的功能折磨了一个上午,首先我实验板的1602是4位总线连接的。液晶是1602C。程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit Q2=P2^4;
sbit Q3=P2^5;
sbit Q4=P2^6;
sbit Q5=P2^7;//不是很重要,主要是为了关闭实验板上的数码管显示

sbit rs=P0^0;    //P0.0接LCD的R/S端
sbit rw=P0^1;     //P0.1接LCD的R/W端
sbit en=P0^2;     //P0.2接LCD的E端
void delay(uchar);
void write1602(uchar,uchar);

void init()     //初始化
{
    Q2=1;
    Q3=1;
    Q4=1;
    Q5=1;
    delay(20);
    rw=0;     //不打算读取1602的任何状态或者数据
    write1602(0x28,0);//功能设置
    delay(20);
    write1602(0x0e,0);//显示设置
    delay(20);
    write1602(0x01,0);//清屏
    delay(20);
    write1602(0x02,0);//AC清零
    delay(20);
    write1602(0x06,0);//输入方式   
}

void delay(uchar z)     //延时1ms子程序
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}  

void write1602(uchar com,bit ii)
{
    uchar temp;
    temp=com;
    delay(20);        
    rs=ii;
    delay(20);
    en=1;
    delay(20);
    P0=temp;
    delay(20);
    temp=com<<4;
    en=0;
    delay(20);
    en=1;
    delay(20);
    P0=temp;
    delay(20);
    en=0;
    delay(20);
}                   //这段时序很重要,我感觉没错啊!可能原因就出在这里。

void main()
{
    init();
    delay(50);
    write_com(0x80+5,0);
    delay(20);
    write_com(0x31,1);
    while(1);
}

听说1602是慢器件,可是我延时还不够么?还是那块错了!请大家帮忙看下了~~~
谢谢了