📄 lcd12864.c
字号:
#include<PIC18.h>
#include "def.h"
#include "lib.h"
/*
将整型数据分离开
*/
void data_change(uint data)
{
uint a=data;
display_data[0]=(uchar)(a%10);
a/=10;
display_data[1]=(uchar)(a%10);
a/=10;
display_data[2]=(uchar)(a%10);
a/=10;
display_data[3]=(uchar)(a%10);
}
/*
串行发送一个字节数据
*/
void data_send(uchar data)
{
uchar i,s,temp;
s=data;
sclk=0;
for(i=0;i<8;i++)
{
sclk=0;
delay(1);
temp=s&0x80;
if(temp)
{lcd_di=1;}
else
{lcd_di=0;}
sclk=1;
s=s<<1;
}
}
/*************************************************/
//写命令,串行模式
/*************************************************/
void w_com(unsigned char x)
{
a0=0;
cs1=0;
data_send(x);
}
/*************************************************/
//写数据,串行模式
/*************************************************/
void wdata(unsigned char dat)
{
a0=1;
cs1=0;
data_send(dat);
}
void display_map(
const uchar *mapdata,//显示图形时的数据指针
uchar startpage,//起始页面
uchar endpage,//终止页面
uchar startsege,//起始列
uchar endsege//终止列
)
{
uchar seg,page,const *data= mapdata;;
for(page= startpage;page<= endpage;page++) //写页地址共 8 页 0xb0----0xb8
{
lcd_setpage(page);
lcd_setpage( startsege);
for(seg=startsege;seg<=endsege;seg++)//写列
wdata(*mapdata++);
}
}
void display_ascii( uchar dispnum,//需要显示的字符数
const uchar **dispdata,//指向显示内容地址的指针
uchar startpage,//起始页面
uchar startsege//起始列
)//显示ASCII码
{
uchar num,i;
lcd_setpage(startpage); //设置起始页面和起始位置
lcd_setcol(startsege);
for(num=0;num<dispnum;num++)
{
for(i=0;i<=4;i++) //一个字符有效数据共5列
wdata(*(*( dispdata+num)+i));
wdata(0x00); //补充空余的3列
wdata(0x00);
wdata(0x00);
}
}
void display_hanzi( uchar dispnum,//需要显示的字符数
const uchar **dispdata,//指向显示内容地址的指针
uchar startpage,//起始页面
uchar startsege//起始列
)
{
uchar num,i;
for(num=0;num<dispnum;num++)
{
lcd_setpage(startpage);//写上半行
lcd_setcol(startsege+num<<4);
for(i=0;i<16;i++)
wdata(*(*(dispdata+num)+i));
//wdata(0xff);
lcd_setpage(startpage+1);//页面更改,写下半行
lcd_setcol(startsege+num<<4);
for(i=16;i<32;i++)
wdata(*(*(dispdata+num)+i));
//wdata(0xff);
}
}
/*
用于将SO128*64液晶屏复位
*/
void lcd_rst(void)
{
rst=0;
delay(10);
rst=1;
}
/*
lcd打开还是关断 1:打开 0:关断
*/
void lcd_openclose(uchar i)
{
w_com(0xae|(i&0x01));
}
/*
用于设置页面,0-8,其中第8页只有一行
*/
void lcd_setpage(uchar i)
{
w_com((i&0x0f)|0xb0);
}
/*
用于设置起始行,从0到63,不考虑页面
*/
void lcd_setrow(uchar row)
{
w_com((row&0x3f)|0x40);
}
/*
用于设置开始列,从0-131,其中127后是不能显示的
分高低两个字节写入
*/
void lcd_setcol(uchar i)
{
w_com((i>>4)|0x10);
w_com(i&0x0f);
}
/*
列顺序翻转,左右翻转0:正常 1:翻转
*/
void lcd_colrev(uchar i)
{
w_com(0xa0|(i&0x01));
}
/*
行顺序翻转,上下翻转 0:正常 1;翻转
*/
void lcd_rowrev(uchar i)
{
w_com(0xc0|((i<<3)&0x08));
}
/*
设置对比度 0-7 5V电压下 设置为4比较好
*/
void lcd_setrat(uchar i)
{
w_com(0x20|(i&0x07));
}
/*
设置亮度 0-64;5V电压下设置为0X20比较适中 0x20=32
*/
void lcd_setvol(uchar vol)
{
w_com(0x81);
w_com(vol);
}
/*
黑白翻转 0正常 1翻转
*/
void lcd_nomrev(uchar nomrev)
{
w_com(0xa6|(nomrev&0x01));
}
void lcd_clear(void)
{
uchar page,seg;
for(page=0xb0;page<0xb9;page++) //写页地址共 8 页 0xb0----0xb8
{
lcd_setpage(page);
w_com(0x10); //列地址,高低字节两次写入,从第 0 列开始
w_com(0x00);
for(seg=0;seg<133;seg++)//写 128 列
{ wdata(0x00); }
}
}
void lcd_init(void)
{
lcd_rst();
lcd_openclose(1);
lcd_setpage(0);
lcd_setrow(0);
lcd_setcol(0);
lcd_nomrev(0);
lcd_rowrev(1);
lcd_colrev(0);
lcd_setvol(32);
lcd_setrat(4);
w_com(0x2f);//电源打开
lcd_clear();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -