
#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.cLQ12864.c文件中的LCD_P6x8Str()函数就是用来打印字符串的
对void LCD_P6x8Str(unsigned char x,unsigned char y,unsigned char ch[])进行解释:
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 *
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)