久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2993|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久婷婷国产麻豆91 | 91爱爱·com | 成人看片在线观看 | 成人午夜电影在线观看 | h视频在线看 | 婷婷二区 | 国产精品夜夜春夜夜爽久久电影 | 国产精品久久精品 | 男人久久天堂 | 国产亚洲一区二区三区 | 国产乱码精品一区二区三区忘忧草 | jⅰzz亚洲| 91久久国产综合久久 | 亚洲国产成人久久综合一区,久久久国产99 | 一级在线视频 | 91精品国产91久久久久福利 | 亚洲精品久久久久久久久久久久久 | 日韩一区二区久久 | 日韩在线中文字幕 | 成年人国产在线观看 | m豆传媒在线链接观看 | 国产在线资源 | 狠狠色综合久久婷婷 | 国产日韩精品一区二区 | 国产精品久久久久久亚洲调教 | 日韩高清中文字幕 | 视频在线一区二区 | 久久国产精品视频免费看 | 俺去俺来也www色官网cms | 日韩一级免费电影 | 99久久久久久99国产精品免 | 日韩在线国产精品 | 亚洲精品久久久久久久久久久 | 一区二区三区精品 | 成人国产精品色哟哟 | www.天天操| 中文字幕av一区 | 青青草社区 | 成人亚洲性情网站www在线观看 | 自拍偷拍亚洲视频 | 亚洲乱码国产乱码精品精的特点 |