标题:
LCD12864显示变量,显示数字 单片机程序
[打印本页]
作者:
magica1
时间:
2023-10-20 15:37
标题:
LCD12864显示变量,显示数字 单片机程序
最近想用LCD12864显示变量,但是商家并没有提供此函数,在网上找了好久,终于找到了,稍微改进了一下
单片机源程序如下:
lcd12864.c如下
#include "lcd12864.h"
//LCD初始化
void lcd12864_init(void)
{
LCD12864_PSB = 1; //选择8位或4位并口方式
lcd12864_write_cmd(0x30); //显示模式设置,开始要求每次检测忙信号
lcd12864_write_cmd(0x01); //显示清屏
lcd12864_write_cmd(0x06); //显示光标移动设置
lcd12864_write_cmd(0x0C); //显示开及光标设置
}
//写指令
void lcd12864_write_cmd(u8 cmd)
{
LCD12864_RS = 0;
LCD12864_WR = 0;
LCD12864_E = 0;
LCD12864_DATAPORT = cmd;
delay_ms(1);
LCD12864_E = 1;
delay_ms(1);
LCD12864_E = 0;
}
//写数据
void lcd12864_write_data(u8 dat)
{
LCD12864_RS = 1;
LCD12864_WR = 0;
LCD12864_E = 0;
LCD12864_DATAPORT = dat;
delay_ms(1);
LCD12864_E = 1;
delay_ms(1);
LCD12864_E = 0;
}
//清屏
void lcd12864_clear(void)
{
lcd12864_write_cmd(0x01); //显示清屏
}
/*******************************************************************************
* 函 数 名 : lcd12864_show_char
* 函数功能 : LCD12864显示一个字符
* 输 入 : x,y:显示坐标,x=0~7,y=0~3;
DData:显示的字符
* 输 出 : 无
*******************************************************************************/
void lcd12864_show_char(u8 X, u8 Y, u8 DData)
{
if(Y<=0)Y=0;
if(Y>3)Y=3;
X &= 0x0F; //限制X不能大于16,Y不能大于1
switch (Y) {
case 0:
X |= 0x80;
break;
case 1:
X |= 0x90;
break;
case 2:
X |= 0x88;
break;
case 3:
X |= 0x98;
break;
}
lcd12864_write_cmd(X); //这里不检测忙信号,发送地址码
lcd12864_write_data(DData);
}
/*******************************************************************************
* 函 数 名 : lcd12864_show_string
* 函数功能 : LCD12864显示字符串
* 输 入 : x,y:显示坐标,x=0~7,y=0~3;
DData:显示字符串数据
* 输 出 : 无
*******************************************************************************/
void lcd12864_show_string(u8 X, u8 Y, u8 *DData)
{
u8 ListLength, X2;
ListLength = 0;
X2 = X;
if(Y<=0)Y=0;
if(Y>3)Y=3;
X &= 0x0F; //限制X不能大于16,Y在1-4之内
switch (Y) {
case 0:
X2 |= 0x80;
break;
case 1:
X2 |= 0x90;
break;
case 2:
X2 |= 0x88;
break;
case 3:
X2 |= 0x98;
break;
}
lcd12864_write_cmd(X2); //发送地址码
while (DData[ListLength] >= 0x20) { //若到达字串尾则退出
if (X <= 0x0F) { //X坐标应小于0x0F
lcd12864_write_data(DData[ListLength]);
ListLength++;
X++;
delay_ms(5);
}
}
}
/*******************************************************************************
* 函 数 名 : lcd12864_show_num
* 函数功能 : LCD12864显示数字
* 输 入 : x,y:显示坐标,x=0~7,y=0~3;
number:显示字符串数据
Length:要显示数字的长度
* 输 出 : 无
*******************************************************************************/
void lcd12864_show_num(u8 X, u8 Y, u32 number, u8 Length)
{
u8 array[11];
u8 i;
array[Length] = 0;
for (i = Length; i > 0; i--) {
array[i - 1] = number % 10 + '0';
number /= 10;
}
for (i = 0; i < Length - 1; i++) {
if (array == '0') {
array = ' ';
}
else {
break;
}
}
lcd12864_show_string(X, Y, array);
}
/*******************************************************************************
* 函 数 名 : lcd12864_show_image
* 函数功能 : LCD12864显示图片
* 输 入 : DData:要显示的图片
阴码,顺向(高位在前),逐行
* 输 出 : 无
*******************************************************************************/
void lcd12864_show_image(u8 code *DData)
{
u8 x, y, i;
u16 tmp = 0;
for(i = 0; i < 9; i+=8) //分两屏,上半屏和下半屏
{
for(x=0; x<32; x++)
{
lcd12864_write_cmd(0x34);
lcd12864_write_cmd(0x80+x); //列地址
lcd12864_write_cmd(0x80+i); //行地址,下半屏
for(y=0;y<16;y++)
{
lcd12864_write_data(DData[tmp+y]); //读取数据写入LCD
}
tmp +=16;
}
}
lcd12864_write_cmd(0x36); //扩充功能设定
lcd12864_write_cmd(0x30);
}
lcd12864.h如下
#ifndef _lcd12864_H
#define _lcd12864_H
#include "public.h"
sbit LCD12864_RS=P2^6;//数据命令选择
sbit LCD12864_WR=P2^5;//读写选择
sbit LCD12864_E=P2^7;//使能信号
#define LCD12864_DATAPORT P0 //LCD12864数据端口定义
sbit LCD12864_PSB=P3^2;//8位或4并口/串口选择
void lcd12864_init(void); //LCD初始化
void lcd12864_write_cmd(u8 WCLCD); //写指令
void lcd12864_write_data(u8 WDLCD); //写数据
void lcd12864_clear(void); //清屏
void lcd12864_show_char(u8 X,u8 Y,u8 DData); //显示一个字符
void lcd12864_show_string(u8 X, u8 Y, u8 *DData); //显示一串字符
void lcd12864_show_image(u8 code *DData); //显示图形
void lcd12864_show_num(u8 X, u8 Y, u32 number,u8 Length); //显示一串数字
#endif
public.c
#include "public.h"
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时函数,ms=1时,大约延时1ms
* 输 入 : ms:ms延时时间
* 输 出 : 无
*******************************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
public.h
#ifndef _public_H
#define _public_H
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
typedef unsigned long u32;
void delay_10us(u16 ten_us);
void delay_ms(u16 ms);
#endif
复制代码
原理图: 无
仿真: 无
代码:
lcd12864.zip
(2.54 KB, 下载次数: 19)
2023-10-20 15:35 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1