身价过亿的冰山御萝对小码农说你液晶能显示吗(代码片段)

小码农U 小码农U     2023-01-10     736

关键词:

文章目录

小码农为了御萝,咳咳,为了知识怎么敢说液晶不显示啊

联动文章 身价过亿的冰山御萝的姐姐对小码农说你有大一点的液晶吗

我们要清楚液晶在哪一层,可以很明显的看出在服务层 -Ser

首先我先说一下我这套板子数码管和液晶不是共存的,他们有公用的牛角座,一个用了另一个就不可以用了

数码管牛角座接法

液晶牛角座接法

所以我不好一起演示给你们看,也就是和上一篇博客没有没有什么关系,但是质量这方面我没见过比我好的,除了汪老师

原理图

LCD1602引脚

你们最爱的时序图

写指令函数LCD1602_Write_Cmd

void LCD1602_Write_Cmd(u8 add)//写命令,因为操作的是地址

	LCD1602_RS = 0;
	LCD1602_RW = 1;
	LCD1602_E = 0;
	LCD1602_RW = 0;//我由于没有写这条代码液晶屏一直初始化不成功
	LCD1602_Delay(3);
	LCD1602_E = 1;
	LCD1602_DB = add;
	LCD1602_E = 0;

写数据函数LCD1602_Write_Data

void LCD1602_Write_Data(u8 Data)//写数据

	LCD1602_RS = 1;
	LCD1602_RW = 1;
	LCD1602_E = 0;
	LCD1602_RW = 0;//我由于没有写这条代码液晶屏一直初始化不成功
	LCD1602_Delay(3);
	LCD1602_E = 1;
	LCD1602_DB = Data;	
	LCD1602_E = 0;

1602字符型LCD的写操作过程(R/W为低电平)

1.写命令过程:RS低电平,然后命令加载到D0-D7,E脚产生下降沿,命令即被1602接收并执行

2.写内容过程:RS高电平,然后数据加载到D0-D7,E脚产生下降沿,数据即被1602接收并显示

LCD1602的命令,CGRAM地址和DDRAM地址

1.命令,地址范围是0x00–0x3f。用来操作液晶的硬件配置

2.CGRAM,地址范围0x40–0x7f。用来保存液晶本身没有的其他自定义图像

3.DDRAM,地址范围0x80–0xff。用来保存ASCII码值,通过ASCII码指向自定义CGRAM图像数据首地址或者光刻的CGROM图像数据首地址

LCD的代码控制要求

1.上电之后,必须等待最少15ms才能对LCD写入指令(地址)

2.每条指令都有最低执行时间,请按照耗时要求增加延迟等待时间

3.建议按照以下表格的顺序和耗时,轮流写入指令到LCD,方可顺利初始化

4.其他的写入地址和图像,每个字节都是耗时40微秒

上面初始化好了

初始化函数LCD1602_Init

void LCD1602_Init()

	P4M1 &= 0xf8;
	P4M0 &= 0xf8;//设置液晶RS,RW和E的IO口为标准IO口
	//这时候就根据时序图写时序
	LCD1602_Delay(250);		    //上电后等待至少15ms,才能往LCD写指令
	LCD1602_Delay(250);			//上电后等待至少15ms,才能往LCD写指令
	LCD1602_Write_Cmd(0x38);
	LCD1602_Write_Cmd(0x01);
	LCD1602_Delay(50);
	LCD1602_Write_Cmd(0x02);
	LCD1602_Delay(50);
	LCD1602_Write_Cmd(0x06);
	LCD1602_Write_Cmd(0x0c);
	LCD1602_Write_Cmd(0x14);

我们试着打印一个字符

但是正常人谁记ASCII码呀,所以需要字符和数字之间的转换,直接用字符表示

他后面可以连续的写,字符串的话我写串口这篇博客再细说

这里我们在初始化里面写出来了,这只是用来测试的,真正的是不可能在初始化里面写的,不符合框架式编程要求,所以我们用数组来存储,以后我们操作数组就行了

主文件液晶数据分配

//液晶数据分配
void LCD1602_Allot()//液晶是很慢的一个模块
	//我们一直循环刷就会次次延时,很容易影响其他器件的工作

	static xdata u16 count = 0;
	count++;
	if(count>1000)
	
		count = 0;//超过1000计数器清零
		LCD1602_Display_Ser();
	

我们要清楚数字和字符的区别,不要直接在写数据中直接写数字,要有个起点,0的ASCII就是0x30,所以想要显示出数字,必须加上0x30

我想要变化的数字

所想显示的符号没有,那我们就只能自己写进去了,操作CGRAM

有时候我们还有控制光标

代码

LCD1602_Ser.c

#include "all.h"

//液晶写缓存
u8 xdata LCD1602_Write_Buffer1[16];
u8 xdata LCD1602_Write_Buffer2[16];
//存一个固定的图案℃
u8 code LCD1602_5x8[8] = 0x80,0x00,0x07,0x08,0x80,0x80,0x80,0x07;
//写光标地址
u8 xdata LCD1602_Write_Cursor_Add;

void LCD1602_Delay(u8 len)

	u8 idata i = 0;
	while(len--)
	
		i = 70;
		while(i--);
	



void LCD1602_Write_Cmd(u8 add)//写命令,因为操作的是地址

	LCD1602_RS = 0;
	LCD1602_RW = 1;
	LCD1602_E = 0;
	LCD1602_RW = 0;//我由于没有写这条代码液晶屏一直初始化不成功
	LCD1602_Delay(3);
	LCD1602_E = 1;
	LCD1602_DB = add;
	LCD1602_E = 0;

void LCD1602_Write_Data(u8 Data)//写数据

	LCD1602_RS = 1;
	LCD1602_RW = 1;
	LCD1602_E = 0;
	LCD1602_RW = 0;//我由于没有写这条代码液晶屏一直初始化不成功
	LCD1602_Delay(3);
	LCD1602_E = 1;
	LCD1602_DB = Data;	
	LCD1602_E = 0;


void LCD1602_Init()

	u8 i = 0;
	P4M1 &= 0xf8;
	P4M0 &= 0xf8;//设置液晶RS,RW和E的IO口为标准IO口
	//这时候就根据时序图写时序
	LCD1602_Delay(250);		    //上电后等待至少15ms,才能往LCD写指令
	LCD1602_Delay(250);			//上电后等待至少15ms,才能往LCD写指令
	LCD1602_Write_Cmd(0x38);
	LCD1602_Write_Cmd(0x01);
	LCD1602_Delay(50);
	LCD1602_Write_Cmd(0x02);
	LCD1602_Delay(50);
	LCD1602_Write_Cmd(0x06);
	LCD1602_Write_Cmd(0x0c);
	LCD1602_Write_Cmd(0x14);
	//自定义字符放在初始化里面初始化
	LCD1602_Write_Cmd(0x40);//自定义存储空间自定义地址
	for(i = 0;i<8;i++)//把8个字节所组成的字符记录下来
	
		LCD1602_Write_Data(LCD1602_5x8[i]);
	


//液晶显示服务
void LCD1602_Display_Ser()

	u8 i = 0;
	//第一行可写地址就是0x80
	LCD1602_Write_Cmd(0x80);
	for(i = 0;i<16;i++)//把16个字节刷出去
	
		LCD1602_Write_Data(LCD1602_Write_Buffer1[i]);
	
	//第二行可写地址就是0xc0
	LCD1602_Write_Cmd(0xc0);
	for(i = 0;i<16;i++)
	
		LCD1602_Write_Data(LCD1602_Write_Buffer2[i]);
	
	switch(LCD1602_Write_Cursor_Add)
	
		case 0:
			LCD1602_Write_Cmd(0x0c);//不显示,不闪烁光标
		break;
		case 1:
			LCD1602_Write_Cmd(0xcd);//倒数第3个位置
			LCD1602_Write_Cmd(0x0f);//光标显示闪烁
		break;
	

LCD1602_Ser.h

#ifndef LCD1602_Ser
#define LCD1602_Ser

#define LCD1602_DB  P7//P7是数码管数据总线

sbit LCD1602_RS = P4^0;
sbit LCD1602_RW = P4^1;
sbit LCD1602_E = P4^2;
//外部声明

extern u8 xdata LCD1602_Write_Buffer1[16];
extern u8 xdata LCD1602_Write_Buffer2[16];
extern u8 xdata LCD1602_Write_Cursor_Add;
extern void LCD1602_Init();
extern void LCD1602_Display_Ser();

#endif

main.c

#include "all.h"


//看门狗
void WDT_CONTR_Allot()

	static xdata u16 count = 0;
	count++;
	if(count>100)
		
		count = 0;//超过1000计数器清零
		WDT_CONTR=0x34;	//启动看门狗和喂狗
	

