微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LCD1602的C8051驱动

LCD1602的C8051驱动

时间:11-23 来源:互联网 点击:
//--------------------lcd1602.c------------------------------

//**********************************************
// 功能:C8051F(330) LCD1602(4线驱动
//**********************************************
#include
#include "delay.h"
//

//12 345678910 11 12 13 1415 16

// |||||||
//|---| |||||---------------------| |--|
//VSS VDD VL RS RW ED0 D1 D2 D3 D4 D5 D6 D7 B+ B-

//
//连接:
//RS->P0.1
//RW->P0.2
//E->P0.3
//D4~D7->P1.4~P1.7
//VL根据不同型号,可能要接VSS或VDD
//B+/B-->+5/GND
//VSS/VDD->GND/+3.3

sbit lcd_rs=P0^1;
sbit lcd_rw=P0^2;
sbit lcd_e=P0^3;
#define LCD_DAT P1
//HD44780指令
#define LCD_CLEAR 0x01

//清屏
#define LCD_HOME 0x02

//光标复位
#define LCD_SET_INPUT 0x06

//输入模式:AC+1,显示不移
#define LCD_DISPLAY_OFF 0x80
#define LCD_DISPLAY_ON 0x0c
#define LCD_SHIFT 0x14

//显示屏和光标移动:AC+1,光标右移1格
#define LCD_MODE_8 0x38
#define LCD_MODE_4 0x28
//unsigned char lcd_add=0x00;
void lcd_write_cmd(unsigned char dat)
{
lcd_rs=0;
lcd_rw=0;
lcd_e=1;
LCD_DAT=dat;
delay_us(1);
lcd_e=0;
//delay_us(50);
delay_us(1);
lcd_e=1;
LCD_DAT=dat<4;
delay_us(1);
lcd_e=0;
delay_us(50);
}
void lcd_sendchar(unsigned char dat)
{
lcd_rs=1;
lcd_rw=0;
lcd_e=1;
LCD_DAT=dat;
delay_us(1);
lcd_e=0;
//delay_us(50);
delay_us(1);
lcd_e=1;
LCD_DAT=dat<4;
delay_us(1);
lcd_e=0;
delay_us(50);
}
//

//void lcd_wait_busy(void)
//{
//lcd_rs=0;
//lcd_rw=1;
//lcd_e=1;
//while(LCD_DAT&0x80);
//lcd_e=0;
//delay_us(50);
//}

void lcd_init(void)
{
lcd_e=0;
delay_ms(15);
lcd_write_cmd(LCD_MODE_8);
delay_ms(5);
lcd_write_cmd(LCD_MODE_8);
delay_ms(5);
lcd_write_cmd(LCD_MODE_8);
lcd_write_cmd(LCD_MODE_4);
//delay_us(50);
lcd_write_cmd(LCD_DISPLAY_ON);
//delay_us(50);
lcd_write_cmd(LCD_CLEAR);
delay_ms(2);
lcd_write_cmd(LCD_SET_INPUT);
//delay_us(50);
}
void lcd_reset(void)
{
lcd_write_cmd(LCD_CLEAR);
delay_ms(2);
lcd_write_cmd(LCD_HOME);
delay_ms(2);
}
void lcd_setadd(unsigned char add)
{
if(add>0x0f)add+=0x30;
lcd_write_cmd(add|0x80);
}
void lcd_sendstr(unsigned char add,unsigned char *dat)
{
lcd_setadd(add);
while(*dat)
{
lcd_sendchar(*dat++);
}
}
//-----------------------------------------------------------------
//----------------------lcd1602.h---------------------------------
#ifndef _LCD_1602
#define _LCD_1602
extern void lcd_write_cmd(unsigned char dat);
extern void lcd_sendchar(unsigned char dat);
extern void lcd_wait_busy(void);
extern void lcd_init(void);
extern void lcd_sendstr(unsigned char add,unsigned char *dat);
extern void lcd_setadd(unsigned char add);
extern void lcd_reset(void);
#endif
//-------------------------------------------------------------------
//----------------delay.c-------------------------------------------
//**********************************************
// 功能:C8051F(330)精确延时 24.5M
// 作者:July
// Blog: http://blog.sina.com.cn/mcuworld
// 最后更新:2008-12-31
// 尊重劳动成果,引用请勿删除本信息谢谢!
//**********************************************
#include
#include
//----------------------------------------------
//----------------------------
// 微秒级精确延时
// 仿真:(24.5M)
// delay_us(1); //1.72us
// delay_us(10);//10.89us
// delay_us(100); //102.74us
//----------------------------
void delay_us(unsigned char k)
{
while(k--)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
}
//----------------------------------------------
// 毫秒级精确延时
// 仿真:(24.5M)
// delay_ms(1); //1001.75us
// delay_ms(10);//10.008ms
// delay_ms(100); //老机太慢出不来鸟~自己测吧:)
//----------------------------------------------
void delay_1ms()
{
unsigned int j ;
for(j=3060;j>0;j--);
}
void delay_ms(unsigned int i)
{
for(;i>0;i--)delay_1ms();
}
//------------------------------------------
//----------------delay.h-----------------
#ifndef _DELAY_H
#define _DELAY_H
extern void delay_us(unsigned char k);
extern void delay_ms(unsigned int i);
#endif
//---------------------------------------
//---------------------main.c--------------
//**********************************************
// 功能:C8051F(330)精确延时+UART0+LCD1602(4线)
// 作者:July
// Blog: http://blog.sina.com.cn/mcuworld
// 最后更新:2009-5-12
// 尊重劳动成果,引用请勿删除本信息谢谢!
//**********************************************
//

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top