问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于单片机液晶屏LCD12864的程序

发布网友 发布时间:2022-04-30 19:39

我来回答

2个回答

热心网友 时间:2022-06-30 05:49

/*****************************************************************

*程序名称:带汉字库的12864液晶显示模块驱动

*程序功能:显示字符 、汉字和图片

*开发工具:Kile

* MCU型号:AT89S52-24PU

*时钟频率:11.0592MHZ

*程序作者:yuan

*版权说明:yuan

*****************************************************************/
#include<reg52.h>
#include "lcd.h"
#include "util.h"

sbit E=P1^5;//脉冲使能
sbit RW=P1^6;//读写选择
sbit RS=P1^7;//数据命令选择
sbit rst=P3^6;//12864复位

// 延时ms函数:

// 12864检查状态函数:
void Check12864State(void)
{

P0=0xff;
E=0;//读状态前三控制线的状态
RS=0;
RW=1;
E=1;//拉高,读状态
while((P0&0x80)==0x80);//等待空闲
E=0;//写命令后三控制线的状态
RS=1;
RW=0;

}

// 12864写命令函数:
void Write12864Command( unsigned char com)
{

Check12864State();//检查状态
P0=com;//赋值
E=0;//写命令前三控制线的状态
RS=0;
RW=0;
E=1;//拉高,写命令
E=0;//写命令后三控制线的状态
RS=1;
RW=1;

}

//12864写数据函数:
void Write12864Data( unsigned char dat)
{

Check12864State();//检查状态
P0=dat;//赋值
E=0;//写数据前三控制线的状态
RS=1;
RW=0;
E=1;//拉高,写数据
E=0;//写数据后三控制线的状态
RS=0;
RW=1;

}

//在指定的位置显示字符串(汉字和ASCII码字符)函数:
void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)
//y-行数值0-3,x-列数值0-7,pstr-字符串指针
//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
//为了实现自动换行功能,这个函数比较繁琐
{

unsigned char row,n=0;
Write12864Command(0x30);//基本指令
Write12864Command(0x06);//地址计数器自动加以,光标右移
switch(y)//根据行号选择行地址
{

case 0:row=0x80;break;//第一行首地址
case 1:row=0x90;break;//第二行首地址
case 2:row=0x88;break;//第三行首地址
case 3:row=0x98;break;//第四行首地址
default:;

}

Write12864Command(row+x);//写地址
while(*pstr!='\0')
{

Write12864Data(*pstr);//写字符
pstr++;
n++;//计数
if((n+x*2)==16)//如果一行写完 ,继续写第二行
{
if(y==0) Write12864Command(0x90);//写下一行地址
else if(y==1) Write12864Command(0x88);//写下一行地址
else if(y==2) Write12864Command(0x98);//写下一行地址
else ;

}
else if((n+x*2)==32)//如果第二行写完 ,继续写第三行
{

if(y==0) Write12864Command(0x88);//写下一行地址
else if(y==1) Write12864Command(0x98);//写下一行地址
else ;
}

else if((n+x*2)==48)//如果第三行写完 ,继续写第四行
{
if(y==0) Write12864Command(0x98);//写下一行地址
else ;
}
else ;
}

}

//图片模式清屏函数:
void Clear12864Screen()
{

unsigned char i,j;
Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令
Write12864Command(0x36);//使用扩充指令,绘图显示控制
for(i=0;i<32;i++)

//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,

//也就是说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推

{

Write12864Command(0x80|i);//写行地址(垂直地址)
Write12864Command(0x80);//写列地址(水平地址)
for(j=0;j<32;j++)
Write12864Data(0x00);//清屏

}

}

//在任意位置显示任意大小的图片函数:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char *pp)

//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),

//px-图片宽度,py-图片高度,pp-指针指向图片数组

//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐

{

unsigned char i,j,k;
Clear12864Screen();//清屏
if(y<32)//如果起始行在上半屏
{

k=32-y;//算出上半屏的行数
for(i=0;i<k;i++,y++)//上半屏行数
{
Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|x);//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

y=0;//下半屏起始行,接上半屏继续写数据
for(;i<py;i++,y++)//下半屏剩下的行数
{

Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

}

else //如果起始行在下半屏

{

for(i=0;i<py;i++,y++)//行数
{
Write12864Command(0x80|(y-32));//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

}

}

void Clear12864Text()
{
Write12864Command(0x34);//清屏
DelayMs(5);
Write12864Command(0x30);//清屏
DelayMs(5);
Write12864Command(0x01);//清屏
DelayMs(5);
}

//12864初始化函数:
void Initialize12864()
{

rst=0;//复位12864
DelayMs(30);
rst=1;
DelayMs(20);
Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
Write12864Command(0x08);//显示关
Write12864Command(0x01);//清屏
Write12864Command(0x06);//地址计数器加一、光标右移
Write12864Command(0x0c);//显示开

}

带字库的驱动

热心网友 时间:2022-06-30 05:49

什么意思啊?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
乾隆小时候的书童是谁 下面对句式判断有误的一项是( ) A.当立者乃公子扶苏(判断句) ...为折线,把 折起,使平面 平面 ,连接 (1)求证: ;(2)求二面角 图中由线段OA、AB组成的折线表示的是小明步行所走的路程和时间之间的关... 动态图像粒度粒形分析仪 oppor9splus视频通话怎么开美颜 微信视频聊天怎么开美颜oppor9 谁家出售二手胶囊填充机NJP1200 NJP-1200A硬胶囊填充机仪器特点简介 NJP-1200A硬胶囊填充机仪器参数 LCD 12864怎样和单片机连接? 单片机液晶显示 如何设液晶 和单片机 系统频率 怎么破解限制注册用户使用一个小时的软件 请问1602液晶与单片机的连接方式是串行连接还是并行连接? 单片机1602液晶屏3个脚的作用是什么 单片机控制液晶翻页设计 单片机 LCD 怎样破解需要收费注册的软件 单片机液晶控制,关于直接访问和间接访问 如何破解需要注册的软件 单片机是怎样在液晶上显示字符原理 怎样用pc破解安卓的注册软件啊 如何用单片机控制液晶显示器呀,怎么接线…… 做LCD液晶屏幕跟单片机有没有关系? 注册软件如何破解时间限制软件? 单片机的液晶显示有什么作用? 内存卡内约3GB约大视频文件怎么保存到电脑? 坐月子可以吃莲藕炖排骨吗能不能吃 手机内存用完以后外储存卡怎么用? 公寓属于什么性质的建筑,是公建还是住宅 公寓属于什么建筑? 学生公寓楼是属于住宅建筑还是公共建筑? 老年公寓属于住宅还是公建 宿舍在建筑分类中属于住宅建筑还是公共建筑? 什么是公建式公寓 集体宿舍属于民用建筑还是公共建筑? 公共建筑和居住建筑的区别 agon电脑亮度怎么调 微信里视频号直播怎么授权给别的 在身上抓到白色的小虫子,很小几乎肉眼看不清它的肢体,会咬人,咬在身上奇痒无比。 为什么我的AOC显示频不能调亮度了呢? html5怎么实现div+css二级下拉菜单 html下拉导航栏代码 自媒体怎么借别人的号 html 如何做一个二级联动的下拉表单(select) ultra dma crc 错误计数 学校视频号可以上传他人视频吗 网站栏目怎么出现下拉菜单,就是鼠标放上去怎么显示二级栏目? HTML二级下拉菜单为什么会被覆盖(见内容)