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

📄 lcd_dot.c

📁 关于51单片机的点阵LCD汇编源代码。中间说明了I/O口的连接关系。
💻 C
字号:
/////////////////////////////////////////////////////////////////////
///////////硬件连线说明:WR--AB4、RD--AB5、数据口0~7--DB0~DB7
///////////              C/D---AB6、FS--AB7、CE--OUTIO2
/////////////////////////////////////////////////////////////////////
#pragma	large
#include <reg51.h>
#include <string.h>
#define COMW_ADD  ((unsigned char volatile xdata *)(0xE060))// 指令口写地址
#define COMR_ADD  ((unsigned char volatile xdata *)(0xE050))// 指令口读地址
#define DATW_ADD  ((unsigned char volatile xdata *)(0xE020))// 数据口写地址
#define DATR_ADD  ((unsigned char volatile xdata *)(0xE010))// 数据口读地址

char CM;						//指令寄存器
char DT;						//数据寄存器

extern int  addr;				//地址
extern unsigned char show_com;
extern char   char_data;
extern unsigned char   bmp_dat[1028];
int  			Start_addr;

void lcd_dot_init(void);
void Show_dot(unsigned char Y,unsigned char X);
void Show_text(unsigned char line,unsigned char col,unsigned char i);
void Show_string(unsigned char line,unsigned char col,unsigned char *string);
void Show_han(unsigned char line,unsigned char col,unsigned char *ch);
void clear_LCD();
void WRITE_COM(void);
void WRITE_DAT(void);
void Set_ADD();
void Get_dot_ADD(unsigned char Y,unsigned char X);
void Get_show_com(unsigned char i);
void lcd_delay();
void Show_int_num_dot(unsigned char line,unsigned char col,unsigned int temp,char wei,unsigned char float_);

char State_0_1_test();
char State_2_test();

void lcd_dot_init(void)
{ 

////////////////////////////清屏///////////////////////////////
clear_LCD();

//////////////////////Set text home address 0x2000////////////
DT=0x00;
WRITE_DAT();
DT=0x04;
WRITE_DAT();
CM=0x40;
WRITE_COM();

///////////////////////Set text area///////////////////////////
DT=0x10;
WRITE_DAT();
DT=0x00;
WRITE_DAT();
CM=0x41;
WRITE_COM();

  
/////////////////////Set graphic home address 0x0000////////////
DT=0x00;
WRITE_DAT();
DT=0x00;
WRITE_DAT();
CM=0x42;
WRITE_COM();


/////////////////////Set graphic area////////////////////////////
DT=0x10;
WRITE_DAT();
DT=0x00;
WRITE_DAT();
CM=0x43;
WRITE_COM();


/////////////////////Mode set////////////////////////////////////
CM=0x80;
WRITE_COM();

////////////////////Display mode//////////////////////////////////
CM=0x9c;
WRITE_COM();

}


/////////////////////////////////////LCD点显示///////////////////////////////////////  
//(Y,X)为坐标值,左下方为(0,0);Y为纵向坐标:(0~255),X为横向坐标:(0~127)
/////////////////////////////////////////////////////////////////////////////////////
void Show_dot(unsigned char Y,unsigned char X) 
{ 
	Start_addr=0;
	Get_dot_ADD(Y,X);		//获取显示地址
	Set_ADD();				//建立地址
	Get_show_com(X);		//获取显示数据
	CM=show_com;            //传送数值
   	WRITE_COM();
}


////////////////////////////////////LCD字符显示///////////////////  /////////////////
//(line,col)为坐标值,左上方为(0,0);line为行数:(0~7),col为列数:(0~15)
/////////////////////////////////////////////////////////////////////////////////////
void Show_text(unsigned char line,unsigned char col,unsigned char i)
{
	Start_addr=0x0400;
	addr=Start_addr+16*line+col;//获取显示地址
	Set_ADD();	//建立地址
	DT=i;
	*DATW_ADD=DT;
	CM=0xC4;
	WRITE_COM();
}



////////////////////////////////////LCD字符串显示///////////////////  /////////////////
//(line,col)为坐标值,左上方为(0,0);line为行数:(0~7),col为列数:(0~15)
/////////////////////////////////////////////////////////////////////////////////////
void   Show_string(unsigned char line,unsigned char col,unsigned char *string)
{
unsigned char str_len;
unsigned char cnt;
str_len=strlen(string);
for(cnt=0;cnt<str_len-1;cnt++)
{
	Show_text(line,col+cnt,string[cnt]-32);
}

}



