LCD 1602四线数据传输的驱动

   当单片机引脚不够用时,1602采用用四线接法,就可以为我们多留出4个端口,以备单片机连接其它的外围电路。四线接法指DB0~DB3这4个口悬空,数据传输只需要通过DB4~DB7(注意VSS VDD VL RS R/W  E这六个引脚无论哪种情况下都有连接的。)程序与8线连法的大同小异,只需要在写数据或命令时先传输相应的高四位,再传输低四位。具体驱动程序如下:

//LCD1602液 晶
/********************************************************************************************/
#include <reg52.h>   
#include<intrins.h>
/********************************************************************************************/
typedef unsigned char      uint8;          // 无符号8位整型变量 //


/********************************************************************************************
// 引脚定义 // 
/********************************************************************************************/
#define LCD1602_DBP1 // 数据总线,如果P1.0~P1.7在八线驱动时分别对应DB0~DB7,则在四线传输时候只需要接P1.4~P1.7
sbit   LCD1602_RS=P2^5;  /* Data Command Pin  1 data  0 command pin 4  */
sbit   LCD1602_RW=P2^6;  /* Read Write Pin  1 read   0 write    pin 5  */
sbit   LCD1602_E=P2^7;  /* LCD Enable Signal  pin 6  */
sbit   LCD1602_BUSY_status = P1^7;


/********************************************************************************************
// 指令集 //将所有可能用到的指令先预定义一下,方面以后的使用
/********************************************************************************************/
#define CMD_clear0x01             // 清除屏幕
#define CMD_back0x02             // DDRAM回零位
#define CMD_dec10x04             // 读入后AC(指针)减1,向左写
#define CMD_add10x06             // 读入后AC(指针)加1,向右写
#define CMD_dis_gb10x0f             // 开显示_开光标_开光标闪烁
#define CMD_dis_gb20x0e             // 开显示_开光标_关光标闪烁
#define CMD_dis_gb30x0c             // 开显示_关光标_关光标闪烁
#define CMD_OFF_dis0x08             // 关显示_关光标_关光标闪烁
#define CMD_set820x38             // 8位总线_2行显示
#define CMD_set810x30             // 8位总线_1行显示(上边行)
#define CMD_set420x28             // 4位总线_2行显示
#define CMD_set410x20             // 4位总线_1行显示(上边行)
#define lin_1 0x80             // 4位总线_1行显示(上边行)
#define lin_2 0xc0             // 4位总线_1行显示(上边行)


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


/********************************************************************************************/
//读忙信号
/********************************************************************************************/
void LCD1602_TestBusy(void){
    LCD1602_DB = 0xff;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    LCD1602_E = 1;
while(LCD1602_BUSY_status);//当1602内部操作完成后,才可以接受下一条指令
    LCD1602_E = 0;
}
/********************************************************************************************
// 写指令程序 //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) { 
    LCD1602_TestBusy();
  LCD1602_RS = 0;
  LCD1602_RW = 0;
  LCD1602_DB=(LCD1602_command/16)<<4;
// 将传输过来的指令先取高四位 (为什么要除以16?因为2的4次方为16,比如1010 0100,除以16后,用8位2进制表示就为0000 1010
//再向左移动4位,就是1010 0000,传输时候,由于只连接了高4为那几根线,于是1602就收到1010
  LCD1602_E = 1;
  LCD1602_E = 0;
  LCD1602_DB=(LCD1602_command%16)<<4;//同理,取低四位,传输到1602中
  LCD1602_E = 1;
  LCD1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //


/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){ 
    LCD1602_TestBusy();
  LCD1602_RS = 1;
  LCD1602_RW = 0;
  LCD1602_DB=(LCD1602_data/16)<<4;//将传输过来的数据先取高四位 
  LCD1602_E = 1;
  LCD1602_E = 0;
  LCD1602_DB=(LCD1602_data%16)<<4;//将传输过来的数据先取低四位
  LCD1602_E = 1;
  LCD1602_E = 0;
}
/********************************************************************************************
// 打印字符串程序 // (本函数调用指针函数)
// 第一行位置 0x00~0x0f  第二行位置 0x40~0x4f 
/********************************************************************************************/
void print_str(uint8 a,uint8 *str){
LCD1602_WriteCMD(a | 0x80);
while(*str != '\0'){
LCD1602_WriteData(*str++);
}
*str = 0;
}
/********************************************************************************************
// 打印单字符程序 // 
/********************************************************************************************/
void print_char(uint8 a,uint8 t){
LCD1602_WriteCMD(a | 0x80);
LCD1602_WriteData(t);
}


/********************************************************************************************
// 初始化 
/********************************************************************************************/
void LCD1602_Init(void){
  LCD1602_WriteCMD(CMD_set42);
  LCD1602_WriteCMD(CMD_set42);
  LCD1602_WriteCMD(CMD_clear);
  LCD1602_WriteCMD(CMD_back);
  LCD1602_WriteCMD(CMD_add1);
  LCD1602_WriteCMD(CMD_dis_gb3);
}
/********************************************************************************************/




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


void main()
{
LCD1602_Init();                         
print_str(0x80,"hello! Acqua");
print_char(0x40,'.');
while(1);
}


程序下载链接http://download.csdn.net/detail/hh279962296/5942473 点击打开链接

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值