原创 51单片机+LCD1602简单显示

2014-11-13 20:47 1016 18 18 分类: MCU/ 嵌入式

LCD1602.h

/*********************************************************** 
文件名称: LCD1602.h
作 者: 终神晓
时间: 2014/11/12/22:48
版 本: V1.0
说 明: LCD1602的头文件
修改记录:
***********************************************************/
#ifndef __LCD1602_H__
#define __LCD1602_H__
 
#include
 
sbit RS = P1^3; /* RS=1,命令;RS=0,数据 */
sbit RW = P1^4; /* RW=1,读;RW=0,写 */
sbit EN = P1^5;  
 
sbit wx = P2^6; /* 数码管与LCD1602管脚冲突 */
sbit dx = P2^7; 
 
#define DataPort P0
 
#define RS_CLR RS = 0
#define RS_SET RS = 1
 
#define RW_CLR RW = 0
#define RW_SET RW = 1
 
#define EN_CLR EN = 0
#define EN_SET EN = 1
 
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
void SMG_Clear_Display(void);
bit LCD1602_Check_Busy(void);
void LCD1602_Write_Command(unsigned char command);
void LCD1602_Write_Data(unsigned char Data);
void LCD1602_Write_Char(unsigned char x,unsigned char y,unsigned char Data);
void LCD1602_Write_String(unsigned char x,unsigned char y,unsigned char *s);
void LCD1602_Clear_Screen(void);
void LCD1602_Init(void);
 
#endif
 
LCD1602.c
 
/*********************************************************** 
文件名称: LCD1602.c
作 者: 终神晓
时间: 2014/11/12/22:48
版 本: V1.0
说 明: LCD1602的驱动函数
基本操作时序:
 
读状态  输入:RS=L,RW=H,E=H                               输出:DB0~DB7=状态字
写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码  输出:无
读数据  输入:RS=H,RW=H,E=H                              输出:DB0~DB7=数据
写数据  输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据   输出:无
修改记录:
***********************************************************/
#include"LCD1602.h" 
#include"intrins.h"
 
/******************us延时函数*******************/
void DelayUs2x(unsigned char t)
{
while(--t); /* T = t x 2 + 5 uS*/
}
 
/******************ms延时函数*******************/
void DelayMs(unsigned char t)
{
while(t--)  /*1ms*/
{
DelayUs2x(245);
DelayUs2x(245);
}
}
/********清除数码管的显示*********************/
void SMG_Clear_Display(void)
{
P0 = 0x00;
wx = 1;
wx = 0;
 
P0 = 0x00;
dx = 1;
dx = 0;
}
 
/****************判忙函数**********************/    
 
bit LCD1602_Check_Busy(void)
{
DataPort = 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
 
EN_SET;
return (bit) (DataPort & 0x80);
}
 
/************写命令函数***********************/
 
void LCD1602_Write_Command(unsigned char command)
{
while(LCD1602_Check_Busy()); /*忙则等待*/
RS_CLR;
RW_CLR;
    EN_SET;
 
DataPort = command;
_nop_();
EN_CLR;
}
 
/***************写数据函数********************/
 
void LCD1602_Write_Data(unsigned char Data)
{
while(LCD1602_Check_Busy()); /*忙则等待*/
RS_SET;
RW_CLR;
    EN_SET;
 
DataPort = Data;
_nop_();
EN_CLR;
}
 
/***************写字符函数*******************/
void LCD1602_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if(y == 0)
{
LCD1602_Write_Command(0x80 + x); /*LCD1602第一行*/
}
else
{
LCD1602_Write_Command(0xC0 + x);   /*LCD1602第二行*/
}
LCD1602_Write_Data(Data);
}
 
/***************写字符串函数*******************/
void LCD1602_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if(y == 0)
{
LCD1602_Write_Command(0x80 + x); /*LCD1602第一行*/
}
else
{
LCD1602_Write_Command(0xC0 + x); /*LCD1602第二行*/
}
while(*s)
{
LCD1602_Write_Data( *s );
s++;
}
}
 
/***************清屏函数*******************/
void LCD1602_Clear_Screen(void)
{
LCD1602_Write_Command(0x01);
DelayMs(5);
}
 
/***************LCD1602初始化函数*******************/
void LCD1602_Init(void)
{
SMG_Clear_Display(); /*清除数码管上的乱码*/
LCD1602_Write_Command(0x38); /*显示模式设置*/
DelayMs(5);
LCD1602_Write_Command(0x38);
DelayMs(5);
LCD1602_Write_Command(0x38);
DelayMs(5);
LCD1602_Write_Command(0x38);
LCD1602_Write_Command(0x08); /*显示关闭*/
LCD1602_Write_Command(0x01);    /*显示清屏*/ 
LCD1602_Write_Command(0x06);   /*显示光标移动设置*/
DelayMs(5);
LCD1602_Write_Command(0x0C); /*显示开及光标设置*/
LCD1602_Clear_Screen(); /*清屏*/
}
 
 
main.c
 
/*********************************************************** 
文件名称: main.c
作 者: 终神晓
时间: 2014/11/12/22:48
版 本: V1.0
说 明: 在LCD1602第一行上显示LCD1602 Display,第二行显示 By Croesus ^_^.
修改记录:
***********************************************************/
#include"reg52.h"
#include"LCD1602.h"
 
void main(void)
{
LCD1602_Init();
while(1)
{
LCD1602_Write_String(0,0,"LCD1602 Display");
LCD1602_Write_String(1,1,"By Croesus");
LCD1602_Write_Char(13,1,'^');
LCD1602_Write_Char(14,1,'_');
LCD1602_Write_Char(15,1,'^');
while(1);
}
}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
18
关闭 站长推荐上一条 /3 下一条