LCD1602 PIC驱动程序

更新时间:2023-05-18 03:25:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

LCD1602 PIC驱动程序,程序中有详细注释。

LCD1602 PIC驱动程序

1. 仿真电路图如下:

2. 源程序如下:

//LCD1602驱动程序,4位总线方式

//单片机:PIC16F877A(4MHz)

LCD1602 PIC驱动程序,程序中有详细注释。

//******************初始化说明**************************

//4位总线方式初始化,应注意LCD接线方式,及初始化首条指令

//4位总线初始化方法:因LCD加电初始化后默认为8位总线方式,

//故首条指令只能以8位方式传送,此时高4位数据可以程序控制,

//(而低4位则取决于硬件接线方式)设定为4位总线方式的控制

//位,刚好在第4位,故此时可以将总线传送方式设为4位方式,当将

//总经传送方式设为4位后,LCD工作方式就完全可以控制了.

//关于低4位接线方式的说明:由于首条指令只需将总线方式设为

//4位传送方式,LCD便可控,因低4位的接线方式并不影响对LCD总

//线传送方式的设定,故低4位接线方式可任意(包括悬空).

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

#include <pic.h>

#include <data_type.h>

__CONFIG(HS &WDTDIS& PWRTEN& BORDIS& LVPDIS& UNPROTECT);

#define LCD_EN RC7

#define LCD_RS RC6

#define LCD_A RC5 //LCD背光控制

#define LCD_DATA_BUS PORTC //4位总线,只用RC0-RC3

#define LAMP_OFF 1 //背光关

#define LAMP_ON 0 //背光开

#define C 0 //控制RS用,转送命令

#define D 1 //转送数据

#define ON 1 //控制E用,高电平

#define OFF 0 //低电平

unchar LCD_init(void);

unchar Wcmd(unchar command);

unchar Wdata(unchar data);

void delay(unint loop);

void main(void)

{

unchar const str1[]="***My LCD1602***\0"; //第一行字符

unchar const str2[]="2010-06-26\0"; //第二行字符

unchar const *str_p;

LCD_init();

while(1){

LCD1602 PIC驱动程序,程序中有详细注释。

Wcmd(0x01); //清显示

delay(170); //延时1.8ms

delay(60000);

for(str_p=str1;*str_p!='\0';str_p++){

Wdata(*str_p); //送显第一行字符

delay(20000);

}

Wcmd(0x80+0x43);

for(str_p=str2;*str_p!='\0';str_p++){

Wdata(*str_p); //送显第二行字符

delay(20000);

}

delay(60000);

delay(60000);

}

}

unchar LCD_init(void)

{

PORTC=0;

LCD_RS=D;

TRISC=0b00010000;

LCD_RS=C; //传送命令

LCD_DATA_BUS=(LCD_DATA_BUS & 0xf0)| 2;

LCD_EN=ON; //设定为4位总线方式

NOP(); //延时2us

NOP();

LCD_EN=OFF; //转送高4位字节(2)

delay(5); //延时60us

Wcmd(0x28); //功能调置:4位总线,两行显示5*8点字符

Wcmd(0x01); //清显示

delay(170); //延时1.8ms

Wcmd(0x0c); //显示控制:开显示,无光标

Wcmd(0x06); //输入模式:LCD AC自增,显示不移动

LCD_A=LAMP_ON; //开背光

return 0;

}

//转送命令函数

unchar Wcmd(unchar command)

{

LCD_RS=C;

LCD_DATA_BUS=(LCD_DATA_BUS & 0xf0)|((command & 0xf0)>>4);

LCD1602 PIC驱动程序,程序中有详细注释。

LCD_EN=ON;

NOP(); //延时2us

NOP();

LCD_EN=OFF; //转送高4位字节

LCD_DATA_BUS=(LCD_DATA_BUS & 0xf0)|(command & 0x0f);

LCD_EN=ON;

asm("goto $+1"); //延时2us

LCD_EN=OFF; //转送低4位字节

delay(5);

return 0;

}

//转送数据函数

unchar Wdata(unchar data)

{

LCD_RS=D;

LCD_DATA_BUS=(LCD_DATA_BUS & 0xf0)|((data & 0xf0)>>4);

LCD_EN=ON;

NOP(); //延时2us

NOP();

LCD_EN=OFF; //转送高4位字节

LCD_DATA_BUS=(LCD_DATA_BUS & 0xf0)|(data & 0x0f);

LCD_EN=ON;

NOP(); //延时2us

NOP();

LCD_EN=OFF; //转送低4位字节

delay(5);

return 0;

}

void delay(unint loop) /*延时函数!延迟周期如下:*/

{ /*1<=loop<=3时:Cycle≈loop*10+5*/

/*4<=loop<=9时:Cycle≈loop*10+10*/

while(--loop) /*10=<loop<1000时:Cycle=loop*11+3*/

{;} /*1000=<loop<=65535时Cycle=loop*11+5*/

}

说明:电路及程序已完全调试通过,并通过开发板实验完全正常,另外有关LCD1602资料见我上传《通用1602LCD使用手册_中文.pdf》

本文来源:https://www.bwwdw.com/article/92s4.html

Top