TXT

LCD1602YD

By Arthur Flores,2014-07-01 03:32
5 views 0
LCD1602YD

    /********************************************************************************

    * 标题: xl系列单片机实验仪演示程序 LCD1602 移动显示 *

    * 文件: lcd1602Yd.C * * 日期: 2006-1-5 * * 版本: 3.0 !试验通过版,可用xl600-xl1000单片机综合试验仪试验 *

    * 邮箱: sxj1974@163.com * * 网站; http://www.51c51.com www.8951.com * ******************************************************************************** * 描述: LCD1602 移动显示 *

    * 显示方式; * * 1LCD第一行显示; ilove 8051 mcu * * LCD第二行显示;13714407535 * * 2、先将两行字符写入DDRAM中(然后从右至左逐字移出显示。 *

    * 3、在指定位置停留1.6秒后(闪烁2次(清屏。 *

    * 4、反复循环上述显示方式。 *

    ******************************************************************************** * 【版权】 Copyright(C)深圳市学林电子有限公司 www.51c51.com *

    * 【声明】 此程序仅用于学习与参考(引用请注明版权和作者信息, *

    * 【技术支持】请访问http://www.51c51.com/bbs/index.asp 官方论坛 *

    ********************************************************************************/

#include <reg51.h>

    #include <intrins.h>

    #define uchar unsigned char #define uint unsigned int

    sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2;

    uchar code dis1[] = {"I LOVE 8051 MCU"}; uchar code dis2[] = {"TEL:13714407535"};

    /*******************************************************************/ /* /* 延时子程序 /* /*******************************************************************/

char code SST516[3] _at_ 0x003b;

    void delay(int ms) {

     int i;

     while(ms--)

     {

     for(i = 0; i< 250; i++)

     {

     _nop_();

     _nop_();

     _nop_();

     _nop_();

     }

     } }

    /*******************************************************************/ /* /*检查LCD忙状态 /*lcd_busy1时(忙(等待。lcd-busy0,闲(可写指令与数据。

    /* /*******************************************************************/

    bit lcd_busy() {

     bit result;

     LCD_RS = 0;

     LCD_RW = 1;

     LCD_EN = 1;

     _nop_();

     _nop_();

     _nop_();

     _nop_();

     result = (bit)(P0&0x80);

     LCD_EN = 0;

     return result; }

    /*******************************************************************/ /* /*写指令数据到LCD /*RS=L(RW=L(E=高脉冲(D0-D7=指令码。

    /* /*******************************************************************/

    void lcd_wcmd(uchar cmd) {

     while(lcd_busy());

     LCD_RS = 0;

     LCD_RW = 0;

     LCD_EN = 0;

     _nop_();

     _nop_();

     P0 = cmd;

     _nop_();

     _nop_();

     _nop_();

     _nop_();

     LCD_EN = 1;

     _nop_();

     _nop_();

     _nop_();

     _nop_();

     LCD_EN = 0; }

    /*******************************************************************/ /* /*写显示数据到LCD /*RS=H(RW=L(E=高脉冲(D0-D7=数据。

    /* /*******************************************************************/

    void lcd_wdat(uchar dat) {

     while(lcd_busy());

     LCD_RS = 1;

     LCD_RW = 0;

     LCD_EN = 0;

     P0 = dat;

     _nop_();

     _nop_();

     _nop_();

     _nop_();

     LCD_EN = 1;

     _nop_();

     _nop_();

     _nop_();

     _nop_();

     LCD_EN = 0; }

    /*******************************************************************/ /* /* 设定显示位置 /* /*******************************************************************/

    void lcd_pos(uchar pos) {

     lcd_wcmd(pos|0x80); //数据指针=80+地址变量

    }

    /*******************************************************************/ /* /* LCD初始化设定 /* /*******************************************************************/

    void lcd_init() {

     delay(15); //等待LCD电源稳定

     lcd_wcmd(0x38); //16*2显示(5*7点阵(8位数据

     delay(5);

     lcd_wcmd(0x38);

     delay(5);

     lcd_wcmd(0x38);

     delay(5);

     lcd_wcmd(0x0c); //显示开(关光标

     delay(5);

     lcd_wcmd(0x06); //移动光标

     delay(5);

     lcd_wcmd(0x01); //清除LCD的显示内容

     delay(5); }

    /*******************************************************************/ /* /* 清屏子程序 /* /*******************************************************************/

    void lcd_clr() {

     lcd_wcmd(0x01); //清除LCD的显示内容

     delay(5); }

    /*******************************************************************/ /* /* 闪动子程序 /* /*******************************************************************/

    void flash() {

     delay(600); //控制停留时间

     lcd_wcmd(0x08); //关闭显示

     delay(200); //延时

     lcd_wcmd(0x0c); //开显示

     delay(200);

     lcd_wcmd(0x08); //关闭显示

     delay(200); //延时

     lcd_wcmd(0x0c); //开显示

     delay(200); }

    /*******************************************************************/ /* /* 主程序 /* /*******************************************************************/

    main() {

     uchar i,j;

     delay(10);

     lcd_init(); //初始化LCD

     while(1)

     {

     lcd_clr();

     lcd_pos(0x10); //设置显示位置为第一行第17

     i = 0;

     while(dis1[i] != '\0')

     { //显示字符" "

     lcd_wdat(dis1[i]);

     i++;

     }

     lcd_pos(0x50); //设置显示位置为第二行第17

     i = 0;

     while(dis2[i] != '\0')

     {

     lcd_wdat(dis2[i]); //显示字符" "

     i++;

     }

     for(j=0;j<16;j++) //向左移动16

     {

     lcd_wcmd(0x18); //字符同时左移一格

     delay(100); //控制移动时间

     }

     flash(); //闪动二次

     } }

Report this document

For any questions or suggestions please email
cust-service@docsford.com