//液晶数据分配
void LCD1602_Allot()//液晶是很慢的一个模块
	//我们一直循环刷就会次次延时,很容易影响其他器件的工作

	static u16 k = 0;
	static xdata u16 count = 0;
	count++;
	if(count>1000)
	
		k++;
		count = 0;//超过1000计数器清零
		LCD1602_Write_Buffer1[0] = 'H';
		LCD1602_Write_Buffer1[1] = 'e';
		LCD1602_Write_Buffer1[2] = 'l';
		LCD1602_Write_Buffer1[3] = 'l';
		LCD1602_Write_Buffer1[4] = 'o';
		LCD1602_Write_Buffer1[5] = ' ';
		LCD1602_Write_Buffer1[6] = 'W';
		LCD1602_Write_Buffer1[7] = 'o';
		LCD1602_Write_Buffer1[8] = 'r';
		LCD1602_Write_Buffer1[9] = 'l';
		LCD1602_Write_Buffer1[10] = 'd';
		LCD1602_Write_Buffer1[11] = ' ';
		LCD1602_Write_Buffer1[12] = ' ';
		LCD1602_Write_Buffer1[13] = ' ';
		LCD1602_Write_Buffer1[14] = ' ';
		LCD1602_Write_Buffer1[15] = ' ';
		
		LCD1602_Write_Buffer2[0] = ' ';
		LCD1602_Write_Buffer2[1] = ' ';
		LCD1602_Write_Buffer2[2] = ' ';
		LCD1602_Write_Buffer2[3] = ' ';
		LCD1602_Write_Buffer2[4] = 'k';
		LCD1602_Write_Buffer2[5] = '=';
		LCD1602_Write_Buffer2[6] = ' ';
		LCD1602_Write_Buffer2[7] = ' ';
		LCD1602_Write_Buffer2[8] = ' ';
		LCD1602_Write_Buffer2[9] = ' ';
		LCD1602_Write_Buffer2[10] = 0;
		LCD1602_Write_Buffer2[11] = ' ';
		LCD1602_Write_Buffer2[12] = ' ';
		LCD1602_Write_Buffer2[13] = ' ';
		LCD1602_Write_Buffer2[14] = ' ';
		LCD1602_Write_Buffer2[15] = ' ';
		
		LCD1602_Write_Cursor_Add = 1;
		LCD1602_Display_Ser();
	



void main()

	
	P3M1 = 0;
	P3M0 = 0;

	LCD1602_Init();
	while(1)
    
		WDT_CONTR_Allot();
		LCD1602_Allot();
	

联动文章 身价过亿的冰山御萝的姐姐对小码农说你有大一点的液晶吗

身价过亿的女总裁对小码农说你按键会了吗(代码片段)

