📄 cm12864_disp_driver.c
字号:
#include "AT89S52.h"
#include "config.h"
#include "CM12864_Driver.h"
#include <intrins.h>
//#include <math.h>
#define PI 3.1415926
uchar data LETTER_NUM;
uchar data SPECIES;
uchar code LETTER_BIG_LIB[];
uchar code LETTER_SMALL_LIB[];
uchar code NUMBER_SIGH_LIB[];
uchar data PAGE_BUF;
bit bdata PAGE_FLOW;
bit bdata ENTER_TIME;
bit bdata ENTER_BUF;
/*-------------------------------
查表程序
SPECIES:
0:大写字母
1:小写字母
2:数字/符号
-------------------------------*/
void Letter_Search(uchar letter)
{
switch(letter)
{
case 'A': LETTER_NUM=0;SPECIES=0;break;
case 'B': LETTER_NUM=1;SPECIES=0;break;
case 'C': LETTER_NUM=2;SPECIES=0;break;
case 'D': LETTER_NUM=3;SPECIES=0;break;
case 'E': LETTER_NUM=4;SPECIES=0;break;
case 'F': LETTER_NUM=5;SPECIES=0;break;
case 'G': LETTER_NUM=6;SPECIES=0;break;
case 'H': LETTER_NUM=7;SPECIES=0;break;
case 'I': LETTER_NUM=8;SPECIES=0;break;
case 'J': LETTER_NUM=9;SPECIES=0;break;
case 'K': LETTER_NUM=10;SPECIES=0;break;
case 'L': LETTER_NUM=11;SPECIES=0;break;
case 'M': LETTER_NUM=12;SPECIES=0;break;
case 'N': LETTER_NUM=13;SPECIES=0;break;
case 'O': LETTER_NUM=14;SPECIES=0;break;
case 'P': LETTER_NUM=15;SPECIES=0;break;
case 'Q': LETTER_NUM=16;SPECIES=0;break;
case 'R': LETTER_NUM=17;SPECIES=0;break;
case 'S': LETTER_NUM=18;SPECIES=0;break;
case 'T': LETTER_NUM=19;SPECIES=0;break;
case 'U': LETTER_NUM=20;SPECIES=0;break;
case 'V': LETTER_NUM=21;SPECIES=0;break;
case 'W': LETTER_NUM=22;SPECIES=0;break;
case 'X': LETTER_NUM=23;SPECIES=0;break;
case 'Y': LETTER_NUM=24;SPECIES=0;break;
case 'Z': LETTER_NUM=25;SPECIES=0;break;
case 'a': LETTER_NUM=0;SPECIES=1;break;
case 'b': LETTER_NUM=1;SPECIES=1;break;
case 'c': LETTER_NUM=2;SPECIES=1;break;
case 'd': LETTER_NUM=3;SPECIES=1;break;
case 'e': LETTER_NUM=4;SPECIES=1;break;
case 'f': LETTER_NUM=5;SPECIES=1;break;
case 'g': LETTER_NUM=6;SPECIES=1;break;
case 'h': LETTER_NUM=7;SPECIES=1;break;
case 'i': LETTER_NUM=8;SPECIES=1;break;
case 'j': LETTER_NUM=9;SPECIES=1;break;
case 'k': LETTER_NUM=10;SPECIES=1;break;
case 'l': LETTER_NUM=11;SPECIES=1;break;
case 'm': LETTER_NUM=12;SPECIES=1;break;
case 'n': LETTER_NUM=13;SPECIES=1;break;
case 'o': LETTER_NUM=14;SPECIES=1;break;
case 'p': LETTER_NUM=15;SPECIES=1;break;
case 'q': LETTER_NUM=16;SPECIES=1;break;
case 'r': LETTER_NUM=17;SPECIES=1;break;
case 's': LETTER_NUM=18;SPECIES=1;break;
case 't': LETTER_NUM=19;SPECIES=1;break;
case 'u': LETTER_NUM=20;SPECIES=1;break;
case 'v': LETTER_NUM=21;SPECIES=1;break;
case 'w': LETTER_NUM=22;SPECIES=1;break;
case 'x': LETTER_NUM=23;SPECIES=1;break;
case 'y': LETTER_NUM=24;SPECIES=1;break;
case 'z': LETTER_NUM=25;SPECIES=1;break;
case '0': LETTER_NUM=0;SPECIES=2;break;
case '1': LETTER_NUM=1;SPECIES=2;break;
case '2': LETTER_NUM=2;SPECIES=2;break;
case '3': LETTER_NUM=3;SPECIES=2;break;
case '4': LETTER_NUM=4;SPECIES=2;break;
case '5': LETTER_NUM=5;SPECIES=2;break;
case '6': LETTER_NUM=6;SPECIES=2;break;
case '7': LETTER_NUM=7;SPECIES=2;break;
case '8': LETTER_NUM=8;SPECIES=2;break;
case '9': LETTER_NUM=9;SPECIES=2;break;
case ',': LETTER_NUM=10;SPECIES=2;break;
case '.': LETTER_NUM=11;SPECIES=2;break;
case '/': LETTER_NUM=12;SPECIES=2;break;
case '<': LETTER_NUM=13;SPECIES=2;break;
case '>': LETTER_NUM=14;SPECIES=2;break;
case '?': LETTER_NUM=15;SPECIES=2;break;
case ';': LETTER_NUM=16;SPECIES=2;break;
case ':': LETTER_NUM=17;SPECIES=2;break;
case '"': LETTER_NUM=18;SPECIES=2;break;
case '[': LETTER_NUM=19;SPECIES=2;break;
case ']': LETTER_NUM=20;SPECIES=2;break;
case '{': LETTER_NUM=21;SPECIES=2;break;
case '}': LETTER_NUM=22;SPECIES=2;break;
case '-': LETTER_NUM=23;SPECIES=2;break;
case '=': LETTER_NUM=24;SPECIES=2;break;
case '_': LETTER_NUM=25;SPECIES=2;break;
case '+': LETTER_NUM=26;SPECIES=2;break;
case '|': LETTER_NUM=27;SPECIES=2;break;
case ' ': LETTER_NUM=28;SPECIES=2;break;
case '~': LETTER_NUM=29;SPECIES=2;break;
case '!': LETTER_NUM=30;SPECIES=2;break;
case '@': LETTER_NUM=31;SPECIES=2;break;
case '#': LETTER_NUM=32;SPECIES=2;break;
case '$': LETTER_NUM=33;SPECIES=2;break;
case '%': LETTER_NUM=34;SPECIES=2;break;
case '^': LETTER_NUM=35;SPECIES=2;break;
case '&': LETTER_NUM=36;SPECIES=2;break;
case '*': LETTER_NUM=37;SPECIES=2;break;
case '(': LETTER_NUM=38;SPECIES=2;break;
case ')': LETTER_NUM=39;SPECIES=2;break;
case '\'': LETTER_NUM=40;SPECIES=2;break;
case '\n': LETTER_NUM=41;SPECIES=3;break;
default : break;
}
}
/*----------------------------
填充程序
sth: 填充数据
page:目标起始页(0~7)
column:目标起始列(0~127)
high:页数
length:列数
----------------------------*/
void FillScr(uchar sth,uchar page,uchar column,uchar high,uchar length)
{
uchar data i,j;
for(j=page;j<page+high;j++)
{
for (i=column;i<column+length;i++)
{
Lcd_Wdat(sth,j,i);
}
}
}
/*-------------------------------------------
自动换行程序
-------------------------------------------*/
void Auto_Enter(uchar *page,bit inv)
{
uchar data x,y;
if(ENTER_TIME!=ENTER_BUF)
{
ENTER_BUF=ENTER_TIME;
*page+=2;
x=*page/8;
if(x>0) PAGE_FLOW=1;
y=*page%8;
if(PAGE_FLOW)
{
*page=y;
if(PAGE_BUF!=y)
{
PAGE_BUF=y;
if(inv) FillScr(0xff,y,0,2,128);
else FillScr(0,y,0,2,128);
Lcd_Row(8*(y+2));
}
}
}
}
/*---------------------------------------------
手动换行程序
---------------------------------------------*/
void Manual_Enter(uchar *page,uchar *column,bit inv)
{
uchar data x,y;
*page+=2;
x=*page/8;
if(x>0) PAGE_FLOW=1;
y=*page%8;
if(PAGE_FLOW)
{
*page=y;
if(PAGE_BUF!=y)
{
PAGE_BUF=y;
if(inv) FillScr(0xff,y,0,2,128);
else FillScr(0,y,0,2,128);
Lcd_Row(8*(y+2));
}
}
*column=0;
}
/*------------------------------------
列切换程序
------------------------------------*/
void Column_Shift(uchar *column)
{
uchar data i;
//i=(*column/128;
i=(*column+7)/128;
if(i>0)
{
ENTER_TIME=~ENTER_TIME;
//*column%=128;
*column=0;
}
}
/*------------------------------------
大写字母显示程序
小写字母显示程序
数字/符号显示程序
*Letter_Prt:字库指针
*page:目标页指针
*column:目标列指针
inv :反显开(1)/关(0)
enter:自动换行开(1)/关(0)
------------------------------------*/
void Lib_Disp(uchar *Letter_Prt,uchar *page,uchar *column,bit inv,bit enter)
{
uchar data i;
Column_Shift(column);
for(i=0;i<8;i++)
{
if(enter)
{
Auto_Enter(page,inv);
}
if(inv)
{
Lcd_Wdat(~(*Letter_Prt),*page,*column);
Letter_Prt++;
Lcd_Wdat(~(*Letter_Prt),*page+1,*column);
Letter_Prt++;
}
else
{
Lcd_Wdat(*Letter_Prt,*page,*column);
Letter_Prt++;
Lcd_Wdat(*Letter_Prt,*page+1,*column);
Letter_Prt++;
}
(*column)++;
}
}
/*-----------------------------
8*16 单字符显示程序
字符取模方式:逐列式
letter:字符,例:'A'or'a'or'0'
*page:目标页指针
*column:目标列指针
inv :反显开(1)/关(0)
enter:自动换行开(1)/关(0)
-----------------------------*/
void Letter_Single_Disp(uchar letter,uchar *page,uchar *column,bit inv,bit enter)
{
uchar code*data Letter_Prt;
Letter_Search(letter);
switch(SPECIES)
{
case 0: Letter_Prt=&LETTER_BIG_LIB[LETTER_NUM*16];
Lib_Disp(Letter_Prt,page,column, inv,enter);
break;
case 1: Letter_Prt=&LETTER_SMALL_LIB[LETTER_NUM*16];
Lib_Disp(Letter_Prt,page,column, inv,enter);
break;
case 2: Letter_Prt=&NUMBER_SIGH_LIB[LETTER_NUM*16];
Lib_Disp(Letter_Prt,page,column, inv,enter);
break;
case 3: Manual_Enter(page,column,inv);
break;
default: break;
}
}
/*-----------------------------
8*16 字符串显示程序
字符取模方式:逐列式
*string:字符串指针,例:"Hello World!"
page:目标起始页
column:目标起始列
inv :反显开(1)/关(0)
enter:自动换行开(1)/关(0)
delay:延时开(1)/关(0)
-----------------------------*/
void Letter_String_Disp(uchar *string,uchar page,uchar column,bit inv,bit enter,bit delay)
{
uint data i;
uchar data*data column_prt;
uchar data*data page_prt;
PAGE_BUF=250;//这句一定要写,否则重复使用该函数时会出错!
PAGE_FLOW=0;
ENTER_BUF=0;
ENTER_TIME=0;
column_prt=&column;
page_prt=&page;
while(*string!='\0')
{
Letter_Single_Disp(*string,page_prt,column_prt,inv,enter);
string++;
if(delay) for(i=0;i<10000;i++);
}
}
/*--------------------------------------------------
图形显示程序
*bmp:图形库指针
page:目标起始页
column:目标起始列
height:页数
width:列数
inv :反显开(1)/关(0)
--------------------------------------------------*/
/*
void BmpScr(uchar *bmp,uchar page,uchar column,uchar height,uchar width,bit inv)
{
uchar data i,j;
for(j=page;j<page+high;j++)
{
for (i=column;i<column+length;i++)
{
if(inv) Lcd_Wdat(~(*bmp),j,i);
else Lcd_Wdat(*bmp,j,i);
bmp++;
}
}
}
*/
/*--------------------------------------------------
像素显示程序
x:横坐标(即列)
y:纵坐标(即行)
inv:反显开(1)关(0)
--------------------------------------------------*/
void SetPixel(uchar x,uchar y,bit inv)
{
uchar page,row,column,dat;
page=y/8;
row=y%8;
column=x;
dat=Lcd_Rdat(page,column);//一定要重复读一次,否则读出的数据是垃圾数据
dat=Lcd_Rdat(page,column);
if(inv) dat&=_crol_(0xfe,row);
else dat|=(1<<row);
Lcd_Wdat(dat,page,column);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -