历史上的今天

今天是:2024年11月16日(星期六)

2019年11月16日 | 基于m128的LCD1602驱动(8线/4线)

发布者:JoyousJourney 来源: 51hei关键字:m128  LCD1602驱动  8线  4线 手机看文章 扫描二维码
随时随地手机看文章

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

// 文件名: 1602.h

// 作用:    AVRLCD1602 4/8线驱动

// 作者:    seabisuit

// 最新修改: 2011年6月22日

// 说明:   使用GCC编程,1602提供4/8线驱动

//     4线暂时高4位

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

#ifndef __1602_H_

#define __1602_H_ 1

//***头文件调用***//

#include

#include

#include

#include


//***定义uchar***//

#ifndef uchar

#define uchar unsigned char

#endif


//***本头文件增强功能设置***//

#define _LCD_DEF    0 //使自定义功能实现,如不需要将其定义为0(#define _LCD_DEF 0)

#define _LCD_BIT_IS_8 1 //定义4线或者8线


/*控制针脚设置*/

#define LCD_CZ PORTB

#define LCD_CZDDR DDRB 

#define LCD_E 2

#define LCD_RW 1

#define LCD_RS 0

#define LCDDATA PORTE

#define LCDDDR DDRE

#define LCDPIN PINE

#define busy 7


/*LCD命令定义*/

#define E0()   cbi(LCD_CZ,LCD_E)

#define E1()   sbi(LCD_CZ,LCD_E)

#define RW0()    cbi(LCD_CZ,LCD_RW)

#define RW1()    sbi(LCD_CZ,LCD_RW)

#define RS0()    cbi(LCD_CZ,LCD_RS)

#define RS1()    sbi(LCD_CZ,LCD_RS)

#define nop()    asm("nop")


/*基本功能函数声明。*/

void lcd_busy(void);//测试LCD忙碌状态

void lcd_wrcmd(uchar CMD,uchar wait);//LCD写入指令

void lcd_wrdata(uchar);//LCD写入数据

void lcd_xy(uchar,uchar);//lcd显示定位

void lcd_char(uchar,uchar,uchar);//lcd显示字符

void lcd_string(uchar,uchar,uchar *);//lcd显示字符串

void lcd_cls(void);//1602清显示

void lcd_init(void); //LCD初始化设定程序

void lcd_def(void);//自定义字符串



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

/* 函数:void lcd_busy(void)                            */

/* 功能:检查LCD忙状态                                  */

/*busy为1时,忙,等待。busy为0时,闲,可写指令与数据     */

/*                                                      */

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

void lcd_busy(void)

{

   #if (_LCD_BIT_IS_8==1) //8位数据线


uchar tmp;


LCDDDR&=~1<<7;//设置为输入

E0();RS0();RW1();


/*循环读取忙位*/

do{ 

   E1();_delay_us(1);

   tmp=LCDPIN;

   E0();

}

while(tmp&1<LCDDDR=0xff;


#else    //4位数据线


uchar tmp;

LCDDDR=0;

E0();RS0();RW1();

/*循环读取忙位*/

do{

E1();_delay_us(1);

tmp=LCDPIN;

E0();_delay_us(1);

E1();_delay_us(1);


E0();_delay_us(6);

}

while(tmp&1<

LCDDDR=0xff;


#endif


}

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

/* 函数:lcd_wrcmd(uchar CMD,uchar wait)                */

/* 功能:写入命令到LCD                                  */

/*RS=0,RW=0,E=高脉冲,D0-D7=指令码。                  */

/*CMD为指令,wait指定是否要检测LCD忙信号                */

/*                                                      */

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

void lcd_wrcmd(uchar CMD,uchar wait)

{   

   #if (_LCD_BIT_IS_8==1) //8位数据线


if (wait) //是否读忙

lcd_busy();

//else 

//_delay_us(40);

    RS0();RW0();

    LCDDATA=CMD;    

    E1();E0();


#else    //4位数据线


if (wait) 

lcd_busy();

else 

_delay_us(40);

    RS0();RW0();E0();     

    

    LCDDATA=CMD&0xf0;

    E1();_delay_us(1);E0();_delay_us(6);

LCDDATA=(CMD<<4)&0xf0;

E1();_delay_us(1);E0();

#endif

}

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

/* 函数:void lcd_wrdate(uchar);                        */

/* 功能:写入数据到LCD                                  */

/*RS=1,RW=0,E=高脉冲,D0-D7=指令码。                  */

/*dat为要写入的数据                                     */

/*                                                      */

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

void lcd_wrdata(uchar dat)      //写数据

   #if (_LCD_BIT_IS_8==1) //8位数据线


lcd_busy();

    RW0();RS1();      

LCDDATA=dat;

    E1();E0();


#else    //4位数据线

lcd_busy();

    RW0();RS1();      


    LCDDATA=dat&0xf0;

    E1();_delay_us(1);E0();_delay_us(6);



    LCDDATA=(dat<<4)&0xf0;

E1();_delay_us(1);E0();

#endif

    

}

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

/* 函数:lcd_xy(uchar x,uchar y)                        */

/* 功能:lcd显示定位                                    */

/*                                                      */

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

void lcd_xy(uchar x,uchar y)

uchar add;

if(y==0) 

add=0x80+0x00+x;

    else

    add=0x80+0x40+x;

    lcd_wrcmd(add,1);

}


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

/* 函数:void lcd_char(uchar x,uchar y,uchar dat)       */

/* 功能:lcd于(x,y)处显示字符                        */

/*                                                      */

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

void lcd_char(uchar x,uchar y,uchar dat) 

{   

    lcd_xy(x,y);

    lcd_wrdata(dat);

}           

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

/* 函数:void lcd_string(uchar x,uchar y,uchar *s)      */

/* 功能:lcd于(x,y)处开始显示字符串                  */

/*                                                      */

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

void lcd_string(uchar x,uchar y,uchar *s)

lcd_xy(x,y);

while(*s) 

    {

   lcd_wrdata(*s);

        s++;

    }

}

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

/* 函数:void lcd_cls(void)                             */

/* 功能:对1602显示屏清除,并进行延时                   */

/* 延时是为了使1602又时间进行清除                       */

/*                                                      */

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

void lcd_cls(void)

lcd_wrcmd(0x01,1);

_delay_ms(10);

}

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

/* 函数:void LcdReset(void);                           */

/* 功能:对1602进行复位                                 */

/*                                                      */

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

void lcd_init(void)     

{   

   #if (_LCD_BIT_IS_8==1) //8位数据线

   

LCD_CZDDR=1<LCDDDR=0xff;

_delay_ms(15);

lcd_wrcmd(0x38,0);    

_delay_ms(5);

lcd_wrcmd(0x38,0);    

_delay_ms(5);

lcd_wrcmd(0x38,0); 

_delay_us(1);

lcd_wrcmd(0x38,1);

lcd_wrcmd(0x08,1);

lcd_cls();


    lcd_wrcmd(0x06,1); 

    lcd_wrcmd(0x0e,1);


#else    //4位数据线

LCD_CZDDR=1<LCDDDR=0xf0;

_delay_ms(15);

lcd_wrcmd(0x38,0);    

_delay_ms(5);

lcd_wrcmd(0x38,0);    

_delay_ms(5);

lcd_wrcmd(0x38,0); 

_delay_us(1);

lcd_wrcmd(0x38,1);

lcd_wrcmd(0x02,1);

lcd_wrcmd(0x28,1);

lcd_cls();

lcd_wrcmd(0x06,1); 

    lcd_wrcmd(0x0e,1);



#endif


    

}



#if (_LCD_DEF==1)

//定义CGRAM的值,在功能开启后再主文件加入如下面字符串数组定义

const uchar lcd_cgram[64]=

{

0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,

0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,

0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,

0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,

0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,

0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,

0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,

0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00

};


void lcd_def(uchar cg[64])

{

    uchar temp=0;

    lcd_wrcmd(0x40,1);

    while(temp<64)

    {

      lcd_wrdata(cg[temp]);

      temp++;

    }

}

#endif


#endif /*__1602_H_*/


关键字:m128  LCD1602驱动  8线  4线 引用地址:基于m128的LCD1602驱动(8线/4线)

上一篇:avr单片机双通信C程序
下一篇:AVR单片机改造遥控车

推荐阅读

英国一家小型机器人开发了一系列用于农业的定制型灵活机器人,这种机器人能够替代现有的田间拖拉机。 农业往往被认为落后于高科技时代,对农民来说,他们的工作场所是创新技术的肥沃试验田。他们是最早使用商用的人员,也是最早使用技术的人员。配置自动驾驶系统的农业设备完全可以在农田这种封闭的区域有效且安全地进行工作。农业科技的发展是小型农业...
频谱分析仪是常用的电子测量仪器之一,他的功能是分辨输入信号中各个频率成分并测量各个频率成分的频率和功率。下面看一下传统频谱分析仪的原理和现代频谱分析仪(或称为信号分析仪)的发展。图1是传统的扫频式频谱分析仪的结构框图。图1 传统扫频式频谱分析仪的结构框图输入信号进入频谱分析仪后与本振混频,当混频产物等于中频时,这个信号送到检波器,...
11月16日上午消息,苹果自研芯片M1的第一个基准测试出现在跑分软件Geekbench网站上,得分超过了英特尔的i9。今天,针对在Rosetta 2下模拟x86的M1芯片的新成绩也已经出现。  Rosetta 2是苹果给M1芯片准备的翻译器,它能把之前用于英特尔芯片的App翻译成M1能运行的方式。这次跑分就是在这个环境下测试的。  上传的Rosetta 2 Geekbench结果显...
集微网消息 11月15日,苏大维格在投资者互动平台表示,公司触控技术采用了自主研发的AD-film的On cell技术方案,在支持主动笔方面较In cell有明显优势;同时,公司正在与华星光电共同开发显示面板的触控集成(即On cell的面板触控集成)技术和量产方案。同时,该公司与华为在中大尺寸电容触控技术的终端应用方面存在良好的沟通与合作,相关产品的合作...

史海拾趣

问答坊 | AI 解惑

VHDL设计实例与仿真的秒表程序

我按照书上的程序,用天祥的CPLD学习板测试,可通不过,按按键没反应,请各位看看,用QUARTUS II 8.1. 外接晶振:20MHZ.…

查看全部问答∨

有人用过L293D没有?

我用L293D驱动电机 V1接24V电源 V2接5V电源 然后准备控制电机正反转 A1 A2 EN1 接单片机接口 A1=0 A2=1 EN1=1 电机不转 测量A2=0 把连接线去掉测量A2=1 不知道怎么回事 有人指点下 谢谢!!! …

查看全部问答∨

TL16c754扩展串口

有人用过TL16c754这个芯片吗?是不是他最高支持56000@1.7432MHz,38400@3.072MHz?…

查看全部问答∨

s3c6410的nandflash分区问题,格式化binfs,exfat破坏了

现在在ut的开发板上学习,想吧nandflash的分区方式改一下:   256MB flash         ------   bootloader         ------   TOC          ...…

查看全部问答∨

谁介绍款智能终端??

要求是ppc2003以上的中文系统,带RS232串口。价格3000以内的。告诉型号或者公司都行。…

查看全部问答∨

求助,急需wince下驱动的摄像头

小女子初来乍道,请大牛们多多关照阿 老板要我寻找一个能在wince下驱动的摄像头,不知道如何选择。 要求:能在wince下驱动       30万象素以上       可以调焦       usb接口 ...…

查看全部问答∨

用VS2005在WINCE5的平台上,如何开发FTP程序啊,我想用来实现自动更新

用VS2005在WINCE5的平台上,如何开发FTP程序啊,我想用来实现自动更新? 我们在WINCE的手持扫描器上开发了个程序,想实现用FTP自动更新,但苦于不知道如何开发WINCE的FTP程序.还望大虾们帮忙!! 或者有其它办法实现自动更新也好,谢谢,最好能提 ...…

查看全部问答∨

请问,用EVC+Standard SDK开发的程序能够跑在SMartPhone平台上吗?

用EVC+Standard SDK开发的程序能够跑在SMartPhone平台上吗? 另外,我装了SMartPhone SDK后,发现是命令行的,如何让EVC使用这个SDK? 请各位兄弟帮偶解答一下,谢谢:)…

查看全部问答∨

CC2530 的30脚的偏置电阻干什么用的

CC2530 的30脚的偏置电阻干什么用的…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved