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

📄 1602driver.c

📁 有人认为液晶不能显示
💻 C
📖 第 1 页 / 共 2 页
字号:

/****************************************/////////////////////////////
/*文件名称:1602driver
 *文件标识:
 *摘	要:LCD 1602 驱动程序,显示内容:数字,英文字符,ascii码符号,
 *			内设有几个子函数  1.显示位置的控制,根据 line ,row 的值设定,随意开始显示的位置
 							  2.显示字符子函数,调用函数,(“要显示的字符”)
							  3.显示数值子函数,调用该函数(整数部分的数值,小数部分的数值)
							  4.显示数值+字符的子函数 调用函数 ((“要显示的字符”,整数,小数,“单位”)
 *作	者:陈军
 *完成日期:20080923
 *
 *
*///////////////////////////////////////***************************************/

#include <reg52.h>

												//各功能设定时候的指令码如下:
const unsigned char CLEAR_SCREEN  = 0X01;
const unsigned char CURSOR_RETURN = 0X02;
const unsigned char MODE_SET	  = 0X06;    	// 完成一个字码传送后,AC自动加1,显示不发生位移
const unsigned char DISPLAY_ON    = 0X0C;		// 开显示,光标不显示,光标所在位置的字符不闪烁
const unsigned char CURSOR_DISPLAY_SHIFT = 0X14;//光标向右移,显示不动,AC自动加1
const unsigned char FUNCTION_SET  = 0X38;		//数据接口宽度为8位,两行显示,5*8点阵字符
const unsigned char CGRAM_ADD_INI = 0X40;		//CGRAM 初始地址设为000000,	
const unsigned char DDRAM_ADD_INI_1 = 0X80;		//DDRAM 初始地址设为1000000
const unsigned char DDRAM_ADD_INI_2 = 0XC0;

const bit E_READ	= 1;						// E=1,读

const bit RS_INST	= 0;						//RS=0,DB7~0,数据操作指向指令寄存器
const bit RS_DATA	= 1;						//RS=1,DB7~0,数据操作指向数据寄存器

const bit RW_READ	= 1;						//此时进行访问的为,读操作
const bit RW_WRITE	= 0;						//此时进行访问的为,写操作 


//端口定义
// P07~P00 对应的为LCD数据窗口的DB7~DB0
sbit 	RS = P2^0;               				//指向指令、数据寄存器的mcu控制端口
sbit    RW = P2^1;								//读写操作控制由 mcu P2^1端口提供
sbit    E  = P2^2;								//读写控制使能信号,由P2^3控制
sbit    BF = P0^7;	

unsigned char code num_dis_code[10]="0123456789";
unsigned char *p_number = &num_dis_code[0]; 

unsigned char code self_definition_char[] = {

	0x06,0x02,0x0a,0x11,0x08,0x12,0x0d,0x00,	//"公"代码
	0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00,    //"元"代码
    0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00,    //"年"代码
    0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,    //"月"代码
    0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,    //"日"代码
    0x00,0x1F,0x15,0x15,0x1B,0x11,0x1F,0x00,    //"四"代码
    0x1F,0x04,0x04,0x1E,0x0A,0x12,0x1F,0x00,    //"五"代码
    0x08,0x04,0x1F,0x00,0x0A,0x11,0x00,0x00,    //"六"代码
    0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,    //"\"代码

    0x01,0x02,0x05,0x02,0x06,0x02,0x02,0x02,    //自定义字符
    0x04,0x0A,0x1F,0x04,0x1F,0x0E,0x15,0x0C,    //自定义字符
    0x01,0x0F,0x04,0x02,0x01,0x02,0x04,0x08,    //自定义字符
    0x00,0x1E,0x08,0x10,0x00,0x10,0x08,0x06,    //自定义字符
    0x0F,0x12,0x0F,0x04,0x0F,0x00,0x0F,0x00,    //自定义字符
    0x1F,0x12,0x1C,0x10,0x1E,0x10,0x1F,0x10,    //自定义字符
};			 

												//unsigned char *p_number = "0123456789";

unsigned char k;
//unsigned char start_positon;

unsigned char second=0;    		/*相应的位置上要显示的字符,时分秒,10*(时,分,秒)*/
unsigned char ten_second=0;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
unsigned char miniute=0;
unsigned char ten_miniute=0;
unsigned char hour=0;
unsigned char ten_hour=0;												//char code int2charLCD[]="0123456789";
///////////////////////////////////////////////////////////////////////////////

void fun_wait_bf(void)                        ///读,等待,busy标志位,busy=0 方可进行操作
{
	RS = RS_INST;
	RW = RW_READ;
	E  = E_READ;
	while (BF)
	{
	}
}

void fun_write_e(void)                      //制造一个E 的上升沿,能够为写数据服务
{
	E=0;
	E=0;
	E=1;
	E=1;
	E=0;
	E=0;	
}


void fun_write_instruction(unsigned char instruction_data)//函数1—写命令
{
	fun_wait_bf();							//在开始操作前,确定bf,负责等待到 lcd 模块空闲后再操作
	RS = RS_INST;							//指向指令寄存器
	RW = RW_WRITE;							//写操作控制
	P0 = instruction_data;	//将命令送如IO口				//具体指令码送P0口,即DB7~DB0
	fun_write_e();							// e制造一个xia升沿,让指令写入,lcd模块的内部寄存器
}

void fun_write_data(unsigned char data_data)  //函数2-写数据
{
	fun_wait_bf();							//在开始操作前,确定bf,负责等待到 lcd 模块空闲后再操作
	RS = RS_DATA;							//指向数据寄存器
	RW = RW_WRITE;							//写操作控制
	P0 = data_data;							//具体数据送P0口,即DB7~DB0
	fun_write_e();							// e制造一个上升沿,让数据写入,lcd模块的内部寄存器
}

/*
 *函数介绍: .显示位置的控制,根据 line ,row 的值设定,随意开始显示的位置
 *输入参数: line 行 =1,2   row =0~15.
 *输出参数:
 *返回值  :
*/



void fun_display_position(unsigned char line,unsigned char row)  //
{
	unsigned char start_position = 0;
	
	if (line == 1)
	{
	start_position = DDRAM_ADD_INI_1 + row;				//开始位置设定在 第一行,根据row定第几列
	}
	
	if (line == 2 )
	{
	start_position = DDRAM_ADD_INI_2 + row;				//开始位置设定在 第二行,根据row定第几列
	}
	
	fun_write_instruction(start_position);//--读写数据位置命令
}





void fun_display_char(unsigned char *p_char)      //函数3-显示字符   //显示字符符子函数
{
		while (*p_char)								//指针指向要显示字符的首地址,只要字符就传送字符对应的字模
	{												//直到指针找不到字符为止,判断为要传送的字符结束。					
		fun_write_data(*p_char);
		p_char++;	
	}


}



void fun_display_num4(unsigned long int zhengshu)//函数4-显示整数
{
	unsigned char ge,shi,bai,qian;
		

	if ((zhengshu>=1000) && (zhengshu<=9999))			//数值再10的3次方以上
	{
		
		
		qian     = zhengshu/1000;
		bai      = (zhengshu%1000)/100;
		shi      = (zhengshu%100)/10;
		ge	     = (zhengshu%10);
		
		p_number = &num_dis_code[0]+qian;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+bai;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);	
	}
	
	if ((zhengshu>=100) && (zhengshu<=999))				//数值再10的2次方以上
	{
		
		
		bai      = zhengshu/100;
		shi      = (zhengshu%100)/10;
		ge	     = (zhengshu%10);

		p_number = &num_dis_code[0]+bai;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);	
	}	
	
	if ((zhengshu>=10) && (zhengshu<=99))				//数值再10的1次方以上
	{
		
		
		shi      = zhengshu/10;
		ge	     = (zhengshu%10);
	
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);		
	}
	
	if ((zhengshu>=0) && (zhengshu<=9))					//只有个位
	{
		
		ge	     = (zhengshu%10);
	
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);
	}
	

}

/*************************************************************************
 *函数介绍:显示数值子函数,调用该函数(整数部分的数值,小数部分的数值),
			
 *输入参数:整数部分的最大值,显示为10000000,小数部分显示3位,
 
 *输出参数:小数部分,输入0,显示 。000, 输入123 显示 。123,以此类推
 *返回值  :
*/////////////////////////////////////////////////////////////////////


void fun_display_num_dot(unsigned long int zhengshu,unsigned int dot)
{
	unsigned char ge,shi,bai,qian,wang,wang10,wang100,wang1000,dot1,dot01,dot001;
	
	if ((zhengshu>=10000000) && (zhengshu<99999999))			//数值再10的7次方以上
	{
		
		wang1000 = zhengshu/10000000;                 			//取各个数量级位,          
		wang100  = (zhengshu%10000000)/1000000;
		wang10   = (zhengshu%1000000)/100000;
		wang     = (zhengshu%100000)/10000;
		qian     = (zhengshu%10000)/1000;
		bai      = (zhengshu%1000)/100;
		shi      = (zhengshu%100)/10;
		ge	     = (zhengshu%10);
		
		p_number = &num_dis_code[0]+wang1000;					//显示各个数量级位置
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+wang100;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+wang10;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+wang;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+qian;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+bai;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);
	}

	if ((zhengshu>=1000000) && (zhengshu<9999999))				//数值再10的6次方以上
	{
		
		
		wang100  = zhengshu/1000000;                            //
		wang10   = (zhengshu%1000000)/100000;
		wang     = (zhengshu%100000)/10000;
		qian     = (zhengshu%10000)/1000;
		bai      = (zhengshu%1000)/100;
		shi      = (zhengshu%100)/10;
		ge	     = (zhengshu%10);
	
		p_number = &num_dis_code[0]+wang100;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+wang10;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+wang;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+qian;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+bai;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);
	}	
	
	if ((zhengshu>=100000) && (zhengshu<999999))      //数值再10的5次方以上
	{
		
		
		wang10   = zhengshu/100000;
		wang     = (zhengshu%100000)/10000;
		qian     = (zhengshu%10000)/1000;
		bai      = (zhengshu%1000)/100;
		shi      = (zhengshu%100)/10;
		ge	     = (zhengshu%10);
	
		p_number = &num_dis_code[0]+wang10;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+wang;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+qian;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+bai;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);	
		
		
	}
	
	if ((zhengshu>=10000) && (zhengshu<99999))				//数值再10的4次方以上
	{
		
	
		wang     = zhengshu%100000/10000;
		qian     = (zhengshu%10000)/1000;
		bai      = (zhengshu%1000)/100;
		shi      = (zhengshu%100)/10;
		ge	     = (zhengshu%10);
	
		p_number = &num_dis_code[0]+wang;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+qian;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+bai;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);		
		
	}	

	if ((zhengshu>=1000) && (zhengshu<9999))			//数值再10的3次方以上
	{
		
		
		qian     = zhengshu/1000;
		bai      = (zhengshu%1000)/100;
		shi      = (zhengshu%100)/10;
		ge	     = (zhengshu%10);
		
		p_number = &num_dis_code[0]+qian;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+bai;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);	
	}
	
	if ((zhengshu>=100) && (zhengshu<999))				//数值再10的2次方以上
	{
		
		
		bai      = zhengshu/100;
		shi      = (zhengshu%100)/10;
		ge	     = (zhengshu%10);

		p_number = &num_dis_code[0]+bai;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;
		fun_write_data(*p_number);	
	}	
	
	if ((zhengshu>=10) && (zhengshu<99))				//数值再10的1次方以上
	{
		
		
		shi      = zhengshu/10;
		ge	     = (zhengshu%10);
	
		p_number = &num_dis_code[0]+shi;
		fun_write_data(*p_number);
		p_number = &num_dis_code[0]+ge;

⌨️ 快捷键说明

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