找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2287|回复: 11
打印 上一主题 下一主题
收起左侧

大佬请进,如何利用1602节省下来的4个I/O口 在线等

[复制链接]
跳转到指定楼层
楼主
ID:241249 发表于 2018-3-11 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30黑币

大佬请进,如何利用1602节省下来的4个I/O口

代码如下 ,剩下的P1.0-1,3无法使用

真的是卡住了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

/********************************************************************************************/
#define

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:212149 发表于 2018-3-11 20:23 | 只看该作者
看不懂你要问什么。
回复

使用道具 举报

板凳
ID:290570 发表于 2018-3-11 22:43 | 只看该作者
不懂你说的什么
回复

使用道具 举报

地板
ID:7485 发表于 2018-3-12 09:32 | 只看该作者
看不见你的代码。

也看不懂你的问题。

你是不是问P1.4~P1.7已经被1602用掉了,P1.0~P1.3怎么用?可以按位分别用,也可以按字节进行逻辑运算来读写P1口。方法多种多样。
回复

使用道具 举报

5#
ID:241249 发表于 2018-3-12 10:04 | 只看该作者
ahshmj 发表于 2018-3-12 09:32
看不见你的代码。

也看不懂你的问题。

能指点一下么,对这块知识有欠缺
就是如何操作 谢谢
回复

使用道具 举报

6#
ID:241249 发表于 2018-3-12 10:12 | 只看该作者
ahshmj 发表于 2018-3-12 09:32
看不见你的代码。

也看不懂你的问题。

晚上回去贴代码
我就是用了1.4-1.7然后空出四个IO口,结果发现四个io口不受控制
搜了帖子也没有相关的操作方法
1.0-1.3我还是想作为正常io口使用的,不然8线变4线没什么意义呐
回复

使用道具 举报

7#
ID:290838 发表于 2018-3-12 16:29 | 只看该作者
用sbit 位定义,单独定义I/O
比如
sbit WR=P1^4;
回复

使用道具 举报

8#
ID:241249 发表于 2018-3-12 17:41 | 只看该作者
ahshmj 发表于 2018-3-12 09:32
看不见你的代码。

也看不懂你的问题。

代码如下

//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!");
print_char(0x40,'.');
while(1);
}
回复

使用道具 举报

9#
ID:241249 发表于 2018-3-12 17:44 | 只看该作者
ahshmj 发表于 2018-3-12 09:32
看不见你的代码。

也看不懂你的问题。

版主,请帮助指出问题的所在,现在传送数据的时候是八位数据送出,然后低四位抹去然后移动到高四位送出。
是不是应该把数据用&和|来处理一下,使得低四位不变,只取高四位送到1.4-1.7的端口
回复

使用道具 举报

10#
ID:84997 发表于 2018-3-15 11:52 | 只看该作者
可以直接用1602的四线模式,就可以省下4个IO口
回复

使用道具 举报

11#
ID:241249 发表于 2018-3-15 18:48 | 只看该作者
已搞定 道道挺深
回复

使用道具 举报

12#
ID:377803 发表于 2019-9-23 13:14 | 只看该作者

我也刚刚学习到这个,问一下楼主,这个道道在哪里,我还没看出来。我也再想,这个LCD虽然是4线连接的(P0.4  P0.5  P0.6  P0.7)。但是写的程序里的数据都是送到P0口的,那虽然P0口的低四位虽然没有连接到LCD ,但它也在发送数据吧,有高低电平变化的吧?这个时候这四个IO口当作其他用,是否就是没法正常了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表