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

📄 lcd1602.c

📁 我做的畢業設計,用AT89S51 控制LCD1602作為顯示. DS1302時鐘芯片顯示時間,DS18B20測量溫度,還有4X4的鍵盤驅動.實現了一個計算功能.可以用PROTUES 仿真軟件仿真,當時
💻 C
字号:

/**************************************************************************

  
   File Name:       LCD.h
   Author:          liao xuming
   Created:         2007/3/23
   Modified:		NO
   Revision: 		1.0
  
***************************************************************************/

#include"LCD1602.h"
#include"keyboard.h"
/***********************LCD1602接线引脚定义**************************/

#define LCDIO     P0        //定义P2口与LCD1602的数据口相接
  sbit   LCD_RS=P2^5;         
  sbit   LCD_RW=P2^6;         
  sbit   LCD_EN=P2^7;
  sbit  LCD_BUSY=LCDIO^7;
 

/**************LCD1602的初始化***************************/
void LCD_init(void)
{LCD_EN=0;
 LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);
 LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);
 LCD_send_command(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
 LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
 LCD_send_command(LCD_CLEAR_SCREEN);
}
/********************************************************/
 
void LCD_check_busy(void)   //检测LCD状态,看它是不是还在忙呢
{
 do
  {
   LCD_EN=0;
   LCD_RS=0;
   LCD_RW=1;
   LCDIO=0xff;
   LCD_EN=1;
   }
 // while(1);
   while(LCD_BUSY==1);   //在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
						 //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
						 //实际硬件时打开此语句
  LCD_EN=0;
}
/************LCD1602写命令*******************************/
void LCD_send_command(uchar command)
{
 LCD_check_busy();
 LCD_RS=LOW;
 LCD_RW=LOW;
 LCD_EN=HIGH;
 LCDIO=command;
 LCD_EN=LOW;
}
/********************************************************/
/*****************LCD1602写数据**************************/
void LCD_send_data(uchar dat)
{
 LCD_check_busy();
 LCD_RS=HIGH;
 LCD_RW=LOW;
 LCD_EN=HIGH;
 LCDIO=dat;
 LCD_EN=LOW;
}
/********************************************************/
 void LCD_write_char(uchar x,uchar y,uchar dat)
{
     unsigned char address;
     if(dat!=KEY_NOTHING+0x30)  //this if is my add for when the time no key down to do not display anything
     {
     if (y == LINE1) 
         address = LINE1_HEAD + x;
     else 
        address = LINE2_HEAD + x;
     LCD_send_command(address); 
    LCD_send_data(dat);
    }
}

void GotoXY(unsigned char x, unsigned char y)
{
	if(y==0)
		LCD_send_command(0x80|x);
	if(y==1)
		LCD_send_command(0x80|(x-0x40));
}


void Print(unsigned char *str)
{
	while(*str!='\0')
	{
		LCD_send_data(*str);
		str++;
	}
}
/******************LCD1602显示字符串*********************/
void LCD_disp_string(uchar x,uchar y,uchar *Data)
{
 if(y==LINE1)
 {
  if(x<LINE_LENGTH)
  {
   LCD_send_command(LINE1_HEAD+x);
   for(;x<LINE_LENGTH&&*Data!='\0';x++)
   {
    LCD_send_data(*(Data++));
   }
   if(*Data!='\0')
   {
    x=0;
    y=LINE2;
   }
  }
 }
 if(y==LINE2)
 {
  LCD_send_command(LINE2_HEAD+x);
  for(;x<LINE_LENGTH&&*Data!='\0';x++)
  {
   LCD_send_data(*(Data++));
  }
 }
}
/****************************************************************/

 //ming add  display code string
/******************LCD1602显示字符串*********************/
void LCD_disp_string_code(uchar x,uchar y,uchar code *Data)
{
 if(y==LINE1)
 {
  if(x<LINE_LENGTH)
  {
   LCD_send_command(LINE1_HEAD+x);
   for(;x<LINE_LENGTH&&*Data!='\0';x++)
   {
    LCD_send_data(*(Data++));
   }
   if(*Data!='\0')
   {
    x=0;
    y=LINE2;
   }
  }
 }
 if(y==LINE2)
 {
  LCD_send_command(LINE2_HEAD+x);
  for(;x<LINE_LENGTH&&*Data!='\0';x++)
  {
   LCD_send_data(*(Data++));
  }
 }
}
/****************************************************************/

⌨️ 快捷键说明

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