【51單片機零基礎-chapter3:按鍵:獨立按鍵|||附帶常見C語句.邏輯運算符】

將unsigned char var=0;看作溝通二進制和十進制的橋梁
var是8位,初始為0000 0000;
同時可以進行十進制的運算

邏輯運算

在這里插入圖片描述
在這里插入圖片描述
位運算

& 按位與(有0則0)
| 按位或(有1則1)
~ 按位非
^ 按位異或(相同則1,不同為0)
<<按位左移 >>按位右移

位運算符解釋:
0011 1100
<<1 則變為
0111 1000
本質就是去掉最高K個位,最低K個位補充為0
右移同理,最低位k個全舍棄,最高位補充k個0
0011 1100
>>2
0000 11110011 1100 & 0010 0110
0010 0100

在這里插入圖片描述
但是有符號數中負數的右移相當于填個1
在這里插入圖片描述

單片機管腳指IO口
前面的LED燈有高低電平才會亮
單片機上電,所有IO口默認高電平
所以獨立按鍵如果按下則低電平,沒有按下默認高電平
寄存器寫值會送到IO口
寄存器檢測IO口電平,又會讀回寄存器中
松開按鍵讀寄存器則是高電平1,按下則讀的是0
所以檢測管腳電平高低,可以知道是否按下了按鍵.

#include <REGX52.H>
void main(){P2=0xfe;			//MIN bit=0;other bit =1;while(1){;}
}

不難看出,這個點亮單個燈是通過控制寄存器實現的
但是需要給其它位賦值(8位為一組),即通過P2賦值
但我們只想操作最低位,不干涉別的位數強行賦值.
如何制定一位來控制?
打開頭文件不難看到有指定位的方法
在這里插入圖片描述
原來P2寄存器有指定的變量!
P2-0to7有八個引腳的賦值變量
所以有:

不使用0x十六進制全位賦值,指定控制某個位
#include <REGX52.H>
void main(){//P2=0xfe;			//MIN bit=0;other bit =1;P2_0=0;//1-7 bit is unknown,but maybe default 1while(1){;}
}

0是低電平,默認有高電平,此時存在一高一低,所以第一個燈會點亮,而其他的因為沒有賦值默認為1不會點亮因為這些燈全是高電平.
此時你寫了寄存器,那么就會被送到IO口
IO口產生的電平也會被送到寄存器從而得知0與1

獨立按鍵

翻看手冊,看到K1按鍵的口是RXD
在這里插入圖片描述
在這里插入圖片描述
所以K1-RXD-P3_1(P3_1,0,2,3)這個設計有點老了,本應該是0123對應K1234

#include <REGX52.H>
void main(){
//p2是燈,p3是按鍵,pk_num的num指的是第幾個,一般從0開始,但是p3是1023順序,p2是正常的0123while(1){if(P3_1==0){//如果按鍵是低電平,那么說明按下了P2_7=0;//點亮}else{P2_7=1;//高電平,說明是默認值高電平沒有按下,那么不點亮}}
}

按鍵抖動

在這里插入圖片描述
對于獨立按鍵,由于單片機檢測頻率不同于家用電器,單片機是可以監測到抖動的,因為按鍵的小鐵片有彈性,不會馬上變成穩定狀態從而低電平,按下或松開都會發生5-10ms的抖動,這個抖動會導致頻繁的被單片機監測到,從而造成按一下相當于按多次的情況,需要避免.
消抖方法:
1.硬件(不會)
2.軟件,首次監測到執行,然后接下來5-10ms的抖動用延時單片機檢測(delay啥也不干)來處理(首次按下瞬間,松開瞬間后都要消抖)

#include <REGX52.H>
void Delay(unsigned int x)		//@12.000MHz
{while(x--){unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);}
}void main(){while(1){if(P3_1==0){//檢測到按鍵的第一瞬間,馬上執行按鍵消抖Delay(15);while(P3_1==0);//如果沒放手則一直等待//松手對應從while出來的一瞬間,馬上執行松手消抖Delay(15);//消抖完畢,此時執行點亮操作//P2_7=0;P2_7=~P2_7;//按位取反也可點亮,特別適合開關邏輯,p2_7原來是1則變為0,若再按則0變為1熄滅}}
}

按一下,燈光移動一下

8個位置避免溢出,取余解決
燈光移動,以0000 0001邏輯左移解決
這是第k次按,則0000 0001<<k賦給燈光P2

#include <REGX52.H>
void Delay(unsigned int x);void main(){unsigned char ledvar=0;//because un char is 8bits data , and compatible with register data(8 bits)while(1){//default all bits is 1: just as 1111 1111if(P3_1==0){Delay(5);while(P3_1==0);Delay(5);++ledvar;ledvar%=8;P2=~(0x01<<ledvar);}}
}void Delay(unsigned int x)		//@12.000MHz
{while(x--){unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);}
}

稍作更改得到
按鍵1得到右移,按鍵2得到左移
主要還是在代碼的邏輯
因為最終的顯示取決于P2每位的值,以便賦予各管腳高低電平
而P2由0x01即0000 0001的每輪左右得到,這是0x01是不變的
關鍵在于移的位數
如果本輪左移動了7位,那么下一輪左移就左移6位即可(通過右移的位數偏差,實現當輪左移的邏輯)

void main(){unsigned char ledvar=0;//because un char is 8bits data , and compatible with register data(8 bits)while(1){//default all bits is 1: just as 1111 1111if(P3_1==0){Delay(5);while(P3_1==0);Delay(5);++ledvar;ledvar%=8;P2=~(0x01<<ledvar);}else if(P3_0==0){Delay(5);while(P3_0==0);Delay(5);--ledvar;ledvar%=8;P2=~(0x01<<ledvar);			}}
}

按鍵實現二進制燈光模擬:

按k次,二進制是多少,則亮對應的燈
邏輯上,初始全0,恰好無符號字符var就是8位,剛好適合,那么初始置為0,既有0000 0000的數據
此時++,有:
0000 0001第一次
0000 0010第二次
0000 0011第三次按下

1111 1111
0000 0000

核心代碼
void main(){unsigned char ledvar=0//because un char is 8bits data , and compatible with register data(8 bits)while(1){//default all bits is 1: just as 1111 1111if(P3_1==0){Delay(5);while(P3_1==0);Delay(5);++ledvar;p2=~ledvar;}}
}

今天晚上單片機剛到,先結束一個章節.
收工,刷抖音去了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65101.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲如何檢測iOS越獄

不同于安卓的開源生態&#xff0c;iOS一直秉承著安全性更高的閉源生態&#xff0c;系統中的硬件、軟件和服務會經過嚴格審核和測試&#xff0c;來保障安全性與穩定性。 據FairGurd觀察&#xff0c;雖然iOS系統具備一定的安全性&#xff0c;但并非沒有漏洞&#xff0c;如市面上…

在Lua中,Metatable元表如何操作?

Lua中的Metatable&#xff08;元表&#xff09;是一個強大的特性&#xff0c;它允許我們改變表&#xff08;table&#xff09;的行為。下面是對Lua中的Metatable元表的詳細介紹&#xff0c;包括語法規則和示例。 1.Metatable介紹 Metatable是一個普通的Lua表&#xff0c;它用于…

Python基于matplotlib實現樹形圖的繪制

在Python中&#xff0c;你可以使用matplotlib庫來繪制樹形圖&#xff08;Tree Diagram&#xff09;。雖然matplotlib本身沒有專門的樹形圖繪制函數&#xff0c;但你可以通過組合不同的圖形元素&#xff08;如線條和文本&#xff09;來實現這一點。 以下是一個簡單的示例&#…

2 秒殺系統架構

第一步 思考面臨的問題和業務場景 秒殺系統面臨的問題: 短時間內并發非常高&#xff0c;如果按照秒殺的并發做相應的承載會造成大量資源的浪費。第二解決超賣的問題。 第二步 思考目前的處境和解決方案 因為秒殺系統屬于短時間內的高并發問題&#xff0c;我們不可能使用那么…

12306分流搶票軟件 bypass v1.16.43 綠色版(春節自動搶票工具)

軟件介紹 12306Bypass分流搶票軟件&#xff0c;易操作強大的12306搶票軟件&#xff0c;全程自動搶票&#xff0c;云識別驗證碼打碼&#xff0c;多線程秒單、穩定撿漏&#xff0c;支持搶候補票、搶到票自動付款&#xff0c;支持多天、多車次、多席別、多乘客、短信提醒等功能。…

淺談torch.utils.data.TensorDataset和torch.utils.data.DataLoader

1.torch.utils.data.TensorDataset 功能定位 torch.utils.data.TensorDataset 是一個將多個張量&#xff08;Tensor&#xff09;數據進行簡單包裝整合的數據集類&#xff0c;它主要的作用是將相關聯的數據&#xff08;比如特征數據和對應的標簽數據等&#xff09;組合在一起&…

【Go】運行自己的第一個Go程序

運行自己的第一個Go程序 一、Go語言的安裝Go環境安裝查看是否安裝成功配置GOPROXY(代理) 二、Goland安裝三、Goland破解四、新建項目 開一篇專欄記錄學習Go的過程&#xff0c;一門新語言從hello world開始&#xff0c;這篇文章詳細講解Go語言環境搭建及hello world實現 一、Go語…

計算機的錯誤計算(二百零一)

摘要 用兩個大模型計算 &#xff0c;結果保留 10位有效數字。實驗表明&#xff0c;兩個大模型的輸出均只有1位正確數字&#xff1b;并它們幾乎相同&#xff1a;僅最后1位數字不同。 例1. 計算 , 結果保留 10位有效數字。 下面是與一個數學解題器的對話。 以上為與一個數學解…

下載excel

1.引入依賴 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-oo…

2024 年度時序數據庫 IoTDB 論文總結

論文成果總結 2024 年度&#xff0c;時序數據庫 IoTDB 在數據庫領域 CCF-A 類國際會議上共發表論文 8 篇&#xff0c;包括&#xff1a;SIGMOD 3 篇、VLDB 3 篇、ICDE 2 篇&#xff0c;涵蓋存儲、引擎、查詢、分析等方面。 2024 最后一天&#xff0c;我們將分類盤點 IoTDB 本年的…

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found

這個問題之前遇到過&#xff0c;沒有記錄&#xff0c;導致今天又花了2小時 原因是沒有GLIBC——2.32 使用以下命令查一下有哪些版本&#xff1a; strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_ 我已經安裝好了&#xff0c;所有有2.32版本 原因是當前的ubuntu版本…

海南省大數據發展中心:數據資產場景化評估案例手冊(第二期)

2025年1月3日&#xff0c;海南省數據產品超市印發《數據資產場景化評估案例手冊&#xff08;第二期&#xff09;》&#xff08;以下簡稱《手冊》&#xff09;&#xff0c;該手冊是基于真實數據要素典型應用場景進行數據資產評估操作的指導性手冊&#xff0c;為企業在數據資產入…

python3GUI--智慧交通監控與管理系統 By:PyQt5

文章目錄 一&#xff0e;前言二&#xff0e;預覽三&#xff0e;軟件組成&技術難點1.軟件組成結構2.技術難點3.項目結構 四&#xff0e;總結 大小&#xff1a;35.5 M&#xff0c;軟件安裝包放在了這里! 一&#xff0e;前言 博主高產&#xff0c;本次給大家帶來一款我自己使…

Linux高并發服務器開發 第八天(makefile的規則 wildcard/patsubst函數 普通變量/自動變量/其他關鍵字)

目錄 1.makefile 1.1makefile的規則 1.2兩個函數 1.3三個自動變量 1.3.1普通變量 (自定義變量) 1.3.2自動變量 1.3.3其他關鍵字 - ALL/all - clean 1.makefile - 作用&#xff1a;進行項目管理。 - 初步學習&#xff1a;1個規則、2個函數、3個自動變量。 - 要想使用默…

Vue動態控制disabled屬性

參考:https://blog.csdn.net/guhanfengdu/article/details/126082781 在Vue中disabled:的值是受布爾值影響的&#xff0c;false為關閉禁用&#xff0c;true為開啟禁用效果。 結果就是true會讓按鈕禁用 相反false會讓按鈕重新可以使用 那如果想要通過id屬性值來判斷是否禁用…

【DevOps】Jenkins項目發布

Jenkins項目發布 文章目錄 Jenkins項目發布前言資源列表基礎環境一、Jenkins發布靜態網站1.1、項目介紹1.2、部署Web1.3、準備gitlab1.4、配置gitlab1.5、創建項目1.6、推送代碼 二、Jenkins中創建gitlab憑據2.1、創建憑據2.2、在Jenkins中添加遠程主機2.3、獲取gitlab項目的UR…

每日一學——自動化工具(Jenkins)

3.2 Jenkins 3.2.1 CI/CD流程設計 嘿&#xff0c;小伙伴們&#xff01;今天我們來聊聊Jenkins——這個在持續集成&#xff08;CI&#xff09;和持續部署&#xff08;CD&#xff09;領域里大名鼎鼎的工具。Jenkins不僅可以幫我們自動化構建和測試代碼&#xff0c;還能自動部署…

Vue2/Vue3使用DataV

Vue2 注意vue2與3安裝DataV命令命令是不同的Vue3 DataV - Vue3 官網地址 注意vue2與3安裝DataV命令命令是不同的 vue3vite 與 Vue3webpack 對應安裝也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…

【AI學習】Transformer深入學習(二):從MHA、MQA、GQA到MLA

前面文章&#xff1a; 《Transformer深入學習&#xff08;一&#xff09;&#xff1a;Sinusoidal位置編碼的精妙》 一、MHA、MQA、GQA 為了降低KV cache&#xff0c;MQA、GQA作為MHA的變體&#xff0c;很容易理解。 多頭注意力&#xff08;MHA&#xff09;&#xff1a; 多頭注…

trendFinder - 利用 AI 掌握社交媒體上的熱門話題

1600 Stars 177 Forks 7 Issues 2 貢獻者 MIT License Javascript 語言 代碼: https://github.com/ericciarla/trendFinder 更多AI開源軟件&#xff1a;AI開源 - 小眾AI Trend Finder 收集并分析來自關鍵影響者的帖子&#xff0c;然后在檢測到新趨勢或產品發布時發送 Slack 通知…