您的位置 首页 培训

51单片机对LCD1602显现的四线驱动

51单片机对LCD1602显示的四线驱动-//LCD1602读写头文件

//四线驱动方式

//////////////////////////////////

#include

#include “LCD1602.h”

/*———–

管脚定义在液晶头文件中

———–*/

void main(void){

LCD_init();

p=LCD_PutStr(“Hello Lcd1602!\n”,-1); //显示一段文字

p=LCD_PutNum(1234,2,p); //显示12.34这个数

while(1);

}

/*———————————————————

液晶LCD1602C 使用4条数据线(D4~D7)

/这个程序现已调试过了

//下面调用实例

//////////////////////////////////

//LCD1602读写头文件

//四线驱动方法

//////////////////////////////////

#include

#include “LCD1602.h”

/*———–

管脚界说在液晶头文件中

———–*/

void main(void){

LCD_init();

p=LCD_PutStr(“Hello Lcd1602!\n”,-1); //显现一段文字

p=LCD_PutNum(1234,2,p); //显现12.34这个数

while(1);

}

/*———————————————————

液晶LCD1602C 运用4条数据线(D4~D7)

———————————————————–*/

/*————————————————————-

LCD引脚界说

1—GND

2—VCC

3—VO

4—RS

5—RW

6—EN

7到14–D0-D7

15–背景灯+

16–背景灯-

—————————————————————–*/

#include

#include

本文引证地址: http://www.21ic.com/app/mcu/201812/784986.htm

#define LCD_DATA P2

sbit LCD1602_RS=P2^2;

sbit LCD1602_EN=P2^3;

int p=0;

/*————————————————————————————————–

函数阐明

————————————————————————————————–*/

void LCD_init(void);

void LCD_en_write(void);

void LCD_write_command(unsigned char command) ;

void LCD_write_data(unsigned char Recdata);

void LCD_set_xy (unsigned char x, unsigned char y);

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata);

void delay_nus(unsigned int n);

void delay_nms(unsigned int n);

void delay_1us(void) //1us延时函数

{

_nop_();

}

void delay_nus(unsigned int n) //N us延时函数

{

unsigned int i=0;

for (i=0;i delay_1us();

}

void delay_1ms(void) //1ms延时函数

{

unsigned int i;

for (i=0;i《1140;i++);

}

void delay_nms(unsigned int n) //N ms延时函数

{

unsigned int i=0;

for (i=0;i delay_1ms();

}

void LCD_init(void) //液晶初始化

{

LCD_write_command(0x28);

delay_nus(40);

LCD_write_command(0x28);

delay_nus(40);

LCD_write_command(0x28);

delay_nus(40);

LCD_en_write();

delay_nus(40);

LCD_write_command(0x28); //4位显现

LCD_write_command(0x0c); //显现开

LCD_write_command(0x01); //清屏

delay_nms(2);

}

void LCD_en_write(void) //液晶使能

{

LCD1602_EN=1;

delay_nus(1);

LCD1602_EN=0;

}

void LCD_write_command(unsigned char command) //写指令

{

delay_nus(16);

LCD1602_RS=0; //RS=0

LCD_DATA&=0X0f; //狷介四位

LCD_DATA|=command&0xf0; //写高四位

LCD_en_write();

command=command《《4; //低四位移到高四位

LCD_DATA&=0x0f; //狷介四位

LCD_DATA|=command&0xf0; //写低四位

LCD_en_write();

}

void LCD_write_data(unsigned char Recdata) //写数据

{

delay_nus(16);

LCD1602_RS=1; //RS=1

LCD_DATA&=0X0f; //狷介四位

LCD_DATA|=Recdata&0xf0; //写高四位

LCD_en_write();

Recdata=Recdata《《4; //低四位移到高四位

LCD_DATA&=0X0f; //狷介四位

LCD_DATA|=Recdata&0xf0; //写低四位

LCD_en_write();

}

void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数

{

unsigned char address;

if (y == 0) address = 0x80 + x;

else address = 0xc0 + x;

LCD_write_command(address);

}

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1

{

LCD_set_xy(X, Y); //写地址

LCD_write_data(Recdata);

}

int LCD_PutStr(unsigned char *DData,int pos){

unsigned char i;

if(pos==-1){

LCD_write_command(0x01); //清屏

delay_nms(2);

pos=0;

}

while((*DData)!=‘\0’){

switch(*DData){

case ‘\n’: //如果是\n,则换行

{

if(pos《17){

for(i=pos;i《16;i++)

LCD_write_char(i%16, i/16, ‘ ’);

pos=16;

}

else{

for(i=pos;i《32;i++) LCD_write_char(i%16, i/16, ‘ ’);

pos=32;

}

break;

}

case ‘\b’: //如果是\b,则退格

{

if(pos》0) pos–;

LCD_write_char(pos%16, pos/16, ‘ ’);

break;

}

default:

{

if((*DData)《0x20){

*DData=‘ ’;

}

LCD_write_char(pos%16, pos/16,*DData);

pos++;

break;

}

}

DData++;

}

return(pos);

}

//—————————-以下函数用于输出数字———————

int LCD_PutNum(unsigned long num,int XS,int pos){ //从右边数,保存几位小数

unsigned long tmp=0;

unsigned char numbits=0;

if(pos==-1){

LCD_write_command(0x01);

delay_nms(2);

pos=0;

}

if(num==0){

LCD_write_char(pos%16, pos/16, ‘0’);

pos++;

}

else{

if(num《0){

LCD_write_char(pos%16, pos/16, ‘-’);

num*=(-1);

pos++;

}

while(num){

tmp=tmp*10+(num%10);

num=num/10;

numbits++;

}

while(tmp){

LCD_write_char(pos%16, pos/16, (tmp%10)+48);

tmp=tmp/10;

pos++;

numbits–;

if(numbits==XS) pos=LCD_PutStr(“。”,pos); //显现小数点

}

while(numbits–){

LCD_write_char(pos%16, pos/16, ‘0’);

pos++;

}

}

return(pos);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/346291.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部