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

📄 text1.c

📁 51单片机C语言编写的LCD1602的驱动程序
💻 C
字号:
#include <REG51RC2.h>
#include <intrins.h>
unsigned char  COM  ;  		//command register
unsigned char  DAT	;		//data register

/*unsigned char code CGTAB[64]={	0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,     	//"年"代码=00H 
           					    0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00,     	//"月"代码=01H
           						0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,     	//"日"代码=02H
           						0x11,0x0A,0x04,0x1F,0x04,0x1F,0x04,0x00,     	//"$"代码=03H
           						0x0E,0x00,0x1F,0x0A,0x0A,0x0A,0x13,0x00,     	//"元"代码=04H
           						0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,    	//"℃"代码=05H
           			 			0x04,0x0A,0x15,0x04,0x04,0x04,0x04,0x00,     	//"↑"代码=06H
           			 			0x17,0x15,0x15,0x15,0x15,0x15,0x17,0x00};       //"10"代码=07H*/
unsigned char code sanjiaobo[]={0x00,0x04,0xa0,0x11,0x00,0x00,0x00,0x00,		//第一行
								0x00,0x00,0x00,0x00,0x11,0xa0,0x04,0x00,		//第二行	
								0x00,0x04,0xa0,0x11,0x00,0x00,0x00,0x00,		//第三行
								0x00,0x00,0x00,0x00,0x11,0xa0,0x04,0x00,		//第四行
								0x00,0x04,0xa0,0x11,0x00,0x00,0x00,0x00,		//第五行
								0x00,0x00,0x00,0x00,0x11,0xa0,0x04,0x00,		//第六行
								0x00,0x04,0xa0,0x11,0x00,0x00,0x00,0x00,		//第七行
								0x00,0x00,0x00,0x00,0x11,0xa0,0x04,0x00,		//第八行
								};

unsigned char code Tab_z[12]={0x42,0x43,0x44,0x41,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

sbit 	Rs = P3^4;
sbit	RW = P3^5;
sbit 	E  = P3^6;


void Delay(unsigned int ms)
{
	unsigned int i;
	while(ms--)
	{
   		for(i = 0; i< 250; i++){
    			_nop_();
    			_nop_();
    			_nop_();
    			_nop_();
   		}
	}
}

unsigned char ReadCommand(void)
{
	unsigned char iData;
	Rs=0;
	RW=1;
	E=1;			//延迟一段时间,建立控制信号
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	iData=P1;
	return iData;
}

void WriteCommand(unsigned char command)
{
	unsigned char wCom,rCom;

	wCom=command;
	rCom=ReadCommand();
	rCom=rCom&0x80;
	while(rCom!=0){				//it is busy
		rCom=ReadCommand();
		rCom=rCom&0x80;
	}
	//it is not busy

	P1=wCom;
	RW=0;
	Rs=0;
	E=0;					//延迟一段时间,来建立信号

	_nop_();
	_nop_();
	E=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	E = 0; 
}

unsigned char ReadData(void)
{
	unsigned char rData,rCom;
	rCom=ReadCommand();
	rCom=rCom&0x80;
	while(rCom!=0){				//it is busy
		rCom=ReadCommand();
		rCom=rCom&0x80;
	}
	//it is not busy
	RW=1;
	Rs=1;
	E=1;//延迟一段时间控制时序
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	rData=P1;
	return rData;
}

void WriteData(unsigned char dat)
{
	unsigned char wData,rCom;
	wData=dat;
	rCom=ReadCommand();
	rCom=rCom&0x80;
	while(rCom!=0){				//it is busy
		rCom=ReadCommand();
		rCom=rCom&0x80;
	}
	//it is not busy

	P1=wData;
	Rs=1;
	RW=0;
	E=0;

	_nop_();
	_nop_();
	_nop_();
	_nop_();
	E=1;				//此时建立高电平准备下降沿,写数据
	_nop_();
	_nop_();			//
	_nop_();
	_nop_();
	E = 0;
}
void LCDPosition(unsigned int pos)
{
	WriteCommand(pos | 0x80);
}
void InitLCD(void)
{
	COM=0x01;
	WriteCommand(COM);
	Delay(1);


	COM=0x38;			//设置工作方式:8位数据接口,两行显示,5*7点阵字符(要显示5*11的数据就要将行显示设置为一行显示)
	WriteCommand(COM);
	Delay(1);

	COM=0x06;			//设置输入方式:数据读、写操作后,AC自动增一,数据读、写操作,画面不动
	WriteCommand(COM);
	Delay(1);

	COM=0x0c;			//设置显示方式:显示开,光标开,闪烁开
	WriteCommand(COM);
	Delay(1);


	COM=0x40;
	WriteCommand(COM);//设置第一次显示地址
	Delay(1);

	COM=0x01;			//清屏
	WriteCommand(COM);
	Delay(1);
}

/*void Creat_CGRAM(void)				//调用自己的字库时如同调用CGROM一样
{
	unsigned char i,j,k,tmp;	

	tmp=0x40;//设置CGRAM地址的格式字   CGRAM地址格式很复杂  01 000 000  其中01是固定的  左起第一个000是代码的大小,最后的000是个偏移量(存储每个代码数据的偏移量)
	k=0; 
	for(j=0;j<8;j++) { 
        for(i=0;i<8;i++) {  
           WriteCommand(tmp+i); // 设置自定义字符的 CGRAM 地址   
           Delay(12);
           WriteData(CGTAB[k]); // 向CGRAM写入自定义字符表的数据 
           k++; 
           Delay(12); 
         } 
        tmp=tmp+8; //写完00H的8个数据后,转入写01H的8个数据  
      } 
}

void Display_input_CGRAM(void)
{
	unsigned char i;

	COM=0x06;			//设置输入方式:数据读、写操作后,AC自动增一,数据读、写操作,画面不动
	WriteCommand(COM);

	COM=0x80;			//设置DDRAM
	WriteCommand(COM);

	for(i=0;i<=8;i++){
		DAT=Tab_z[i];
		WriteData(DAT);
		Delay(10);
	}
}
*/
void main(void)
{
//	unsigned char i;
	unsigned char i,j,k,tmp;
	InitLCD();

	Delay(100);

/*	tmp=0x40;//设置CGRAM地址的格式字   CGRAM地址格式很复杂  01 000 000  其中01是固定的  左起第一个000是代码的大小,最后的000是个偏移量(存储每个代码数据的偏移量)
	k=0; 
	for(j=0;j<8;j++) { 
        for(i=0;i<8;i++) {  
           WriteCommand(tmp+i); // 设置自定义字符的 CGRAM 地址   
           Delay(12);
           WriteData(CGTAB[k]); // 向CGRAM写入自定义字符表的数据 
           k++; 
           Delay(12); 
         } 
        tmp=tmp+8; //写完00H的8个数据后,转入写01H的8个数据  
      } 
	//Creat_CGRAM();
	//Display_input_CGRAM();
	//Delay(1);
	
	COM=0x80;			//设置DDRAM
	WriteCommand(COM);

	LCDPosition(0x00);

	Delay(1);

	for(i=0;i<10;i++){
		DAT=Tab_z[i];
		WriteData(DAT);
	}
	Delay(100);
*/	
	tmp=0x40;//设置CGRAM地址的格式字   CGRAM地址格式很复杂  01 000 000  其中01是固定的  左起第一个000是代码的大小,最后的000是个偏移量(存储每个代码数据的偏移量)
	k=0; 
	for(j=0;j<8;j++) { 
        for(i=0;i<8;i++) {  
           WriteCommand(tmp+i); // 设置自定义字符的 CGRAM 地址   
           Delay(12);
           WriteData(sanjiaobo[k]); // 向CGRAM写入自定义字符表的数据 
           k++; 
           Delay(12); 
         } 
        tmp=tmp+8; //写完00H的8个数据后,转入写01H的8个数据  
      } 

	COM=0x80;			//设置DDRAM
	WriteCommand(COM);

	LCDPosition(0x00);

	Delay(1);

	for(i=0;i<4;i++){
		DAT=Tab_z[i];
		WriteData(DAT);
	}
	
	LCDPosition(0x40);
	for(i=4;i<12;i++){
		DAT=Tab_z[i];
		WriteData(DAT);
	}
	Delay(100);
	while(1);
}

⌨️ 快捷键说明

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