找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请问1602更改8位总线为4位总线后,去掉的4个IO口怎么用

[复制链接]
跳转到指定楼层
楼主
ID:241249 发表于 2018-3-10 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问1602更改8位总线为4位总线后,去掉的4个IO口怎么用
现在使用的是P1.4-1.7四个口传送数据,也实现了
但是想利用剩下节省的4个IO口的时候发现定义完毕后没有反应

请帮忙,我现在用P1.1安装了一个蜂鸣器,不响,但是定义了其他IO口就可以正常响
我想问问用这四个节省下来的IO口有什么限制没有

#define                LCM2402_DB0_DB7                P1                         // 定义LCM1602的数据总线
sbit LCM2402_RS      = P3 ^ 2;                                        // 定义LCM1602的RS控制线
sbit LCM2402_RW      = P3 ^ 7;                                        // 定义LCM1602的RW控制线
sbit LCM2402_E       = P3 ^ 4;                                        // 定义LCM1602的E控制线
sbit LCM2402_Busy = P1 ^ 7;                                        // 定义LCM1602的测忙线(与LCM1602_DB0_DB7关联)

sbit BUZZ_BIT  = P1 ^ 1;

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

使用道具 举报

沙发
ID:290279 发表于 2018-3-11 09:12 | 只看该作者
没有限制,省下来的四个引脚就是没有用,你可以随便用于其他功能,从你当前发的代码来看,你现在用的还是8位数据线
回复

使用道具 举报

板凳
ID:213173 发表于 2018-3-11 09:31 | 只看该作者
因为#define  LCM2402_DB0_DB7  P1,所以对LCM2402_DB0_DB7操作时写P1高4位必须保留低4位状态不变才不会影响P1.0-1.3的使用。
回复

使用道具 举报

地板
ID:241249 发表于 2018-3-11 10:01 | 只看该作者
xiaok 发表于 2018-3-11 09:12
没有限制,省下来的四个引脚就是没有用,你可以随便用于其他功能,从你当前发的代码来看,你现在用的还是8 ...

是不是这四个脚就不能用了,随便用于其他功能是什么意思,貌似都不能输出高低电平了
这省下来的意义是什么呢
回复

使用道具 举报

5#
ID:241249 发表于 2018-3-11 10:03 | 只看该作者
wulin 发表于 2018-3-11 09:31
因为#define  LCM2402_DB0_DB7  P1,所以对LCM2402_DB0_DB7操作时写P1高4位必须保留低4位状态不变才不会影 ...

能详解一下么。怎么做才能用这P1.0-1.3
因为如果省下来的四个口不能用,意义就没了

谢谢
回复

使用道具 举报

6#
ID:213173 发表于 2018-3-11 21:39 | 只看该作者
weiwei850113 发表于 2018-3-11 10:03
能详解一下么。怎么做才能用这P1.0-1.3
因为如果省下来的四个口不能用,意义就没了

给你一个示例程序:
#include <AT89X51.H>
#define uchar unsigned char
#define uint  unsigned int                         
#define LCD1602 P1
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
uchar num=1;
uint Cnt1ms;
/***********定时器初始化程序****************/
void Timer0Init()                //1毫秒@11.0592MHz
{
        TMOD = 0x01;                //设置定时器模式
        TL0 = 0x66;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA=1;                //开总中断
        ET0=1;                //开定时器0中断       
}
/***************主程序****************/
void main()
{
        Timer0Init();
        while(1);

}
/**************中断服务程序*****************/
void timer0() interrupt        1
{
        TL0 = 0x66;                //设置定时重载值
        TH0 = 0xFC;                //设置定时重载值
        Cnt1ms++;                                //中断变量Cnt1ms自+1
        if(Cnt1ms>=1000)                //1秒
        {
                Cnt1ms=0;
/********操作P1高4位保留低4位状态不变**********/
                if(num%2==0)
                {
                        LCD1602&=0x0f;
                        LCD1602|=0xa0;
                }
                if(num%3==0)
                {
                        LCD1602&=0x0f;
                        LCD1602|=0x50;
                }
/****单独控制P1低4位状态不影响高4位状态*****/
                switch(num)
                {
                        case 1:
                                LED1=0;LED2=1;LED3=1;LED4=1;break;
                        case 2:
                                LED1=1;LED2=0;LED3=1;LED4=1;break;
                        case 3:
                                LED1=1;LED2=1;LED3=0;LED4=1;break;
                        case 4:
                                LED1=1;LED2=1;LED3=1;LED4=0;break;
                        case 5:
                                LED1=1;LED2=0;LED3=0;LED4=1;break;
                        case 6:
                                LED1=0;LED2=1;LED3=1;LED4=0;break;
                        case 7:
                                LED1=1;LED2=0;LED3=1;LED4=0;break;
                        case 8:
                                LED1=0;LED2=1;LED3=0;LED4=1;break;
                        case 9:
                                LED1=1;LED2=1;LED3=1;LED4=1;break;
                        default: break;
                }
                num++;
                if(num>=10)
                        num=1;
        }
}
回复

使用道具 举报

7#
ID:241249 发表于 2018-3-12 19:26 | 只看该作者
wulin 发表于 2018-3-11 21:39
给你一个示例程序:
#include
#define uchar unsigned char

代码如下 请帮忙指点 实在不知道怎么处理

//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);
}
回复

使用道具 举报

8#
ID:291034 发表于 2018-3-12 22:43 | 只看该作者
#define LCD1602_DB P1  //这里还是定义了8位
如果要用低4位的IO单独控制,请参考5楼的的例程,对LCD1602_DB操作之前 ,要保持低4位的数据不变。
回复

使用道具 举报

9#
ID:241249 发表于 2018-3-13 13:32 | 只看该作者
woti 发表于 2018-3-12 22:43
#define LCD1602_DB P1  //这里还是定义了8位
如果要用低4位的IO单独控制,请参考5楼的的例程,对LCD1602_ ...

能帮我指点一下代码怎么改么 谢谢
回复

使用道具 举报

10#
ID:151348 发表于 2018-3-14 12:20 | 只看该作者
直接在网上搜4线驱动1602,程序有很多,并不会占用多的4个IO
回复

使用道具 举报

11#
ID:241249 发表于 2018-3-15 18:52 | 只看该作者
imxuheng 发表于 2018-3-14 12:20
直接在网上搜4线驱动1602,程序有很多,并不会占用多的4个IO

已搞定 谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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