...按键不会吗?==**帝都富豪与富家总裁联动文章[身价过亿的帝都富豪对小码农说预处理学的不错](https://blog.csdn.net/diandengren/article/details/120679417?spm=1001.2014.3001.5502)**==独立按 查看详情

身价过亿的女王对小码农说中断会了吗

文章目录为了女王,咳咳,为了知识敢说中断不会吗?==联动文章[身家过亿的帝都富豪对小码农说你时空复杂度会了吗](https://blog.csdn.net/diandengren/article/details/120736416?spm=1001.2014.3001.5502)==单片机的中断系... 查看详情

身价过亿的帝都富豪对小码农说预处理学的不错(代码片段)

...序环境和预处理==**帝都富豪与富家总裁联动文章[身价过亿的女总裁对小码农说你按键会了吗](https://blog.csdn.net/qq_42832862/article/details/120678330?spm=1001.2014.3001.5502)**==程序的翻译环境和执行环境详解编 查看详情

身价过亿的妖媚子对小码农说串口能传送我的爱吗?(代码片段)

文章目录小码农不敢接受妖媚子(想多活几年),但是串口还是可以传送数据的并行通信串行通信==同步:====异步:==串口通信:收发一个字节(只能用时间来同步)串口通... 查看详情

身价过亿的温柔萝莉对小码农说adc会采集吗(代码片段)

文章目录小码农电压使者怎么敢说不会采集模拟量与单片机的数字量之间的关系模拟量转换成数字的方式逐次比较器ADC的概念一个超级好的例子分享给你们STC内部ADC模块的寄存器这里我们需要采集电池电压(我们用P1.0采集)==... 查看详情

身价过亿的贤淑才女对小码农说pwm可以控制时间长短吗(代码片段)

文章目录为了贤淑妻子,咳咳,贤淑才女,小码农必定让PWM控制时间什么是脉宽调制PWMSPWM简介用定时器和CPU模拟PWM输出新建工程设置一个定时器,定时10us定时器中断服务函数里面,驱动P2.1脚输出PWM==我... 查看详情

身价过亿的灵仙子说你iic没写完也发?

文章目录小码农很硬气说没写完发咋了,你咬我啊I^2^C协议的简单应用I^2^C协议总体概述I^2^C协议规则==I^2^C协议的数据有效性====I^2^C协议的起始信号、停止信号====I^2^C协议的通讯格式==I^2^C协议的数据读写三种方式I^2^C协议单向发... 查看详情

算法大神对小码农说环形链表可以单独拿出来讲讲(代码片段)

文章目录环链环形链表题目分析延伸问题:==1.为什么fast和slow会在环中相遇,会不会有这么一种情况呢。就是在环中一直交错永远遇不上?请证明一下。==证明:==这里就又衍生出了一个问题就是... 查看详情

身家过亿的帝都太子妃参加1024盛典,小码农弟弟为他献上定时器一篇(代码片段)

文章目录身家过亿的帝都太子妃参加1024盛典,小码农弟弟为他献上定时器一篇内部定时器/计数器中断1.定时/计数器的概念==核心图==定时1ms1.时钟12分频(我们使用传统51的速度)T0x12=0(也就是AUXR&am... 查看详情

身家过亿的帝都富豪来参加1024节专属盛典,小码农献上单链表一篇来庆祝盛典(代码片段)

文章目录身家过亿的帝都富豪来参加1024节专属盛典,小码农献上单链表一篇来庆祝盛典顺序表的缺陷链表链表的概念及结构链表的分类**1.单向或者双向****2.带头或者不带头****3.循环或者非循环**链表的实现无头单向单链表节... 查看详情

ce感恩品牌创始人,一个身价过亿的青年企业家

  希文,GE感恩品牌的创始人,90年出生于江苏的一个商业世家。由于自小受到家族的熏陶,希文早早地学会了独立。在他成就自己事业的时候,虽然没有得到家族的支持,但母亲一直教导他把感恩当成自己事业的核心。... 查看详情

算法给小码农topk重瞳双目(代码片段)

文章目录Topk1000个数中找到最大的前十个方式1:方式2:==方式3:==Topk打印函数TopkPrint没有修改的接口见[算法给小码农堆魂器--铁血柔情](https://blog.csdn.net/diandengren/article/details/121218819?spm=1001.2014.300 查看详情

陈晓旭的一生:童年胆怯内向,演红楼梦一夜成名,做生意身价过亿

一直想做一个晓旭的专辑,讲述更多关于晓旭的生平,以及她与红楼梦的故事,分享给更多旭迷和红迷,但因之前陆陆续续写过许多,在我之前的文章里都能找到,这里就不再重复,今天分享一下晓旭人生各个时期的一些小故事... 查看详情

从高中缀学到身价过亿,这个80后值得喝彩!

这是微笑哥8月第2次人物分享。全文6600字,阅读请谨慎。作者|云游小生来源 | 纯洁的微笑转载授权(ID:keeppuresmile)一向怼天怼地的罗永浩,少有人能入他的眼。李想被怼上热搜,老罗头顶着炸药包就上:... 查看详情

郭盛华如今现状如何呢?身价早过亿,网友:期待开直播

...公司关注度是极高的,浏览量达到了数十万。传闻郭盛华身价早已过亿,但他依然十分低调。郭盛华毕业于肇庆市工业贸易学校,计算机科班出身,专业非常对口。他建立亚洲之首联盟,击退国外黑客的侵袭,将不可一世的坏蛋... 查看详情

算法开启小码农双链表血脉(代码片段)

文章目录==也欢迎大家能来到我们小伙伴的社区[慧编程开源俱乐部](https://bbs.csdn.net/forums/mzt)==双链表双链表结构图双链表节点双链表初始化函数ListInit双链表尾插函数ListPushBack双链表打印函数ListPrint双链表尾删函数Lis... 查看详情

算法开启小码农栈血脉(代码片段)

栈栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原... 查看详情

算法开启小码农队列血脉(代码片段)

队列队列的概念及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一... 查看详情