• 天游8线路检测中心

    新闻中心
    AT89x51 LCD1602 最简单C程序 显示一个A
    2010-10-10
    8157

    代码从网页中copy过后,可能会存在错误,请明辨。

    #include <at89x51.h>
    /*****************************************
    P1------DB0~DB7 P2.0------RS
    P2.1------RW
    P2.2------E
    *****************************************/
    #define LCD_DB P1
    sbit LCD_RS=P2^0;
    sbit LCD_RW=P2^1;
    sbit LCD_E=P2^2;
    /******定义函数****************/
    #define uchar unsigned char
    #define uint unsigned int
    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 dat);//在某个屏幕位置上显示一个字符,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);//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。
    }
    //********************************
    //********写指令函数************
    void LCD_write_command(uchar dat)
    {
    LCD_DB=dat;
    LCD_RS=0;//指令
    LCD_RW=0;//写入
    LCD_E=1;//允许
    LCD_E=0;
    delay_n40us(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
    }
    //*******************************
    //********写数据函数*************
    void LCD_write_data(uchar dat)
    {
    LCD_DB=dat;
    LCD_RS=1;//数据
    LCD_RW=0;//写入
    LCD_E=1;//允许
    LCD_E=0;
    delay_n40us(1);
    }
    //********************************
    //*******显示一个字符函数*********
    void LCD_disp_char(uchar x,uchar y,uchar dat)
    {
    uchar address;
    if(y==1)
    address=0x80+x;
    else
    address=0xc0+x;
    LCD_write_command(address);
    LCD_write_data(dat);
    }
    //********************************
    /*******检查忙函数*************
    void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以
    { //至于不能正常使用LCD。因此我没有再用检查忙函数。而使
    do //用了延时的方法,延时还是非常好用的。我试了一下,用
    { LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令
    LCD_RS=0; //要用200次循环便能完成。
    LCD_RW=1;
    LCD_DB=0xff;
    LCD_E=1;
    }while(LCD_DB^7==1);
    }
    ******************************/
    //********延时函数***************
    void delay_n40us(uint n)
    { uint i;
    uchar j;
    for(i=n;i>0;i--)
    for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
    } //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。
    //*******************************
    //*********主函数*****************
    void main(void)
    {
    LCD_init();
    LCD_disp_char(0,1,"A");
    while(1);
    }
    //*******************************
     

    下一篇: AT89C51与AT89S51单片机的区别 返回首页
    热门推荐
    热门标签