找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602模块化编程—动态实时显示一个通过按键控制的变量,

[复制链接]
跳转到指定楼层
楼主
①主程序:/*12MHZ晶振,LCD1602实时动态显示一个变量(num)二位数,通过一个按键循环自加,当加到99,就重新回到1*/
#include<LCD.h>
uchar a,b;
uchar dat[2]; //要在【】中加数组长度,不然会出现问题!!!!!!!!!!
uint num;
sbit s1=P3^0; //独立按键定义
void delayms(uint z);//声明毫秒级延时函数
void Keyscan();// 声明按键函数
void main()
{
   num=50;//定义并初始化num=50。
   LCD_init();        //初始化LCD602
  while(1)
  {
    Keyscan();       
        a=num/10;  //十位
        b=num%10;  //个位

        dat[0]=a+0x30;        //数组第一位赋值十位。
        dat[1]=b+0x30;        //数组第二位赋值个位。
        Write_Cmd(0x80 | 0x00);//设置显示地址0x00,第一行从第一个字符开始显示 。
        /*接下来依次从首地址开始显示uchar类型字符*/
        Write_Dat(dat[0]);
        Write_Dat(dat[1]);

        delayms(10);          //延时5ms,防止屏幕闪烁
  }
}

/*定义毫秒级延时函数*/
void delayms(uint z)//毫秒级延时程序
   {   uint i,j;  
     for(i=z;i--;i>0)   
            for(j=114;j--;j>0);
   }
/*定义按键函数函数*/
void keyscan()
         {
        if(s1==0)
        delayms(5);        //按键消抖
                if(s1==0)
                {
                if(num<99)
                num=num+1;
                else
                num=0;
                }
                while(!s1);         //按键松手检测,若为0,则在此等待
         }
②LCD1602头文件:

#ifndef _LCD_H_
#define _LCD_H_

#include"reg52.h"
#include"intrins.h"
#define    uchar unsigned char
#define           uint  unsigned int
//uchar x,y,*str,dat,cmd;
void  Read_Busy();  //判断液晶忙?
void  Write_Cmd(uchar cmd); //写入一字节指令
void  Write_Dat(uchar dat);        //写入一字节数据
void  LCD_init();  //lcd初始化
void  LCD1602_Dis_Str(uchar x, uchar y, uchar *str);        //显示字符串
void  LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat); //显示一个字符
#endif //定义结束
LCD602头文件对应的.c程序:

#include<LCD.h>
#include<reg52.h>
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;
//#define   uchar unsigned char
//#define          uint  unsigned int  
//判断液晶忙,如果忙则等待
void Read_Busy()
{
uchar busy;
P0=0xff; //p0置1
RS=0;          //数据,命令选择端为0,表示数据
RW=1;    //写
do
{
EN=1;
busy=P0;
EN=0;
}
while(busy&0x80); //最高位为1,则为忙。
}

//写LCD1602命令一个字节
void Write_Cmd(uchar cmd)
{
        Read_Busy();//判断忙
        RS = 0;
        RW = 0;
        P0 = cmd;
        EN = 1;
        EN = 0;
}

//写一个字节数据,一个字符uchar类型
void Write_Dat(uchar dat)
{
        Read_Busy();
        RS = 1;
        RW = 0;
        P0 = dat;
        EN = 1;
        EN = 0;
}
//lcd1602初始化
void LCD_init()
   {
        Write_Cmd(0x38);//第一步:显示模式设置。设置16*2显示        0011 1000
        Write_Cmd(0x0f);//第二步:显示开/关光标设置 0000  1 D C B  D=1:开显示 C=1:显示光标反之。B=1:光标闪烁B=0;光标不闪烁
        Write_Cmd(0x01);//第三步:清屏指令 ,以免之前残留在LCD上的数据

        Write_Cmd(0x06);//第四步:0000 01NS 。N=1;地址指针加1,光标加1.地址指针移位命令,读或写一个字符后,地址指针加1,且光标加1
        Write_Cmd(0x80 | 0x00);//第五步:设置显示起始地址80H+(00H~0F/ 40H~4FH)。
   }

//x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行) *str:需要显示的字符串
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
        if(y)
         x |= 0x40;
        x |= 0x80;
        Write_Cmd(x);
        while(*str != '\0')
        {
                Write_Dat(*str++);
        }
}
  //x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行) dat:需要显示的数据以ASCLL形式显示
void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
        if(y)
                x |= 0x40;
        x |= 0x80;
        Write_Cmd(x);
        Write_Dat(dat);               
}

       这是动态显示的基础程序,采用模块化编程,以后可以加更多内容,欢迎提出指正和进行交流。

屏幕截图(8).png (239.63 KB, 下载次数: 73)

仿真图

仿真图

评分

参与人数 3黑币 +88 收起 理由
不小心 + 30 很给力!
ZONE-9 + 8 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:507959 发表于 2019-4-11 16:56 | 只看该作者
谢谢,楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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