PIC16 单片机 LCD1602 驱动 程序 PIC16F877A PIC16F887

发布者:温柔阳光最新更新时间:2022-01-30 来源: eefocus关键字:PIC16  单片机  LCD1602  驱动  程序  PIC16F877A  PIC16F887 手机看文章 扫描二维码
随时随地手机看文章

在这里插入图片描述


/* LCD显示相关 */

#define DATA 1                                                       /* LCD写数据时为1 */

#define COM 0                                                       /* LCD写命令时为0 */

#define LINE1 0b10000000

#define LINE2 0b11000000


#define LCD_E RD6

#define LCD_RW RD5

#define LCD_RS RD4

void LCD_WRITE_4( unsigned char R1, unsigned char FLAG );

void LCD_WRITE( unsigned char R1, unsigned char FLAG );

unsigned char LCD_READ( void );

void LCD_BUSY( void );

void LcdWriteChar( unsigned char x, unsigned char y, char s );

void lcd_dispaly_str( unsigned char x, unsigned char y, char *s );

void LCD_CSH( void );

/* LCD写4位命令 */

void LCD_WRITE_4( unsigned char R1, unsigned char FLAG )

{

LCD_RW = 0; NOP();

LCD_RS = FLAG;

PORTD &= 0xF0;

LCD_E = 1; NOP();

PORTD |= R1;

NOP(); NOP();

LCD_E = 0; NOP();

LCD_RS = 0; NOP();

PORTD &= 0xF0;

}


/* LCD写命令 */

void LCD_WRITE( unsigned char R1, unsigned char FLAG )

{

unsigned char R2;


LCD_BUSY();

LCD_RW = 0; NOP();

LCD_RS = FLAG;

R2 = (R1 >> 4) & 0x0F;

PORTD &= 0xF0; NOP();

LCD_E = 1;

PORTD |= R2;

NOP(); NOP();

LCD_E = 0;


R2 = R1 & 0x0F;

PORTD &= 0xF0; NOP();

LCD_E = 1; NOP();

PORTD |= R2;

NOP(); NOP();

LCD_E = 0; NOP();

LCD_RS = 0; NOP();

PORTD &= 0xF0;

}


/* 读LCD状态 */

unsigned char LCD_READ( void )

{

unsigned char R1;

TRISD = 0x0F;

LCD_RS = 0; NOP();

LCD_RW = 1;

NOP(); NOP();

LCD_E = 1;

NOP(); NOP();

NOP(); NOP();

R1 = 0;

R1 = (PORTD << 4) & 0xF0;

LCD_E = 0;

NOP(); NOP();

NOP(); NOP();

LCD_E = 1;

NOP(); NOP();

R1 |= (PORTD & 0x0F);

LCD_E = 0; NOP();

LCD_RW = 0;

TRISD = 0x00;

return(R1);

}

/* 检测LCD是否忙 */

void LCD_BUSY( void )

{

unsigned char R1;

do

{

R1 = LCD_READ();

}

while ( (R1 & 0x80) == 0x80 );

}

/* 写字符 */

void LcdWriteChar( unsigned char x, unsigned char y, char s )

{

if ( y == 0 )

{

LCD_WRITE( 0x80 + x, COM );

}else {

LCD_WRITE( 0xC0 + x, COM );

}


LCD_WRITE( s, DATA );

}

/* 写字符串 */

void lcd_dispaly_str( unsigned char x, unsigned char y, char *s )

{

if ( y == 0 )

{

LCD_WRITE( 0x80 + x, COM );

}else {

LCD_WRITE( 0xC0 + x, COM );

}


while ( *s )

{

LCD_WRITE( *s, DATA );

s++;

}

}


/* LCD初始化 */

void LCD_CSH( void )

{

TRISD = 0x00; /* RD方向输出 */


__delay_ms( 20 );


LCD_WRITE_4( 0b0011, COM );

__delay_ms( 5 );

LCD_WRITE_4( 0b0011, COM );

__delay_ms( 10 );

LCD_WRITE_4( 0b0011, COM );

__delay_ms( 10 );


LCD_WRITE_4( 0b0010, COM );


LCD_BUSY();

LCD_WRITE( 0b00101000, COM );

LCD_WRITE( 0b00001100, COM );

LCD_WRITE( 0b00000001, COM );

__delay_ms( 2 );

LCD_WRITE( 0b00000110, COM );

}

/* 游标闪烁 */

void SetCurPosition( unsigned char x, unsigned char y )

{

unsigned char temp;


temp = x & 0x0f;

y &= 0x01;

if ( y )

temp |= 0x40;  /* 如果在第2行 */

temp |= 0x80;


LCD_WRITE( temp, COM );

LCD_WRITE( 0x0f, COM );

}



/* 关游标 */

void LCD_DELET_CUR_P( void )

{

LCD_WRITE( 0x0c, COM );

}


使用:

LCD_CSH();

lcd_dispaly_str(0,0,"dasdasas");


关键字:PIC16  单片机  LCD1602  驱动  程序  PIC16F877A  PIC16F887 引用地址:PIC16 单片机 LCD1602 驱动 程序 PIC16F877A PIC16F887

上一篇:PIC单片机开发需注意的几个问题
下一篇:单片机 步进电机 驱动程序 ULN2003 28BYJ-48 5线4相电机 PIC16F877A

推荐阅读最新更新时间:2024-11-10 13:58

PIC单片机与16位串行D/A转换原理
  下面介绍了基于PIC单片机与16位串行D/A转换的原理:   1.基本原理   D/A转换器相当于一种译码电路,它将数字输入传换为模拟输出:   其中,D是数字输入,VR是模拟参考输入,Vo是模拟输出。这里模拟输出可以是电压,也可以是电流,式中 数字D是一个小于1的值。   式中an为1或0,由数字对应位的逻辑电平来决定,N是数字输入D的位数。由此(3.2)由此(3.1)   当参考电压输入TIp.固定时,转换器的模拟输出D成正比关系。对于单位数字量的变化,模拟输出是按等 幅度的阶跃量变化的。   2.原理图   (1)串行D/A转换器。   串行D/A转换器一般由数字输入、基准电压源、模拟开关、电
[单片机]
PIC<font color='red'>单片机</font>与16位串行D/A转换原理
基于AVR单片机和EM4094读写芯片的多协议RFID读卡器
  引言   射频识别(RFID)是利用无线方式对电子数据载体(电子标签)进行识别的一种新兴技术。与接触式IC卡和条形码识别等系统比较,它有着巨大的优势。利用射频识别技术,能有效实现对数量大、分布区域广的信息进行智能化管理,达到高效快捷运作的目的,特别是在第二代身份证、物流、交通航运、自动收费、超市、门禁系统管理、服务领域等方面有着广泛的应用前景。随着我国国民经济的快速发展,国内RFID行业也正经历着深刻的变革。   RFID系统一般是由读写器、射频卡、应用软件来组成。其中读写器的设计是至关重要的,它决定了系统的稳定性和准确性。   除了要求其能支持一系列协议、标准和收发器外,对读写器可能还有其它功能性方面的要求,如高性能、
[单片机]
基于AVR<font color='red'>单片机</font>和EM4094读写芯片的多协议RFID读卡器
ATMEGA48多机通讯程序
/* 通讯规则: 1:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/ 2:通讯连接采用硬件MAX485,双向单工 3:每个上行/下行的数据包的字节个数都是一样的(通讯数据量) 4:每个上行/下行的数据包都采用CRC8校验 5:数据接收采用中断+查询的方式 6:总是由主机向从机发送一个数据包,从机收到数据包后向主机回复一个数据包 7:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收 8:从机之间不能相互通讯,必须通过主机才能交换数据 9:无效地址是0,主机地址是1,从机地址是2.3.4......广播地址是255 */ #incl
[单片机]
MSP430外部中断程序
中断在我们生活中无处不在,51单片机外部中断只有两个,而强大的msp430有很多,比如P1、P2口全部是 其驱动程序如下: int main( void ) { WDTCTL = WDTPW + WDTHOLD; P2IE |=0x01; //下降沿触发 P2IES |=0x01; P2IE |=0x02; P2IES |=0x02; P2IFG &=~0x03; _BIS_SR(GIE); } #pragma vector =PORT2_VECTOR __interrupt void Port_1(void) { if((P2IFG | 0xfe)==0xff) {
[单片机]
单片机初学者的学习心得
单片机是一门实践性非常强的学科,没有实践一切都是“蜃楼海市”,花点钱买块开发板长短常必要的。(“开发板就比如农夫种地的种子,只要能公道利用,它便会生根发芽,最后定能收成丰盛的果实。想要种好地,不要不舍得去买好种子”。)学习单片机,建议大家一定要多做实验,一开始可以模仿别人的程序在开发板上做些简朴的实验,模仿别人的程序时千万不要知足只在实验板上运行一下,一定要自己动手把程序敲进电脑、一句一句分析透彻,不懂的地方拿出课本看看,不适合的地方自己动手改一改,琢磨琢磨别人的程序,然后再编译、下载,只有这样边做边看书,才能使那些看来很复杂的、摸不着头脑的单片机的知识变的很详细,只有不断的做实验,在实践中学习,才能真正扎实把握单片机的基本知识,有
[单片机]
在LabVIEW中开发XBOX Kinect的应用程序
Loading .NET 4.0 Assemblies in LabVIEW 由于包括LabVIEW2011以及之前版本的LabVIEW都不自动支持.Net 4.0,所以需要手动增加。 方法:在Labview.exe文件所在的位置,创建文本文件LabVIEW.exe.config,文件名必须为LabVIEW.exe.config,保存格式为ANSI,在文件中加入如下信息,注意版本号码v4.0.30319是你实际.Net的版本,可以用在C:WindowsMicrosoft.NETFramework中找到最高版本号。 ?xml version = 1.0 ? configuration startup useLe
[测试测量]
基于单片机的简易信号源设计
1. 引言 信号发生器在教学、试验、测控等各个领域有十分广泛的应用,其输出信号的频率范围覆盖了各个频段,从甚低频到甚高频,操作方式也从手动旋钮到程控,产生的波形从传统的正(余)弦波和脉冲波形,发展到现在能产生各种任意波形。以前的信号发生器往往独占一个机箱,而现在的一些应用中,它只是一块插在计算机中的扩展卡,还有一些信号发生器设计成一个独立的小模块,通过RS-232C或RS-422,RS-485等串行总线和计算机连接。 其实,在许多固定的控制应用中,只要求信号发生器产生单一波形,或可数的几个波形。如果仅仅要求产生单一的正(余)弦波或者脉冲波形,可以利用传统的振荡器电路。当信号频率有所选择时,问题仍然比较简单。但若产生
[单片机]
基于<font color='red'>单片机</font>的简易信号源设计
GD32开发实战指南(基础篇) 第19章 程序加密
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 1 程序加密工作原理 GD32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭。96位的产品唯一身份标识所提供的参考号码对任意一个GD32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。在这里要提醒读者, 要注意大端小端模式 。 2 程序加密具体代码实现 其实读取ID很简单,如果存储ID的变量为8位。则需要读取12次,如下所示。 uint8_t Sys_ID ,i; for(i=0;i 12
[单片机]

推荐帖子

什么装置可以把电源开关自动切换到备用电源
当一个电源突然断电怎么自动切换到另一个电源???这个用什么可以实现,类似于起反作用的保险跳闸开关什么装置可以把电源开关自动切换到备用电源有双电源切换器成品。是交流电源还是直流电源?切换多高电压?多大电流?是否允许切换过程中短暂停电?如果是纯粹是大功率交流电,有双电源切换开关,就是因故停电自动切换到另外一个电源的开关的或者考虑UPS不间断电源还有是电源和电池之间的切换看楼主用途有成品,双电源转换开关400v,10kv等。楼主还是先把问题说清楚。如果是直流电源,在两个电源的正极
g6g6 电源技术
ARM驱动库
最近比较空闲开始接触ARM的Cotex-M3拿到了一块TIStellaris的板子,发现驱动库是做好的,都是直接调用。想问下STM32系列,NXP的LPC系列,还有富士通的MB9BF系列的M3内核的MCU是否也是将驱动库做好了?ARM驱动库STM32系列有库,MB9BF没有用库,NXP的LPC系列没用过库,不知道其它人了解的情况回复楼主wstt的帖子楼主的这个问题提得非常好,期待高手的回答,除了Luminary其他的M3我还没怎么接触。回复沙发daicheng的
wstt 微控制器 MCU
FPGA与DSP通信研究及代码
1.首先在FPGA做一个存储器。2.编写DSP程序,通过EMIF接口访问FPGA内部的存储器,可以进行读和写操作。DSP与FPGA的接口设计主要完成两方面的任务,一是在FPGA中设计存储器,形成DSP可以访问的外设;二是编写DSP程序,完成对FPGA的控制。FPGA与DSP通信研究及代码这个非常好,支持。楼主在硬件上验证了吗?做过验证呵呵版主大人回复沙发eeleader的帖子多交流哦,把源码共享一下,让大家学习看到你共亨的代码了。谢谢!
ustczhujian FPGA/CPLD
怎么理解ADC的规则转换和注入转换啊?
怎么理解ADC的规则转换和注入转换啊?怎么理解ADC的规则转换和注入转换啊?这个问题讨论很多次了,请自己搜索一下把规则转换比作正常的程序流程,注入转换比作中断处理程序。这样你就好理解了。外部事件随时可以触发进行注入转换,注入转换可以打断当前的规则转换流程。可以认为注入转换的优先级比规则转换高。简单的解释就是谢谢。谢谢我
pchild stm32/stm8
基于Proteus的MSP430单片机仿真实例14-LCD1602液晶显示字符
此内容由EEWORLD论坛网友tiankai001原创,如需转载或用于商业用途需征得作者同意并注明出处一、任务要求利用MSP30F247单片机驱动LCD1602液晶,使其显示两行字符:第一行显示“laomashitumcu”,第二行显示“msp430f247study”。二、硬件电路硬件电路如下图所示。选取MSP430F247单片机的P2端口连接LCD1602的数据线D0~D7,P3.0,P3.1,P3.2分别连接LCD1602的使能E
tiankai001 微控制器 MCU
C语言 指针理解
1、指针  指针全称是指针变量,其实质是C语言的一种变量。这种变量比较特殊,通常他的值会被赋值为某个变量的地址值(p=&a),然后我们可以使用*p这样的方式去间接访问p所指向的那个变量。2、为什么需要指针?指针存在的目的就是间接访问。有了指针之后,我们访问变量a不必只通过a这个变量名来访问。而可以通过p=&a;*p=xxx;这样的方式来间接访问变量a。3、指针的定义和初始化  指针既然是一种变量,那么肯定可以定义,也可以初始化第一种:先定义再赋值  in
fish001 DSP 与 ARM 处理器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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