您的位置 首页 传感器

128*64 LCD显现驱动程序

//头文件部分#includereg52.h>//======================================================//定义常用符号,LCD控制字符号常

//头文件部分
#include

//======================================================
//界说常用符号,LCD操控字符号常量,TIME0守时赋值常量
#define uchar unsigned char
#define uint unsigned int

#define DISPON 0x3f
#define DISPOFF 0x3e
#define DISPFIRSTLINE 0xc0
#define LCDBUZY 0x80
#define LIMIT 0x80 //128列约束

#define TL0NUMB (65536-50000)%256 //守时50MS,20次溢出为一秒守时中止
#define TH0NUMB (65536-50000)/256
#define TCOUNTF 10

//=========================================================
//界说引脚
sbit lck = P3^5; //锁存信号引脚

//=========================================================
//界说全局变量
uchar combyte; //LCD指令变量
uchar data status; //状态变量,左右半屏标志量
uchar tcount = 0; //约束守时时刻标志
//uchar pagebyte = 0; //上下移页操控量
uchar colbyte = 120; //左右移列操控量

//=========================================================
//界说图形参数
uchar code A[]={0xe0, 0x0f, 0xf0, 0x0f, 0x98, 0x00, 0x8c, 0x00, // A,此处的参数是依照列输入来写的,英文内码是依照行输入来写的
0x98, 0x00, 0xf0, 0x0f, 0xe0, 0x0f, 0x00, 0x00};

//=========================================================
//函数原型
void IniLcd(void); //初始化LCD
void ClrLcd(uchar); //清屏LCD
void WrComL(uchar); //写左半屏幕指令字
void WrComR(uchar); //写右半屏幕指令字
void WrData(uchar,uchar,uchar); //写数据
void Locate(uchar,uchar); //LCD屏定位
void delayus(uint); //奇妙级推迟
void delay(void); //推迟个几秒
//void PicturePage(void); //图形下移函数
void PictureCol(void); //图画左移函数

void IniTime0(void); //初始化守时器0,使用MCU的内部守时完结图画的移动进程

//=========================================================
//主程序部分
void main(void)
{
IniLcd();
IniTime0();
while(1); //对LCD的操作
/*{
Picture();
delay();
ClrLcd(0x00);
}*/
}

/******************************************************/
/* 以下部分是LCD12864的驱动模块 */
/******************************************************/

//=========================================================
//初始化守时器0函数
void IniTime0(void)
{
TMOD = 0x01;
//TCON = 0x00;
TL0 = TL0NUMB;
TH0 = TH0NUMB;
TR0 = 1;
ET0 =1;
EA =1;
}

//=========================================================
//守时器中止函数
void Time0(void) interrupt 1
{
TR0 = 0;
TL0 = TL0NUMB;
TH0 = TH0NUMB;
tcount++;
if(tcount == TCOUNTF)
{
tcount = 0;

/*PicturePage();
pagebyte++;
if(pagebyte > 6)
pagebyte = 0;*/

PictureCol();
colbyte–;
}
TR0 = 1;
}

//=========================================================
//初始化LCD函数
void IniLcd(void)
{
combyte = DISPOFF;
WrComL(combyte);
WrComR(combyte);

combyte = DISPON;
WrComL(combyte);
WrComR(combyte);

combyte = DISPFIRSTLINE;
WrComL(combyte);
WrComR(combyte);

ClrLcd(0x00);

/*combyte = DISPFIRSTLINE;
WrComL(combyte);
WrComR(combyte);*/

Locate(0x00,0x00);
}

//=========================================================
//清屏LCD函数
void ClrLcd(uchar cbyte)
{
uchar i,j;
for(i=0;i<8;i++)
{
delayus(6);
for(j=0;j{
delayus(6);
WrData(cbyte,i,j);
}
}
}

//=========================================================
//奇妙级推迟函数
void delayus(uint t)
{
while(t–);
}

//=========================================================
//推迟个几秒函数
void delay(void)
{
delayus(50000);
delayus(50000);
delayus(50000);
delayus(50000);
delayus(50000);
delayus(50000);
}

//=========================================================
//写左半屏幕指令字函数
void WrComL(uchar cbyte)
{
lck = 0;
P1 = 0x29; //E = 1;R/W = 1;D/I = 0; CS1 = 1; CS2 = 0;
lck = 1;
while(P0&LCDBUZY);
lck = 0;
P1 = 0x00; //E = 0;
lck = 0;

lck = 0;
P1 = 0x21; //E = 1;R/W = 0;D/I = 0; CS1 = 1; CS2 = 0;
lck = 1;
P0 = cbyte;
lck = 0;
P1 = 0x00; //E = 0;
lck = 1;
}

//=========================================================
//写右半屏幕指令字函数
void WrComR(uchar cbyte)
{
lck = 0;
P1 = 0x2a; //E = 1;R/W = 1;D/I = 0; CS1 = 0; CS2 = 1;
lck = 1;
while(P0&LCDBUZY);
lck = 0;
P1 = 0x00; //E = 0;
lck = 0;

lck = 0;
P1 = 0x22; //E = 1;R/W = 0;D/I = 0; CS1 = 0; CS2 = 1;
lck = 1;
P0 = cbyte;
lck = 0;
P1 = 0x00; //E = 0;
lck = 1;
}

//=========================================================
//LCD屏幕点定位函数
void Locate(uchar page,uchar col)
{
uchar com_page,com_col,right;
switch(col&0xc0)
{
case 0x00: //左半屏幕
{
right = 0;
break;
}
case 0x40: //右半屏幕
{
right = 1;
break;
}
default: break;
}
com_page = page&0x07|0xb8; //将页数据转换为页指令字
com_col = col&0x3f|0x40; //将列数据转换为列指令字

switch(right)
{
case 0x00: //左半屏幕
{
WrComL(com_page);
WrComL(com_col);
status = 0;
break;
}
case 0x01: //右半屏幕
{
WrComR(com_page);
WrComR(com_col);
status = 1;
break;
}
default: break;
}
}

//=========================================================
//写数据函数
void WrData(uchar databyte,uchar page,uchar col)
{
Locate(page,col);

P0 = databyte;

lck = 0;
if(status)
P1 = 0x26; //E = 1; R/W = 0; D/I = 1; CS1 = 0; CS2 = 1;
else
P1 = 0x25; //E = 1; R/W = 0; D/I = 1; CS1 = 1; CS2 = 0;
lck = 1;

//P0 = databyte;

lck = 0;
P1 = 0x00;
lck = 1;
}

//=========================================================
//图形函数,图画按页下移
/*void PicturePage(void)
{
uchar col,page;
uchar i = 0;
ClrLcd(0x00);
for(col=64;col<72;col++)
{
for(page=pagebyte;page{
WrData(A[i++],page++,col);
}
}
}*/

//=========================================================
//图形左移函数
void PictureCol(void)
{
uchar col,page;
uchar i = 0;
ClrLcd(0x00);
for(col=colbyte;(col=0);) //列操控
{
for(page=0;page<2;page++) //页操控
{
WrData(A[i++],page,col); //写数据,“i++”同步跟新数据
}
col++;
}
if(colbyte==0)
colbyte = 120;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/266158.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部