📄 mdp.c
字号:
/***********************************************************************/
/*显示模块的应用,LCD12864并行接法画波形程序
/*LCD12864点阵高电平亮,低电平暗
/*LCD12864在X轴方向分有上下各8个区(一个屏幕上共有16个区)
/*上半部分有00~07区;下半部分有08~0F区
/*每个区X轴向上有16个点阵;Y轴向上有32个点阵
/*LCD12864写点阵每个区都是先对前面的8个点阵进行操作,再对后8个点阵操作
/* 创作时间 2008.7.31
/************************************************************************/
#include<reg52.h>
#include<intrins.h>
#include<math.h> //调用sin()函数
#define uint unsigned int
#define uchar unsigned char
/************变量定义**************/
uint i,j;
uchar temp,x,y;
/********* LCD12864边线图***********/
sbit RS=P2^5; //数据\命令选择
sbit RW=P2^6; //读\写选择
sbit E=P2^7; //使能
/*************************/
/* 延迟子函数
/*************************/
void delay(uint ms)
{
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
/********************************/
/* LCD12864子函数
/********************************/
//============LCDbegin==========/
/*******检查LCD忙位********/
void check_busy()
{
RS=0; //命令选择
RW=1;
E=1;
P0=0xff;
while((P0&0x80)==0x80); //确定读忙标志位BF为0
E=0;
}
/********LCD写命令子函数*********/
void write_com(uchar com)
{
check_busy(); //检忙
RS=0;
RW=0;
E=1;
P0=com;
delay(2);
E=0;
delay(2);
}
/**********LCD写数据子函数**********/
void write_data(uchar dat)
{
check_busy();
RS=1;
RW=0;
E=1;
P0=dat;
delay(2);
E=0;
delay(2);
}
/********LCD写字符串子函数**********/
void write_str(uchar add,uchar *str)
{
write_com(add);
while(*str!='\0')
{
write_data(*str++);
delay(2);
}
}
/********LCD初始化子函数********/
void init_LCD()
{
write_com(0x30); //选择基本指令集 选择8bit数据流
write_com(0x02); //地址归位
write_com(0x0c); //开显示(无游标、不反白)
write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
write_com(0x01); //清除显示,并且设定地址指针为00H
delay(5);
}
/**************显示坐标(x-y轴)*******************/
void display_XY_line()
{
for(x=0;x<16;x++) //16个区
for(y=0;y<32;y++) //每个区有32行
{
if(x<8&&y==31) //在前八个区的第32行画一条横线---x轴
{
write_com(0x36); //扩充指令集,开绘图功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改变“RE”位元,基本指令集,以下为写数据
//连续对一个区写入两个数据,第一个语句是对前面的8个点写,第二语句是对后面的8个点写
write_data(0xff); //前8个点
write_data(0xff); //后8个点
}
else if(x==0||x==8) //在第零和第八区画一条竖线---y轴
{
write_com(0x36); //扩充指令集,开绘图功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改变“RE”位元,基本指令集,以下为写数据
//连续对一个区写入两个数据,第一个语句是对前面的8个点写,第二语句是对后面的8个点写
write_data(0x80); //前8个点
write_data(0x00); //后8个点
}
else //在除去x轴和y轴的其它个位置写0(即无显示)
{
write_com(0x36); //扩充指令集,开绘图功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改变“RE”位元,基本指令集
//连续对一个区写入两个数据,第一个语句是对前面的8个点写,第二语句是对后面的8个点写
write_data(0x00); //前8个点
write_data(0x00); //后8个点
}
}
write_com(0x34); //扩充指令,关绘图功能
write_com(0x36); //扩充指令,开绘图功能
}
void display_fangbo_line()
{
for(x=0;x<16;x++) //16个区
for(y=0;y<32;y++) //每个区有32行
{
if(x<8&&y==31)
{
write_com(0x36); //扩充指令集,开绘图功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改变“RE”位元,基本指令集,以下为写数据
write_data(0xff); //前8个点
write_data(0xff); //后8个点
}
else if(x>=0&&x<2&&y==0)
{
write_com(0x36); //扩充指令集,开绘图功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改变“RE”位元,基本指令集,以下为写数据
write_data(0xff); //前8个点
write_data(0xff); //后8个点
}
else if(1<x&&x<4&&y==31)
{
write_com(0x36); //扩充指令集,开绘图功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改变“RE”位元,基本指令集,以下为写数据
write_data(0xff); //前8个点
write_data(0xff); //后8个点
}
else if(3<x&&x<6&&y==0)
{
write_com(0x36); //扩充指令集,开绘图功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改变“RE”位元,基本指令集,以下为写数据
write_data(0xff); //前8个点
write_data(0xff); //后8个点
}
else if(5<x&&x<8&&y==31)
{
write_com(0x36);
write_com(0x80+y);
write_com(0x80+x);
write_com(0x30);
write_data(0xff);
write_data(0xff);
}
else if(9<x&&x<12&&y==31)
{
write_com(0x36);
write_com(0x80+y);
write_com(0x80+x);
write_com(0x30);
write_data(0xff);
write_data(0xff);
}
else if(13<x&&x<16&&y==31)
{
write_com(0x36); //扩充指令集,开绘图功能
write_com(0x80+y); //行地址
write_com(0x80+x);
write_com(0x30);
write_data(0xff);
write_data(0xff);
}
else if(x==0||x==8||x==2||x==10||x==4||x==12||x==6||x==14)
{
write_com(0x36);
write_com(0x80+y);
write_com(0x80+x);
write_com(0x30);
write_data(0x80);
write_data(0x00);
}
else if(x==7||x==15)
{
write_com(0x36);
write_com(0x80+y);
write_com(0x80+x);
write_com(0x30);
write_data(0x00);
write_data(0x01);
}
else //在除去x轴和y轴的其它个位置写0(即无显示)
{
write_com(0x36);
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30);
write_data(0x00);
write_data(0x00);
}
}
write_com(0x34); //扩充指令,关绘图功能
write_com(0x36); //扩充指令,开绘图功能
}
/*------------------整屏写入数据:全亮,或者竖条-----------------------------*/
void lcdfill(unsigned char disdata)
{ unsigned char x,y;
for(y=0;y<32;y++)
for(x=0;x<16;x++)
{ write_com(0x36);
write_com(y+0x80); //行地址
write_com(x+0x80); //列地址
write_com(0x30);
write_data(disdata);
write_data(disdata);
}
write_com(0x34);
write_com(0x36);
}
/*************************/
/*主函数
/*************************/
void main(void)
{
init_LCD();
write_com(0x01);
delay(5);
write_str(0x80,"fangbo display") ;
write_str(0x90,"made by qjw222") ;
delay(5000);
write_com(0x01);
lcdfill(0xff);
display_XY_line();
display_fangbo_line();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -