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

📄 lcd1302.c

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

/**************************************************************************
  
                   		THE 1602 CHAR LCD LIB
  
             		COPYRIGHT (c)   2005 BY JJJ.
                       		--  ALL RIGHTS RESERVED  --
  
   File Name:       LCD.h
   Author:          Jiang Jian Jun
   Created:         2005/4/3
   Modified:		NO
   Revision: 		1.0
  
***************************************************************************/

//#ifndef LCD_CHAR_1602_2005_4_9
//#define LCD_CHAR_1602_2005_4_9

//#include <intrins.h>

//Port Definitions**********************************************************
//sbit LcdRs		= P2^0;
//sbit LcdRw		= P2^1;
//sbit LcdEn  	= P2^2;
//sfr  DBPort 	= 0x80;		//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//内部等待函数**************************************************************************
//unsigned char LCD_Wait(void)
/*{
	LcdRs=0;
	LcdRw=1;	_nop_();
	LcdEn=1;	_nop_();
	//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
						 //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
						 //实际硬件时打开此语句
	LcdEn=0;
	return DBPort;		
}*/
//向LCD写入命令或数据************************************************************
//#define LCD_COMMAND			0      // Command
//#define LCD_DATA			1      // Data
//#define LCD_CLEAR_SCREEN	0x01      // 清屏
//#define LCD_HOMING  		0x02      // 光标返回原点
/*void LCD_Write(bit style, unsigned char input)
{
	LcdEn=0;
	LcdRs=style;
	LcdRw=0;		_nop_();
	DBPort=input;	_nop_();//注意顺序
	LcdEn=1;		_nop_();//注意顺序
	LcdEn=0;		_nop_();
	LCD_Wait();	
}
*/
//设置显示模式************************************************************
/*#define LCD_SHOW			0x04    //显示开
#define LCD_HIDE			0x00    //显示关	  

#define LCD_CURSOR			0x02 	//显示光标
#define LCD_NO_CURSOR		0x00    //无光标		     

#define LCD_FLASH			0x01    //光标闪动
#define LCD_NO_FLASH		0x00    //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)
{
	LCD_Write(LCD_COMMAND, 0x08|DisplayMode);	
}
*/
//设置输入模式************************************************************
/*#define LCD_AC_UP			0x02
#define LCD_AC_DOWN			0x00      // default

#define LCD_MOVE			0x01      // 画面可平移
#define LCD_NO_MOVE			0x00      //default

void LCD_SetInput(unsigned char InputMode)
{
	LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
*/
//移动光标或屏幕************************************************************
/*
#define LCD_CURSOR		0x02      
#define LCD_SCREEN		0x08
#define LCD_LEFT		0x00
#define LCD_RIGHT		0x04
void LCD_Move(unsigned char object, unsigned char direction)
{
	if(object==LCD_CURSOR)
		LCD_Write(LCD_COMMAND,0x10|direction);
	if(object==LCD_SCREEN)
		LCD_Write(LCD_COMMAND,0x18|direction);
}
*/
//初始化LCD************************************************************
/*void LCD_Initial()
{
	LcdEn=0;
	LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
	LCD_Write(LCD_COMMAND,0x38);
	LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
	LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
	LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
}
*/
//************************************************************************
/*void GotoXY(unsigned char x, unsigned char y)
{
	if(y==0)
		LCD_Write(LCD_COMMAND,0x80|x);
	if(y==1)
		LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
void Print(unsigned char *str)
{
	while(*str!='\0')
	{
		LCD_Write(LCD_DATA,*str);
		str++;
	}
}*/
/*
void LCD_LoadChar(unsigned char user[8], unsigned char place)
{
	unsigned char i;
	LCD_Write(LCD_COMMAND,0x40|(place*8));
	for(i=0; i<8; i++)
		LCD_Write(LCD_DATA,user[i]);
}
*/
//************************************************************************
//#endif
#ifndef _LCD1602_H_
#define _LCD1602_H_

//输入方式设置
#define LCD_AC_AUTO_INCREMENT     0x06   //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE      0x04   //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE           0x05   //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE        0x04   //数据读、写操作,画面不动
#define LCD_GO_HOME               0x02   //AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON            0x0C         //显示开
#define LCD_DISPLAY_OFF           0x08         //显示关
#define LCD_CURSOR_ON             0x0A         //光标显示
#define LCD_CURSOR_OFF            0x08         //光标不显示
#define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁
#define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE             0x18         //LCD显示左移一位
#define LCD_RIGHT_MOVE            0x1C         //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示
#define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示
#define LCD_CLEAR_SCREEN  0X01   //清屏
/***********************LCD1602地址相关******************************/
#define LINE1_HEAD    0x80   // 第一行DDRAM起始地址 
#define LINE2_HEAD    0xc0   //  第二行DDRAM起始地址
#define LINE1         0      //第一行
#define LINE2         1      //第二行
#define LINE_LENGTH   16     //每行的最大字符长度
/***********************LCD1602接线引脚定义**************************/

#define LCDIO     P0        //定义P2口与LCD1602的数据口相接
  sbit   LCD_RS=P2^0;         
  sbit   LCD_RW=P2^1;         
  sbit   LCD_EN=P2^2;
  sbit  LCD_BUSY=LCDIO^7;
 /**********************另外相关的定*********************************/
 #define HIGH               1
 #define LOW                0   
 #define TURE               1
 #define  FALSE             0
 #define  uchar unsigned char
 #define  uint  unsigned int
 
 /*************************以下是函数的申明部*************************/
 void LCD_init(void);                    //LCD1602初始化
 void LCD_send_command(uchar command);   //
 void LCD_send_data(uchar dat);
 void LCD_write_char(uchar x,uchar y,uchar dat);
 void LCD_disp_string(uchar x,uchar y,uchar *Data);
void LCD_disp_string_code(uchar x,uchar y,uchar code *Data);//mingadd
 void delay_ms(uint n);
 void LCD_check_busy(void);
void GotoXY(unsigned char x, unsigned char y);
void Print(unsigned char *str);
 #endif
 /******************************************************************
 
/#include <reg51.h>
#include "LCD1602.h"
/*******************主函数**********************************/

/**************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++));
  }
 }
}
/****************************************************************/
/********************延时函数***********************************/
  
/***************************************************************/
void delay_ms(uint n)
{
 uint i,j;
 for(i=n;i>0;i--)
    for(j=0;j<1140;j++)
    ;
}
/*********************************************************************/ 

⌨️ 快捷键说明

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