标题:
LCD1602模块化编程—动态实时显示一个通过按键控制的变量,
[打印本页]
作者:
zjc666321
时间:
2018-7-3 00:13
标题:
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)
下载附件
2018-7-3 00:02 上传
仿真图
作者:
erdan同学
时间:
2019-4-11 16:56
谢谢,楼主分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1