📄 lcd.c
字号:
从24LC256任意位置读出一个字节数据
HAdd-24LC256高7位地址
LAdd-24LC256低8位地址
******************************/
static uchar ReadByte(uchar HAdd,uchar LAdd)
{
uchar x;
start();
WriteData(WTCMD);
WriteData(HAdd);
WriteData(LAdd);
start();
WriteData(RDCMD);
x=ReadData();
noack();
stop();
return x;
}
/*****************************
从LCD的RAM区域读出一个字节数据
CS1-为1表示选中左半屏
cs2-为1表示选中右半屏
page-表示选中的页数,范围0-7
column-表示选中的列数,范围0-64
******************************/
static uchar RLCDtoI2C(bit cs1,bit cs2,uchar tPage,uchar column)
{
uchar rdat;
write_command(cs1,cs2,0x0B8+tPage);
nop();
write_command(cs1,cs2,0x40+column);
nop();
read_data(cs1,cs2);
nop();
rdat = read_data(cs1,cs2);
return rdat;
}
/*****************************
向24LC256任意位置写入一个字节数据
Add为整形的地址量
dat-写入的字节数据
******************************/
extern void WriteByteInt(uint Add,uchar dt)
{
uchar HAdd,LAdd;
LAdd = 0x0FF&Add;
Add = Add>>8;
HAdd = 0x0FF&Add;
WriteByte(HAdd,LAdd,dt);
}
/*****************************
从24LC256任意页读入一页数据
Add为整形的地址量
******************************/
extern uchar ReadByteInt(uint Add)
{
uchar dat;
uchar HAdd,LAdd;
LAdd = 0x0FF&Add;
Add = Add>>8;
HAdd = 0x0FF&Add;
dat = ReadByte(HAdd,LAdd);
return dat;
}
/*****************************
向LCD的RAM区域写入一个字节数据
CS1-为1表示选中左半屏
cs2-为1表示选中右半屏
page-表示选中的页数,范围0-7
column-表示选中的列数,范围0-64
******************************/
extern void WI2CToLCD(bit cs1,bit cs2,uchar page,uchar column,uchar sdat)
{
write_command(cs1,cs2,0x0B8+page);
nop();
write_command(cs1,cs2,0x40+column);
nop();
write_data(cs1,cs2,sdat);
nop();
}
/*****************************
把I2C中的数据写入LCD的RAM区域
page-读入I2C的页数,范围0-31,每页1KB
******************************/
extern void WriteToLCD(uchar page)
{
uint Add=0;
uchar j=0;
uchar i=0;
uchar dat=0;
Add = 1024*page;
for(j=0;j<8;j++)
{
for(i=0;i<64;i++)
{
dat = ReadByteInt(Add+512+i+j*64);
WI2CToLCD(0,1,j,i,dat); //读入的数据写入LCD左半屏
Dyanshi(DTIME);
nop();
dat = ReadByteInt(Add+i+j*64);
WI2CToLCD(1,0,j,i,dat); //读入的数据写入右半屏
Dyanshi(DTIME);
nop();
}
}
}
/*****************************
从LCD的RAM区域写入I2C中
page-写入I2C的页数,范围0-31,每页1KB
******************************/
extern void WriteToI2C(uchar page)
{
uchar dat=0;
uchar ti=0;
uchar dj=0;
uint Add=0;
Add=1024*page; //简化Page*1024 = page<<10
for(dj=0;dj<8;dj++)
{
for(ti=0;ti<64;ti++)
{
nop();
dat = RLCDtoI2C(0,1,dj,ti); //读左半屏
WriteByteInt(Add+512+ti+dj*64,dat);//写入I2C中,j*64
B_DrawLine(64+ti,dj*8,64+ti,(dj+1)*8-1,0);
Dyanshi(DTIME);
nop();
nop();
dat = RLCDtoI2C(1,0,dj,ti); //读右半屏
WriteByteInt(Add+ti+dj*64,dat);//写入I2C中,j<<6 = j*64
B_DrawLine(ti,dj*3,ti,(dj+1)*8-1,0);
Dyanshi(DTIME);
nop();
}
}
}
/*****************************
LCD初始化程序程序
******************************/
extern void init_lcd()
{
write_command(0,1,0x0C0); //set display 1st line
write_command(1,0,0x0C0);
write_command(0,1,0x3F); //open display setting
write_command(1,0,0x3F);
}
/*****************************
绘点函数
x-表示点的X轴坐标
y-表示点的Y轴坐标
color-表示点的颜色
******************************/
extern void draw_pixel(uchar x,uchar y,bit color)
{
bit cs1,cs2;
uchar page,column,rdat,sdat,loc;
if(x<64)
{
cs1 = 1; //判断在哪个半屏内
cs2 = 0;
column = x;
}
else
{
cs1 = 0;
cs2 = 1;
column = x-64;
}
loc = y&0x07;
page = y>>3;
sdat = 1<<loc;
write_command(cs1,cs2,0x0B8+page);
write_command(cs1,cs2,0x40+column);
if(color)
{
read_data(cs1,cs2);
rdat = read_data(cs1,cs2);
sdat = sdat|rdat;
}
else
{
read_data(cs1,cs2);
rdat = read_data(cs1,cs2);
sdat = (~sdat)&rdat;
}
write_command(cs1,cs2,0x0B8+page);
write_command(cs1,cs2,0x40+column);
write_data(cs1,cs2,sdat);
}
/*****************************
全屏显示或者全屏清除
color=1全屏显示,0全屏清除
******************************/
extern void full_display(bit color)
{
uchar i;
for(i=0;i<8;i++)
set_row(i,0,127,color);
}
/*****************************
背光控制
uchCtr=0;关闭Off
uchCtr=1;打开On
uchCtr=2;延时关闭On Time
******************************/
extern void backlight(uchar uchCtr)
{
uchCtr=0x00;//空**************************
}
/*****************************
向LCD写控制命令
CS1=1表示选中LCD的左半屏
CS2=1表示选中LCD的右半屏
command控制数据
******************************/
extern void write_command(bit CS1,bit CS2,uchar command)
{
uchar da;
CSA = CS1;
CSB = CS2;
RS = 0;
RW = 1;
do{
P0 = 0x0FF;
E = 1;
da = P0;
E = 0;
da = da>>7;
da &= 0x01;
}while(da); //busy or not
P0 = command;
RW = 0;
E = 1;
E = 0;
}
/*****************************
向LCD写显示数据
CS1=1表示选中LCD的左半屏
CS2=1表示选中LCD的右半屏
dat显示数据
******************************/
extern void write_data(bit CS1,bit CS2,uchar dat)
{
uchar da;
CSA = CS1;
CSB = CS2;
RS = 0;
RW = 1;
do{
P0 = 0x0FF;
E = 1;
da = P0;
E = 0;
da = da>>7;
da &= 0x01;
}while(da); //busy or not
P0 = dat;
RS = 1;
RW = 0;
E = 1;
E = 0;
}
/*****************************
读LCD的RAM中的数据
CS1=1表示选中LCD的左半屏
CS2=1表示选中LCD的右半屏
******************************/
extern uchar read_data(bit CS1,bit CS2)
{
uchar da;
CSA = CS1;
CSB = CS2;
RS = 0;
RW = 1;
do{
P0 = 0x0FF;
E = 1;
da = P0;
E = 0;
da = da>>7;
da &= 0x01;
}while(da); //busy or not
RS = 1;
P0 = 0x0FF;
E = 1;
da = P0;
E = 0;
return da;
}
/*****************************
显示某一行或者清除某一行
row行值
color=显示行,0清除行
******************************/
extern void set_row(uchar row,uchar Scol,uchar Ecol,bit color)
{
uchar i;
uchar dat;
if(color)
dat = 0x0FF;
else
dat = 0x00;
write_command(0,1,0x0B8+row); //set page address
write_command(1,0,0x0B8+row);
if(Scol<64)
{
if(Ecol<64)
{
write_command(1,0,0x40+Scol); //set column address
for(i=0;i<(Ecol-Scol);i++)
{
write_data(1,0,dat);
}
}
else
{
write_command(1,0,0x40+Scol); //set column address
write_command(0,1,0x40);
for(i=0;i<(64-Scol);i++)
{
write_data(1,0,dat);
}
for(i=0;i<Ecol-63;i++)
{
write_data(0,1,dat);
}
}
}
else
{
write_command(0,1,0x40+Scol-63);
for(i=0;i<(Ecol-Scol);i++)
{
write_data(0,1,dat);
}
}
}
/*
************************************************************
* 文件名: GDRW_API.C *
* 说明: 图形LCD扩展作图函数 *
*
* Copyright 2007 WUSE. ALL RIGHTS RESERVED. *
*
* 作者:张弛
* 时间:2007年3月12日
*************************************************************
*/
/*
**********************************************************************
函数名: B_DrawByte
参数: 点座标(Sx,Sy)范围(X=0-MaxHdots,Y=0-MaxVdots)
ValByte要写入的数据
返回值: 无
作用: 用于在屏幕指定点间点
**********************************************************************
*/
extern void B_DrawByte(uchar Px, uchar Py, uchar ValByte)
{
bit tcs1,tcs2;
uchar tpage,tcolumn;
if(Px<64)
{
tcs1 = 1; //判断在哪个半屏内
tcs2 = 0;
tcolumn = Px;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -