找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2093|回复: 0
打印 上一主题 下一主题
收起左侧

简单的菜单

[复制链接]
跳转到指定楼层
楼主
ID:218850 发表于 2017-7-11 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint  unsigned int

/*12864-12 端口定义*/

#define LCD_data  P0             //数据口

sbit LCD_RS  =  P2^6;            //寄存器选择输入

sbit LCD_RW  =  P2^5;            //液晶读/写控制

sbit LCD_EN  =  P2^7;            //液晶使能控制

uchar code dis1[] = {"  功能菜单"};

uchar code dis2[] = {"1.时间设置"};

uchar code dis3[] = {"2.日期设置"};

uchar code dis4[] = {"3.闹钟功能"};

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

void delay0(uchar x);  //x*0.14MS

void lcd_pos(uchar X,uchar Y);  //确定显示位置

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

/*                                                                 */

/*  延时函数                                                       */

/*                                                                 */

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

void delay(int ms)

{

    while(ms--)

{

      uchar i;

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

  {

   _nop_();

_nop_();

_nop_();

_nop_();

  }

}

}

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

/*                                                                 */

/*检查LCD忙状态                                                    */

/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */

/*                                                                 */

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

bit lcd_busy()

{                          

    bit result;

    LCD_RS = 0;

    LCD_RW = 1;

    LCD_EN = 1;

    delayNOP();

    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;

    delayNOP();

    LCD_EN = 1;

    delayNOP();

    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;

    delayNOP();

    LCD_EN = 1;

    delayNOP();

    LCD_EN = 0;

}

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

/*                                                                 */

/*  LCD初始化设定                                                  */

/*                                                                 */

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

void lcd_init()

{   

    lcd_wcmd(0x34);      //扩充指令操作

    delay(5);

    lcd_wcmd(0x30);      //基本指令操作

    delay(5);

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

    delay(5);

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

    delay(5);
       

}

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

/**/

/* 延时x*0.14ms子程序*/

/*                                                       */

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

void delay0(uchar x)    //x*0.14MS

{

  uchar i;

  while(x--)

{

  for (i = 0; i<13; i++) {}

}

}

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

/* 设定显示位置                                          */

/*                                                       */

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

void lcd_pos(uchar X,uchar Y)

{                          

   uchar  pos;

   if (X==0)

     {X=0x80;}

   else if (X==1)

     {X=0x90;}

   else if (X==2)

     {X=0x88;}

   else if (X==3)

     {X=0x98;}

   pos = X+Y ;  

   lcd_wcmd(pos);     //显示地址

}

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

/**/

/* 主程序          */

/*                                                       */

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

  main()

{

    uchar i;

    delay(10);                 //延时

    lcd_init();                //初始化LCD            

    lcd_pos(0,0);             //设置显示位置为第一行的第1个字符

     i = 0;

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

     {                         //显示字符

       lcd_wdat(dis1[i]);

       i++;

     }

    lcd_pos(1,0);             //设置显示位置为第二行的第1个字符

     i = 0;

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

     {

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

       i++;

     }

lcd_pos(2,0);             //设置显示位置为第三行的第1个字符

     i = 0;

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

     {

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

       i++;

     }

lcd_pos(3,0);             //设置显示位置为第四行的第1个字符

     i = 0;

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

     {

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

       i++;

     }

     while(1);

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表