做一个单片机液晶显示数字的程序,程序没错,但是就是屏幕就是没有显示,麻烦大佬们看一看

做一个单片机液晶显示数字的程序,程序没错,但是就是屏幕就是没有显示,麻烦大佬们看一看,第1张

程序只是没有逻辑错误和语法错误,但液晶的控制貌似有些问题。给你一段1602的驱动程序做参考。

#define LCD1602_FLAG

#define LCD1602_PORT P1

#include<reg52.h>

#include<stddef.h>

#include"dtype.h"

sbit lcd1602_rs=P3^7

sbit lcd1602_e=P3^5

sbit lcd1602_rw=P3^6

sbit lcd1602_busy=P1^7

/*

************************************

* 函数名称:lcd1602_CheckBusy()

* 函数功能:状态查询

************************************

*/

void lcd1602_CheckBusy()

{

do

{

lcd1602_busy=1

lcd1602_rs=0

lcd1602_rw=1

lcd1602_e=0

lcd1602_e=1

}

while(lcd1602_busy)

}

/*

***************************************

* 函数名称: lcd1602_WriteCmd()

* 函数功能:写命令

* 入口参数:命令字

* 出口参数:无

***************************************

*/

void lcd1602_WriteCmd(const INT8U cmd)

{

lcd1602_CheckBusy()

lcd1602_rs=0

lcd1602_rw=0

lcd1602_e=1

LCD1602_PORT=cmd

lcd1602_e=0

}

/*

*******************************************

* 函数名称:lcd1602_WriteData()

* 函数功能:写数据

* 入口参数:c--待写数据

* 出口参数或芹:无

*********************************************

*/

void lcd1602_WriteData(const INT8U c)

{

lcd1602_CheckBusy()

lcd1602_rs=1

lcd1602_rw=0

lcd1602_e=1

LCD1602_PORT=c

lcd1602_e=0

}

/*

***********************************************

* 函数名称:lcd1602_Init()

* 函数功能:初始化LCD

* 入口参数:无

* 出口参数:无

***********************************************

*/

void lcd1602_Init()

{

lcd1602_WriteCmd(0x38)//显示模式为8位2行5*7点阵

lcd1602_WriteCmd(0x0f)//display enable,flag enable,flash enable,

lcd1602_WriteCmd(0x06)//flag move to right,screen don't move

lcd1602_WriteCmd(0x01)//clear screen

}

/*

************************************************

* 函数名称:lcd1602_Display()

* 函数功能: 字符显示

* 入口参数:ptr--字符或字符串指针

* 出口参数:无

* 说明:用户可通过念团喊以下方式来调用:

* 1)lcd1602_Display("Hello,world!")

* 2) INT8U 存仔野储类型 txt[]="要显示的字符串"

* 或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'}

* INT8U *ptr

* ptr=&txt

* lcd1602_Display(ptr)

* 或 lcd1602_Display(txt)

* 或 lcd1602_Display(&txt)

************************************************

*/

void lcd1602_Display(const INT8U *ptr)

{

INT8U data i=0

INT8U *data q

q=ptr

lcd1602_WriteCmd(0x80)

while(q!=NULL &&(*q!='\0') &&i<16)

{

lcd1602_WriteData(*q)

q++

i++

}

lcd1602_WriteCmd(0xc0)

while(q!=NULL &&(*q!='\0') &&i>=16 &&i<32)

{

lcd1602_WriteData(*q)

q++

i++

}

}

LCD有哪些寄存器?各核答表示什么含义,控制什么功能?

写出来的程序又如何验证是否正确?

其实,你只需要对LCD的打开、关闭,以及能把一个数据块显示在LCD上就改雹慧行了

“常见字母、数字、符号、中文、自定义字符、图形,以及文字和图形混和显示;光标显示/隐藏(Cursor on/off)、显示字肆尺符闪烁(Display character blink);画面清除(Display clear)、光标归位(Return home)”

这些功能,只需要在这个数据块上进行 *** 作,然后再送到LCD显示。

首先找到液晶屏驱动文件LQ12864.c

LQ12864.c文件中的LCD_P6x8Str()函数就是用来打印字符串的

对void LCD_P6x8Str(unsigned char x,unsigned char y,unsigned char ch[])进行解释:

unsigned char x //x坐标,以像素点为单位

unsigned char y //y坐标,以行为单位

unsigned char ch[] //打印到屏幕上的字符串

例:在屏幕上打印“hello world”

LCD_P6x8Str(0,0,"hello")//x坐标0 第0行打印 "hello"

LCD_P6x8Str(10,3,"world")//x坐标10,第3行打印 "world"

登录后复制

5. LCD_P6x8Str()这个函数中的6x8的意思是,将行宽为6个像素点,列宽为8个像素点的区域作为一个字符的输出区域

6. 例:for循环的嵌套实现如下的3行5列“#”阵

#####

#####

#####

登录后复制

用到的函毕消斗数:

//外循环循环3次,内循环循环5次

for(i = 0i <3i++)//控制行 i代表 y坐标

{

for(j = 0j <5j++)//控制列 j代表 x坐标

{

LCD_P6x8Str(20+j*6,i,“#”)//jx6是字符的宽度,x坐标以像素点为单位

}

登录后复制

解释为什么是i代表y坐标,j代表x坐标:

如图所示,就是LCD的打印方向桥做,每打印一行,横坐标也就是j会移动5次,所以i代表y坐标,j代表x坐标。

解释20+j*6:

20是让第20个手磨像素点作为开始位置,jx6是一个“#”在x轴方向占用6个像素点,为了打印的字符不重叠,每隔j*6个像素点打印一个字符

二、如何自LCD上显示中文

这里用到了字模生成软件

就是图中的软件

配置好用到的一些参数

这样“冰河”这两个字的字模就生成了

3. 打开LCD驱动文件

把字模生成的16进制数复制到

4. 打印汉字“冰河”

LCD_P14x16Str(0,0,"冰河")

登录后复制

三、如何在LCD上画图

同理,用到的是驱动文件中的Draw_BMP()函数

解释函数void Draw_BMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char * bmp)

unsigned char x0,unsigned char y0 //矩形左顶点 x0以像素点位单位 y0以行为单位

unsigned char x1,unsigned char y1 //矩形右下角顶点

unsigned char * bmp //生成的数组

Draw_BMP(32,0,95,6,map)//将屏幕中间的一半作为画纸

// 64 * 56,32到95共有64个像素点,0~6共7行,一行8个像素点,共56个像素点

Draw_BMP(0,0,127,7,map)//将这个屏幕作为画纸

// 128 *


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12359216.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存