📄 lcd.c
字号:
#define _LCD_
#include "..\Inc\includes.h"
uchar const CCTAB0[]={0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00};
uchar const CCTAB1[]={0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00};
uchar const CCTAB2[]={0x00,0x0C,0x10,0x10,0x10,0x11,0x0E,0x00,0x00,0x18,0x28,0x48,0x88,0x08,0x18,0x00};
uchar const CCTAB3[]={0x00,0x0C,0x10,0x11,0x11,0x12,0x0C,0x00,0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00};
uchar const CCTAB4[]={0x00,0x01,0x02,0x04,0x1F,0x00,0x00,0x00,0x00,0xC0,0x40,0x48,0xF8,0x48,0x48,0x00};
uchar const CCTAB5[]={0x00,0x1F,0x11,0x12,0x12,0x12,0x11,0x00,0x00,0x30,0x08,0x08,0x08,0x08,0xF0,0x00};
uchar const CCTAB6[]={0x00,0x07,0x08,0x11,0x11,0x19,0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x08,0xF0,0x00};
uchar const CCTAB7[]={0x00,0x1C,0x10,0x10,0x13,0x1C,0x10,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00};
uchar const CCTAB8[]={0x00,0x0E,0x11,0x11,0x11,0x11,0x0E,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00};
uchar const CCTAB9[]={0x00,0x0F,0x10,0x10,0x10,0x09,0x07,0x00,0x00,0x00,0x98,0x88,0x88,0x10,0xE0,0x00};
uchar const CCTAB10[]={0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00}; // -
uchar const CCTAB11[]={0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00}; // :
uchar const CCTAB12[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00}; //.
uchar const CCTAB13[]={0x18,0x10,0x10,0x1F,0x10,0x10,0x18,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00,0x00}; // T
uchar const CCTAB14[]={0x00,0x00,0x03,0x1B,0x0F,0x07,0x03,0x00,0x00,0x00,0x80,0xB0,0xE0,0xC0,0x80,0x00}; // ->
uchar const CCTAB15[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04}; // _
uchar const CCTAB16[]={0x04,0x04,0x03,0x1F,0x03,0x04,0x04,0x00,0x80,0x80,0x00,0xE0,0x00,0x80,0x80,0x00};//*
uchar const CCTAB17[]={0x00,0x00,0x07,0x18,0x0E,0x01,0x00,0x00,0x10,0x70,0x90,0x80,0x80,0xD0,0x30,0x10};//A
uchar const CCTAB18[]={0x10,0x1F,0x12,0x12,0x12,0x0D,0x00,0x00,0x10,0xF0,0x10,0x10,0x10,0x20,0xE0,0x00};//B
uchar const CCTAB19[]={0x07,0x08,0x10,0x10,0x10,0x10,0x1C,0x00,0xC0,0x20,0x10,0x10,0x10,0x20,0x40,0x00};//C
uchar const CCTAB20[]={0x10,0x1F,0x10,0x10,0x10,0x08,0x07,0x00,0x10,0xF0,0x10,0x10,0x10,0x20,0xC0,0x00};//D
uchar const CCTAB21[]={0x10,0x1F,0x11,0x11,0x13,0x10,0x08,0x00,0x10,0xF0,0x10,0x10,0x90,0x10,0x20,0x00};//E
uchar const CCTAB22[]={0x10,0x1F,0x11,0x11,0x13,0x10,0x08,0x00,0x10,0xF0,0x10,0x00,0x80,0x00,0x00,0x00};//F
uchar const CCTAB23[]={0x10,0x1F,0x11,0x01,0x01,0x11,0x1F,0x10,0x10,0xF0,0x10,0x00,0x00,0x10,0xF0,0x10};//H
uchar const CCTAB24[]={0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x00,0x08,0x30,0xC0,0x00,0x00,0x00,0x00};// /
uchar const CCTAB25[]={0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//-
uchar const CCTAB26[]={0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x00};//+
uchar const CCTAB[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// 5*8
uchar const CCTAB0A[]={0x7E,0x81,0x81,0x81,0x7E};
uchar const CCTAB1A[]={0x00,0x41,0xFF,0x01,0x00};
uchar const CCTAB2A[]={0x63,0x85,0x89,0x91,0x61};
uchar const CCTAB3A[]={0x42,0x81,0x91,0x91,0x6E};
uchar const CCTAB4A[]={0x08,0x34,0x44,0xFF,0x05};
uchar const CCTAB5A[]={0xF2,0x91,0x91,0x91,0x8E};
uchar const CCTAB6A[]={0x7E,0x91,0x91,0xD1,0x0E};
uchar const CCTAB7A[]={0xC0,0x80,0x9F,0xE0,0x80};
uchar const CCTAB8A[]={0x6E,0x91,0x91,0x91,0x6E};
uchar const CCTAB9A[]={0x70,0x8B,0x89,0x89,0x7E};
/*********************************************************************************************************
* 函数名称:write_number_5_8
*
* 功能描述:在指定的坐标写入一个数字0-9,不为0-9的数字显示空白
*
* 说明:
*
********************************************************************************************************/
void write_number_5_8(uchar x,uchar y,uchar num)
{
KS0108B_c=0;
KS0108B_i=0;
switch(num)
{
case 0:p=CCTAB0A;break;
case 1:p=CCTAB1A;break;
case 2:p=CCTAB2A;break;
case 3:p=CCTAB3A;break;
case 4:p=CCTAB4A;break;
case 5:p=CCTAB5A;break;
case 6:p=CCTAB6A;break;
case 7:p=CCTAB7A;break;
case 8:p=CCTAB8A;break;
case 9:p=CCTAB9A;break;
default:p=CCTAB;break;
}
write_word(x,y,p,5,8);
}
/*********************************************************************************************************
* 函数名称:write_number
*
* 功能描述:在指定的位置写数字0-9 大于10的为字符 大于30显示空白
*
* 说明:
*
********************************************************************************************************/
void write_number(uchar x,uchar y,uchar num)
{
KS0108B_c=0;
KS0108B_i=0;
switch(num)
{
case 0:p=CCTAB0;break;
case 1:p=CCTAB1;break;
case 2:p=CCTAB2;break;
case 3:p=CCTAB3;break;
case 4:p=CCTAB4;break;
case 5:p=CCTAB5;break;
case 6:p=CCTAB6;break;
case 7:p=CCTAB7;break;
case 8:p=CCTAB8;break;
case 9:p=CCTAB9;break;
case 10:p=CCTAB10;break;
case 11:p=CCTAB11;break;
case 12:p=CCTAB12;break;
case 13:p=CCTAB13;break;
case 14:p=CCTAB14;break;
case 15:p=CCTAB15;break;
case 16:p=CCTAB16;break;
case 17:p=CCTAB17;break;
case 18:p=CCTAB18;break;
case 19:p=CCTAB19;break;
case 20:p=CCTAB20;break;
case 21:p=CCTAB21;break;
case 22:p=CCTAB22;break;
case 23:p=CCTAB23;break;
case 24:p=CCTAB24;break;
case 25:p=CCTAB25;break;
case 26:p=CCTAB26;break;
default:p=CCTAB;break;
}
write_word(x,y,p,8,16);
}
void write_number_OK(uchar x,uchar y,uchar num)
{
KS0108B_c=0;
KS0108B_i=0;
switch(num)
{
case 0:p=CCTAB0;break;
case 1:p=CCTAB1;break;
case 2:p=CCTAB2;break;
case 3:p=CCTAB3;break;
case 4:p=CCTAB4;break;
case 5:p=CCTAB5;break;
case 6:p=CCTAB6;break;
case 7:p=CCTAB7;break;
case 8:p=CCTAB8;break;
case 9:p=CCTAB9;break;
case 10:p=CCTAB17;break;
case 11:p=CCTAB18;break;
case 12:p=CCTAB19;break;
case 13:p=CCTAB20;break;
case 14:p=CCTAB21;break;
case 15:p=CCTAB22;break;
default:p=CCTAB; break;
}
write_word(x,y,p,8,16);
}
/*********************************************************************************************************
* 函数名称:write_number_black
*
* 功能描述:反写的数字
*
* 说明:
*
********************************************************************************************************/
void write_number_black(uchar x,uchar y,uchar num)
{
KS0108B_c=0;
KS0108B_i=0;
switch(num)
{
case 0:p=CCTAB0;break;
case 1:p=CCTAB1;break;
case 2:p=CCTAB2;break;
case 3:p=CCTAB3;break;
case 4:p=CCTAB4;break;
case 5:p=CCTAB5;break;
case 6:p=CCTAB6;break;
case 7:p=CCTAB7;break;
case 8:p=CCTAB8;break;
case 9:p=CCTAB9;break;
case 10:p=CCTAB10;break;
case 11:p=CCTAB11;break;
case 12:p=CCTAB12;break;
case 13:p=CCTAB13;break;
case 14:p=CCTAB14;break;
case 15:p=CCTAB15;break;
case 16:p=CCTAB16;break;
case 17:p=CCTAB17;break;
case 18:p=CCTAB18;break;
case 19:p=CCTAB19;break;
case 20:p=CCTAB20;break;
case 21:p=CCTAB21;break;
case 22:p=CCTAB22;break;
case 23:p=CCTAB23;break;
case 24:p=CCTAB24;break;
case 25:p=CCTAB25;break;
case 26:p=CCTAB26;break;
default:p=CCTAB;break;
}
write_word_black(x,y,p,8,16);
}
/*********************************************************************************************************
* 函数名称:write_word
*
* 功能描述:在指定的位置写一个指定大小的汉字
*
* 说明:
*
********************************************************************************************************/
void write_word(uchar x,uchar y,uchar const *p,uchar wordx,uchar wordy)
{
uchar const *q;
uchar count,cul,page,k,cl,m,d;
uchar flag=0,lg=0;
cul=x;cl=x;k=0;m=0;d=0;page=0;
if(KS0108B_i==0) {head=p;q=p;}
else q=p+KS0108B_i-wordx;
p=p+KS0108B_i;
count=wordx;
if(wordx+x>=128) return;
page=y/8;
KS0108B_COM=(page&0x07)|(0xb8); //页面设置
PRL0();
PRR0();
if(cl>=64) {flag=1;cul=cl-64;} //右区
KS0108B_COM=(0x40)|cul; //列设置
if(flag==0) PRL0();
else PRR0();
while(count--) //循环次数
{
KS0108B_DAT=*p; //写显示数据
KS0108B_DAT=invert(KS0108B_DAT);
if(m=y%8)
{
lg=1;
KS0108B_DAT=(KS0108B_DAT<<m);
if(KS0108B_c)
{
k=invert(*q);
d=k>>(8-m);
KS0108B_DAT=(KS0108B_DAT|d);
q++;
}
}
if(flag) PRR1();else PRL1();
cl++;p++;
if((cl>=64)&&(!flag))
{flag=1;KS0108B_COM=0x40;PRR0();} //左转右(超出左区)
else if(cl>=128) return; //超出范围
}
KS0108B_i+=wordx;y+=8; KS0108B_c++;
if(KS0108B_c<(wordy/8)) write_word(x,y,head,wordx,wordy);
else if((KS0108B_c==(wordy/8))&&lg)
{
flag=0; page++;
if(page>7) return;
KS0108B_COM=(page&0x07)|(0xb8); //页面设置
PRL0();
PRR0();
count=wordx;cl=x;
if(x>=64) {flag=1;cul=x-64;}
KS0108B_COM=(0x40)|cul; //列设置
if(flag==0) PRL0(); else PRR0();
while(count--)
{
k=invert(*q);
if(flag) PRR2(); else PRL2();
if(flag) PRR2(); else PRL2();
KS0108B_DAT=(KS0108B_DAT>>m)<<m;
k=(k>>(8-m));
KS0108B_DAT=KS0108B_DAT|k;
cul=cl;
if(cul>=64) {flag=1;cul=cul-64;}
KS0108B_COM=(0x40)|cul; //列设置
if(flag==0) PRL0();else PRR0();
if(flag) PRR1();else PRL1();
q++;cl++;
if((cl>=64)&&(!flag)) {flag=1;KS0108B_COM=0x40;PRR0();}
else if(cl>=128) return;
}
KS0108B_c=0;KS0108B_i=0;return;
}
else {KS0108B_c=0;KS0108B_i=0;return;}
}
/*********************************************************************************************************
* 函数名称:write_word_black
*
* 功能描述:在指定的位置反写汉字
*
* 说明:
*
********************************************************************************************************/
void write_word_black(uchar x,uchar y,uchar const *p,uchar wordx,uchar wordy)
{
uchar const *q;
uchar count,cul,page,k,cl,m,d;
uchar flag=0,lg=0;
cul=x;cl=x;k=0;m=0;d=0;page=0;
if(KS0108B_i==0) {head=p;q=p;}else q=p+KS0108B_i-wordx;
p=p+KS0108B_i;
count=wordx;
if(wordx+x>=128) return;
page=y/8;
KS0108B_COM=(page&0x07)|(0xb8); //页面设置
PRL0(); PRR0();
if(cl>=64) {flag=1;cul=cl-64;} //右区
KS0108B_COM=(0x40)|cul; //列设置
if(flag==0) PRL0();else PRR0();
while(count--) //循环次数
{
KS0108B_DAT=(*p); //写显示数据
KS0108B_DAT=(~KS0108B_DAT);
KS0108B_DAT=invert(KS0108B_DAT);
if(m=y%8)
{
lg=1;
KS0108B_DAT=(KS0108B_DAT<<m);
if(KS0108B_c)
{
k=invert(*q);
k=(~k);
d=k>>(8-m);
KS0108B_DAT=(KS0108B_DAT|d);
q++;
}
}
if(flag) PRR1();else PRL1();
cl++;p++;
if((cl>=64)&&(!flag))
{
flag=1;
KS0108B_COM=0x40;
PRR0();
} //左转右(超出左区)
else if(cl>=128) return; //超出范围
}
KS0108B_i+=wordx;y+=8;KS0108B_c++;
if(KS0108B_c<(wordy/8)) write_word_black(x,y,head,wordx,wordy);
else if((KS0108B_c==(wordy/8))&&lg)
{
flag=0;
page++;
if(page>7) return;
KS0108B_COM=(page&0x07)|(0xb8); //页面设置
PRL0(); PRR0();
count=wordx;cl=x;
if(x>=64) {flag=1;cul=x-64;}
KS0108B_COM=(0x40)|cul; //列设置
if(flag==0) PRL0(); else PRR0();
while(count--)
{
k=invert(*q);
k=(~k);
if(flag) PRR2(); else PRL2();
if(flag) PRR2(); else PRL2();
KS0108B_DAT=(KS0108B_DAT>>m)<<m;
k=(k>>(8-m));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -