⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cm12864_disp_driver.c

📁 该压缩包内还有51单片机常用各类外设驱动C程序源码(128*64点阵屏
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -