/* 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");
上一篇:PIC单片机开发需注意的几个问题
下一篇:单片机 步进电机 驱动程序 ULN2003 28BYJ-48 5线4相电机 PIC16F877A
推荐阅读最新更新时间:2024-11-10 13:58
推荐帖子
- 什么装置可以把电源开关自动切换到备用电源
- 当一个电源突然断电怎么自动切换到另一个电源???这个用什么可以实现,类似于起反作用的保险跳闸开关什么装置可以把电源开关自动切换到备用电源有双电源切换器成品。是交流电源还是直流电源?切换多高电压?多大电流?是否允许切换过程中短暂停电?如果是纯粹是大功率交流电,有双电源切换开关,就是因故停电自动切换到另外一个电源的开关的或者考虑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 处理器
设计资源 培训 开发板 精华推荐
- 具有输入隔离开关的 LTC3110HUF 自主备份和再充电应用的典型应用电路
- AD8174-EB,用于视频路由和多路复用系统的单个 4:1 模拟多路复用器的评估板
- 使用 Analog Devices 的 LT1248IN 的参考设计
- 在光电二极管功率检测器应用中将 ADL5315 高端电流镜连接到跨线性对数放大器
- 【全新版本-实测成功】物联网开关
- LTC1261IS8 7 节电池至 -1.24V 输出 GaAs FET 偏置发生器的典型应用电路
- AM1/4S-2405SH30Z 5V 0.25 瓦 DC/DC 转换器的典型应用
- 50W,直流转直流单路输出电源
- ESP32_CAN_STICK
- MPOS-STD2:交钥匙PCI-PTS移动POS(MPOS)终端