网站首页 > 技术教程 正文
总结下自己学习遇到的情况:1.每天学习点少量的新知识觉得心情愉悦 2.新知识的量>自己接受的承受范围,就觉得很糟糕。不知不觉地就有抵触学习的意识,越要强迫自己学,放弃得越快,放弃了,过一段时间还想学,但随着时间流逝前面知识忘得差不多了,然后又重新学,周而复始浪费了大量时间。人最大的敌人还是自己啊,克服坏毛病,永远不要放弃,只要坚持你有能力做任何你能想象的事情,重拾自我从今天开始做起....
液晶Lcd1602显示字符
做到只要能显示字符就行,第一次看驱动文件和原理看的头蒙,先会用就行。
LCD1602是一个有16引脚的字符液晶屏。8个数据引脚(D0-D7)和3个控制引脚(RS,RW,EN)。其余5个引脚用于LCD的电源和背光。
屏幕可以显示2行,每行可以显示16个字符。每个字符由5x8(列x行)像素矩阵组成。
自己遇到的一些问题
1._nop()_是intrins头文件的里单周期空语句,可是实现极短延时。nop表示空循环一个机器指令的时间,一个nop延时多少根据晶振所定,12M中表示1us
1S=1000ms(毫秒)=1000 000us(微妙)。1us(毫秒)=1000ns(纳秒)
是LCD1602的速度是纳秒级别的,而51单片机是毫秒级别的,所以基本不需要读取 忙标志,只要微延时就行了,proteus仿真软件不支持判忙函数
void lcd1602CheckBusy()//判忙函数
{
DPORT = 0xff;
RS=0;
RW=1;
E=1;
while(DPORT&0x80);
E=0;
}
2.稍微了解下LCD1602常用的一些命令,再看LCD1602初始化代码不会这么懵了
3.Proteus中学会使用终端符号
两个引脚不用连线也能导通方法:两端要加上终端符号,然后再终端上加上网络标号,要连在一起的两个终端必须有相同的网络标号
模块化编程思想
先学会抄作业,了解如何模块化编程
把LCD1602驱动代码导入到工程中
仿真软件效果
完整的驱动代码
delay.h
#ifndef _DELAY_H_
#define _DELAY_H_
void DelayUs2x(unsigned char t);
void delayNms(unsigned char t);
#endif
delay.c
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void delayNms(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
lcd1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include<reg51.h>
#include<intrins.h>
#include "delay.h" //请根据晶振自行编写延时函数
#define DPORT P0 // D0-D7根据实际硬件连接修改
sbit RS = P1^7; // 根据实际硬件连接修改
sbit RW = P1^6; // 根据实际硬件连接修改
sbit E = P1^5; // 根据实际硬件连接修改
void lcd1602WriteCmd(unsigned char cmd); //写命令函数
void lcd1602WriteByte(unsigned char dat);//写数据函数
void lcd1602Init(); // 初始化函数
void lcd1602WritePos(unsigned char xPos,unsigned char yPos);
void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat); // 写1个字符
void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s); // 写字符串
#endif
lcd1602.c
#include "lcd1602.h"
void lcd1602WriteByte(unsigned char dat)//写数据函数
{
delayNms(5);//判忙函数不支持proteus,延时5ms
RS=1; //将RS引脚设为高电平,RS = 1(写数据模式)
RW=0; //将RW引脚设为低电平,RW = 0(写操作模式)
DPORT=dat;// 将待写数据送到数据端口(D0-D7)
E=1; //使能脉冲,LCD锁存D0至D7处的数据并执行命令
_nop_();//短暂延时1个机器周期1us左右
_nop_();
E=0; //关闭使能释放总线
}
void lcd1602WriteCmd(unsigned char cmd) //写命令函数
{
delayNms(5);//判忙函数不支持proteus,延时5ms
RS=0; //将RS引脚设为低电平,RS = 0(写命令模式)
RW=0; //将RW引脚设为低电平,RW = 0(写操作模式)
DPORT=cmd;// 将待写数据送到数据端口(D0-D7)
E=1; //使能脉冲,LCD锁存D0至D7处的数据并执行命令
_nop_();// 短暂延时1个机器周期1us左右
_nop_();
E=0; //关闭使能释放总线
}
void lcd1602Init() // LCD1602 初始化函数
{
delayNms(20); /*LCD1602的上电初始化时间大约15ms */
lcd1602WriteCmd(0x38); /*设置2行,5x8矩阵,8位模式*/
lcd1602WriteCmd(0x0c); //显示打开,光标关闭
lcd1602WriteCmd(0x06); //数据从左到右以递增顺序写入
lcd1602WriteCmd(0x01);//清屏耗时比较长需要2ms左右,别的命令以nm为单位
delayNms(5);
}
// 内部函数用于设置显示字符起始坐标
void lcd1602WritePos(unsigned char xPos,unsigned char yPos)
{
unsigned char tmp;
xPos&=0x0f; // x位置范围是0~15
yPos&=0x01; // y位置范围是0~1
if(yPos==0) // 显示第一行
tmp=xPos; // 第一行字符地址从 0x00 开始
else
tmp=xPos+0x40; // 第二行字符地址从 0x40 开始
lcd1602WriteCmd(tmp|0x80);//设置 RAM 写入的地址
}
//在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符
void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat)
{
lcd1602WritePos(xPos,yPos);
lcd1602WriteByte(Dat);
}
// 在液晶上显示字符串,xpos:行坐标,ypos:列坐标,str-字符串指针
void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s)
{
unsigned char i=0;
lcd1602WritePos(xPos,yPos); // 起始坐标
while(s[i])
{
lcd1602WriteByte(s[i]);
i++;
if (i>=16) break; // 超出16个字符外的数据丢弃
}
}
main.c
#include<reg51.h>
#include"lcd1602.h"
void main(){
lcd1602Init();
lcd1602WriteChar(7,0,'H');
lcd1602WriteChar(8,0,'i');
lcd1602WriteString(3,1,"2021-03-07");
while(1);
}
猜你喜欢
- 2024-12-18 51驱动电子时钟1602显示 电子时钟51单片机
- 2024-12-18 浅析初次使用LCD1602时都不能一次点亮显示的问题
- 2024-12-18 FlexLua教程三行代码实现IIC PCF8574 串口 1602 单色 LCD 屏显示
- 2024-12-18 LCD1602液晶显示屏应用 液晶显示lcd1602程序
- 2024-12-18 51单片机学习笔记14 LCD1602显示屏使用
- 2024-12-18 STM8 单片机接入1602 LCD 单片机怎么接lcd
- 2024-12-18 Arduino 通过 I2C 驱动 LCD1602 液晶屏
- 2024-12-18 LCD1602屏幕简介(含代码讲解)【超级详细教程】
- 2024-12-18 1602LCD液晶显示屏的显示 1602液晶屏显示原理
- 2024-12-18 Ardrino实例(五)LCD 1602 lcd1602连接arduino接线
你 发表评论:
欢迎- 04-27spring框架怎么实现依赖注入?
- 04-27卸载 Mac 应用程序的 4 种基础方法
- 04-27用户界面框架jQuery EasyUI示例大全之Application
- 04-27win7 64位 server.CreateObject("excel.application")
- 04-27SpringCloud的配置文件bootstrap和application的区别
- 04-27Excel VBA小技巧:用Application.Version判断用户Excel版本
- 04-27JSA宏教程——应用程序(Application)对象事件
- 04-27详解flink 1.11中的新部署模式-Application模式
- 最近发表
-
- spring框架怎么实现依赖注入?
- 卸载 Mac 应用程序的 4 种基础方法
- 用户界面框架jQuery EasyUI示例大全之Application
- win7 64位 server.CreateObject("excel.application")
- SpringCloud的配置文件bootstrap和application的区别
- Excel VBA小技巧:用Application.Version判断用户Excel版本
- JSA宏教程——应用程序(Application)对象事件
- 详解flink 1.11中的新部署模式-Application模式
- 为什么CEO念“C~E~O”,而APP却不能念A~P~P?
- 汇川技术|Inoproshop软件中Application简介及常用功能
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)