打印
[51单片机]

12864画线程序,有没有大佬可以帮我精简一下程序,程序越...

[复制链接]
422|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
13317970316|  楼主 | 2020-11-1 20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <REGX52.H>
#define        uint unsigned int
#define        uchar unsigned char
delay(uint i){while(--i);}
//12864引脚及常数定义
#define lcdDatPort P0  /* LCD12864 数据线 */
sbit cs2= P2^3;    /* 右屏片选,高电平有效 */
sbit cs1= P2^4;    /* 左屏片选,高电平有效 */
sbit en = P2^5;    /* 读,写使能,高电平有效,下沿锁定数据 */
sbit rw = P2^6;    /* 1读\0写 */
sbit rs = P2^7;    /* 1数据\0指令 */
#define addX0 0xB8       /* x地址(0页) */
#define addY0 0x40       /* y地址(0列) */
#define addZ0 0xC0       /* Z地址(0行开始显示) */
#define lcdDispON 0x3F   /* 开显示命令 */

/** LCM忙检测 **/
busy12864(){
lcdDatPort=0xff;   //口线置1,防止干扰
rs=0; rw=1;           //置“命令、读”模式
en=1;
//while(lcdDatPort&0x80); //忙等待,ISIS仿真没有忙信号
en=0;
delay(1);
}
/** 写命令 参数:comDat为要发送的命令 **/
WriteCom(uchar comDat){  
    busy12864();                     //忙,则等待
rs=0;rw=0;                                //置“命令、写”模式
    lcdDatPort=comDat;en=1;en=0;//送出命令,并使之有效
}
/** 写数据 参数:dat为要发送的数据 **/
WriteDat(uchar dat){  
    busy12864();                           //忙,则等待
rs=1;rw=0;                                  //置“数据、写”模式
    lcdDatPort=dat;en=1;en=0;        //送出数据,并使之有效
}
/** 将一字节数据dat写到r行,c列 **/
WriteObjDat(uchar r,uchar c,uchar dat){
if(c<64)cs1=1,cs2=0;        //选择左屏
else cs1=0,cs2=1,c-=64;        //选择右屏
WriteCom(addX0+r);
WriteCom(addY0+c);
WriteDat(dat);
}
/** 读当显示数据 **/
uchar ReadDat(uchar r,uchar c){
uchar temp;
if(c<64)cs1=1,cs2=0;        //选择左屏
else cs1=0,cs2=1,c-=64;        //选择右屏
WriteCom(addX0+r);
WriteCom(addY0+c);
busy12864();
lcdDatPort=0xFF;
rs=1;rw=1;
en=1;en=0;delay(1);          //读空操作
en=1;temp=lcdDatPort;en=0;//正式读数据
return temp;
}
//清屏函数
void clrLCD(){
uchar i,j;
cs1=cs2=1;                           //同时选中左右屏
for(i=0;i<8;i++){           //共8页
  WriteCom(addX0+i);  //光标到i页
  WriteCom(addY0);           //光标到页首
  for(j=0;j<64;j++)WriteDat(0); //写0清屏
}
}
/** 初始化12864 **/
Init12864(){
WriteCom(lcdDispON);  //开显示
WriteCom(addZ0);          //设置显示起始行
clrLCD();                  //清屏
}
/** 画一个点 **/
//画点数据
uchar code dotDat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//画点函数,r行号(0~63),c列号(0~127),add=1,画点,add=0删除点
showDot(uchar r,uchar c,bit add){
if(add)WriteObjDat(r/8,c,ReadDat(r/8,c)|dotDat[r%8]);
else   WriteObjDat(r/8,c,ReadDat(r/8,c)&(~dotDat[r%8]));
}
/** 画矩形,参数:r1,c1,左上角行列号,r2,c2右下角行列号 **/
rect(uchar r1,uchar c1,uchar r2,uchar c2){
uchar i;
for(i=r1;i<=r2;i++){showDot(i,c1,1);showDot(i,c2,1);}
for(i=c1;i<=c2;i++){showDot(r1,i,1);showDot(r2,i,1);}
}
void main(){
Init12864();           //初始化
rect(10,20,40,90);        //画第一个矩形
rect(20,40,60,110);        //画第二个矩形,与第一个交叠
while(1);
}

使用特权

评论回复

相关帖子

沙发
jekey| | 2020-11-1 21:08 | 只看该作者
可以在内存建立一个显示缓冲区,先改变内存内容,再整屏刷新来加快速度。

使用特权

评论回复
板凳
lgwd| | 2020-11-2 12:06 | 只看该作者
目前800×480的4寸屏价格不超过60元,甚至还带触摸。掌握底分辨的屏技术基本用不到高分屏上。还是换高分屏吧!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