/////////////////////////////////////LCD汉字显示/////////////////////////////////////  
//(line,col)为坐标值,左上方为(0,0);line为行数:(0~63),col为列数:(0~7)
/////////////////////////////////////////////////////////////////////////////////////
void Show_han(unsigned char line,unsigned char col,unsigned char *ch)
{
	unsigned char cnt;
	Start_addr=0x0000;
	addr=Start_addr+16*line+col*2;		//获取显示地址
	
	for(cnt=0;cnt<32;cnt+=2)
	{
	Set_ADD();							//建立地址
	CM=0xB0;
	WRITE_COM();
		DT=ch[cnt];             		//传送数值
   		WRITE_DAT();
	 	DT=ch[cnt+1];             		//传送数值
   		WRITE_DAT();
	CM=0xB2;
	WRITE_COM();
	addr+=16;
	}
	addr=0;
	Set_ADD();
}

/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////LCD图形显示/////////////////////////////////////  
/////////////////////////////////////////////////////////////////////////////////////
void Show_bmp()
{
	int i;
//////显示图形
	DT=0x00;
	WRITE_DAT();
	DT=0x00;
	WRITE_DAT();
	CM=0x24;
	WRITE_COM();

	CM=0xB0;
	WRITE_COM();
	for(i=0;i<1024;i++)
	 {
		DT=bmp_dat[i];            		 //传送数值
   		WRITE_DAT();
	 }
	CM=0xB2;
	WRITE_COM();
	addr=0;
	Set_ADD();
}



////////////////////////写指令代码子程序//////////////////////
void WRITE_COM(void)
{
while(!State_0_1_test()) ;
*COMW_ADD=CM;							//写指令代码
}


/////////////////////////写数据代码子程序/////////////////////
void WRITE_DAT(void)
{
while(!State_0_1_test()) ;
*DATW_ADD=DT;							//写指令代码
}

//////////////////////////判断状态0、1/////////////////////////
char State_0_1_test()
{
	char temp;
	temp=*COMR_ADD;
	temp&=0x03;
	if(temp==0x03) return 1;
	else return 0;
}


///////////////////////////判断状态2////////////////////////////
char State_2_test()
{
	char temp;
	temp=*COMR_ADD;
	temp&=0x04;
	if(temp==0x04) return 1;
	else return 0;
}


////////////////////////////清屏////////////////////////////////
void clear_LCD()
{
	int i;
//////显示数据清零
	DT=0x00;
	WRITE_DAT();
	DT=0x00;
	WRITE_DAT();
	CM=0x24;
	WRITE_COM();

	CM=0xB0;
	WRITE_COM();
	for(i=0;i<2048;i++)
	 {
		DT=0;            		 //传送数值
   		WRITE_DAT();
	 }
	CM=0xB2;
	WRITE_COM();
	addr=0;
	Set_ADD();
}

////////////////////////////设置地址//////////////////////////////
void Set_ADD()
{
char low;
char heigh;
int  addr_temp;
addr_temp=addr;
low=addr_temp;
addr_temp>>=8;
heigh=addr_temp;
DT=low;
WRITE_DAT();
DT=heigh;
WRITE_DAT();
CM=0x24;
WRITE_COM();
}

/////////////////////////////获得点显示地址/////////////////////////
void   Get_dot_ADD(unsigned char Y,unsigned char X)
{
	char temp;
	char add;
   	int  ADDRESS=512;
	temp=Y/4;
	temp-=31;
	add=X/8;
	ADDRESS-=(temp*16);
	ADDRESS+=add;
	addr=Start_addr+ADDRESS;
}

////////////////////////////获得显示点的字符命令show_com/////////////
void Get_show_com(unsigned char i)
{
	char cnt;
	cnt=i%8;
	switch(cnt)
	{
	case 0: show_com=0xFF;break;
	case 1: show_com=0xFE;break;
	case 2: show_com=0xFD;break;
	case 3: show_com=0xFC;break;
	case 4: show_com=0xFB;break;
	case 5: show_com=0xFA;break;
	case 6: show_com=0xF9;break;
	case 7: show_com=0xF8;break;
	default:show_com=F0;
	}	
}

void lcd_delay()
{
int i=2048;
while(i--);
}





void Show_int_num_dot(unsigned char line,unsigned char col,unsigned int temp,char wei,unsigned char float_)
{
	char num[7];
		
		char i;

		for(i=0;i<wei;i++)
		 {
		 num[wei-1-i]=temp%10+48;
		 temp=temp/10;
		 
		 }
		  num[wei+1]='\0';
		   
		   	for(i=wei;i>=float_;i--)   
		   {
		   	num[i]=num[i-1];
		   	if(i==float_)
			num[i]='.';
		   }
		   Show_string(line,col,num);
}
























































































































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -