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

📄 lcd1602_4h._h

📁 非常经典的基于AVR m16的DS18B20 C 程序 !1
💻 _H
字号:
/*******************************************
*    机柜控制器22版LCD1602联接库函数	   *
*    LCD1602操作库函数,4位数据联接关系:  *
*	 LCD1602:DB4-DB7 __ M16:PA4-PA7		   *
*	 LCD1602:RS _______ M16:PA2			   *
*	 LCD1602:E ________	M16:PA3			   *
*	 LCD1602:R/W ______	GND				   *
*	 时钟频率:外部7.3728M晶体			   * 
*	 作    者:tonghe  					   *
*	 日	   期:2007年3月31日			   *
*******************************************/
#include <iom16v.h>
#include <macros.h>

//LCD相关端口定义
#define RS1602 PA2 					//RS接在PORTA.2上
#define E1602 PA3					//E接在PORTA.3上
#define LCD_CON PORTA				//控制接在PA口
#define CLR_RS LCD_CON&=~(1<<RS1602)//RS清0
#define SET_RS LCD_CON|=1<<RS1602	//RS置1
#define CLR_E LCD_CON&=~(1<<E1602)	//E清0
#define SET_E LCD_CON|=1<<E1602		//E置1
#define LCD_DATA PORTA				//数据接在PA口
//简化宏定义
#define uchar unsigned char
#define uint unsigned int

//延时函数1:入口i,需要定时的时长
void delay_ms(uint i)  			  	//在7.3728M时钟下为i ms
    {
	uint j;
	for(;i;i--)
	   {
	   for(j=1220;j;j--)
	      {;}
	   }
    }

//延时函数2:入口i,需要定时的时长
void delay_us(uint i)  			  	//在7.3728M时钟下为i us
    {
	uint j=i*4;
	for(;j;j--)
	   {
	   ;
	   }
    }
	
/*************************************
*         LCD1602操作函数组			 *
*************************************/
//写数据到LCD的函数:入口data,需写入的显示数据
void lcd_da(uchar data)
   {
   uchar a;
   SET_RS;				    		//RS置高,写数据
   delay_ms(1);
   SET_E;
   a=data|0x0F;						//将低四位置1,保留高4位
   LCD_DATA=((LCD_DATA|0xF0)&a);	//数据高4位送端口
   delay_us(50);
   CLR_E;							//E下降沿写入数据
   delay_us(50);					//延时50uS
   
   SET_E;
   a=((data<<4)|0x0F);				//将低四位移到高四位并保留
   LCD_DATA=((LCD_DATA|0xF0)&a);	//数据低4位送端口
   delay_us(50);
   CLR_E;							//E下降沿写入数据
   delay_us(50);					//延时50uS
   } 

//写指令到LCD的函数:入口data,需写入的控制指令
void lcd_comm(uchar data)
   {
   uchar a;
   CLR_RS;				 			//RS清0,写指令
   delay_us(50);					//延时50uS
   SET_E;
   a=data|0x0F;						//将低四位置1,保留高4位
   LCD_DATA=((LCD_DATA|0xF0)&a);	//指令高4位送端口
   delay_us(50);
   CLR_E;							//E下降沿写入指令
   delay_us(50);					//延时50uS
   
   SET_E;
   a=((data<<4)|0x0F);				//将低四位移到高四位并保留
   LCD_DATA=((LCD_DATA|0xF0)&a);	//指令低4位送端口
   delay_us(50);
   CLR_E;							//E下降沿写入指令
   delay_us(50);					//延时50uS
   }
//数据在LCD上显示   
void xs_lcd(void)
   {
   lcd_comm(0x80);			 	 	 //写指令:第1行地址
   lcd_da(0x32); 				 	 //留3个空格,使显示数据居中
   lcd_da(0x33); 
   lcd_da(0x31); 
   lcd_da(0x32);		 		 	 //显示世纪位:2
   lcd_da(0x38);		 		 	 //0

   lcd_comm(0xC0);			 		 //写指令:第2行地址
   lcd_da(39);				 		 //留1个空格

   lcd_da(20);						 //时间与星期间留1空格
   lcd_da('W');						 //星期的前导字
   lcd_da('e');
   lcd_da('e');
   lcd_da('k');
   }
   
//LCD1602初始化函数
void lcd_init(void)
   {
   lcd_comm(0x20);			 		 //写指令:4位数据
//   delay_us(80);   
   lcd_comm(0x28);			 		 //写指令:4位数据、2行显示、5*8点阵
   delay_us(80);
   lcd_comm(0x0C);			 		 //写指令:显示开
   delay_us(80);
   lcd_comm(0x06);			 		 //写指令:自左向右显示
   delay_us(80);
//   lcd_comm(0x14);			 	 //写指令:移动
   delay_us(80);
//   delay_ms(10);
//   lcd_comm(0x80);			 	 //写指令:第1行地址
//   delay_ms(5);		
   lcd_comm(0x01);			 		 //写指令:CLS
   delay_ms(5);
   }

//清屏指令函数
void cls(void)
   {
   lcd_comm(0x01);
   delay_ms(5);
   }

//定位指令函数
void locate(uchar a,uchar b)
   {
   uchar x;
   if(a==1)
	 x=0x80+b-1;
   if(a==2)
     x=0xC0+b-1;
   lcd_comm(x);
   delay_us(80);
   }
//显示函数
void lcd(uchar i)
   {
   lcd_da(i);
   }

⌨️ 快捷键说明

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