- 單片機C語言程序設計實訓100例
- 彭偉編著
- 711字
- 2018-12-27 05:12:04
3.11 K1~K4控制LED移位
在運行本例時,按下獨立按鍵K1~K4鍵,可分別上下控制連接在P0,P2端口的LED移位顯示。
本例電路如圖3-9所示。

圖3-9 K1~K4控制LED移位電路
程序設計調試與實訓:
因為K1~K4連接在P1端口的高4位,本例在識別按鍵時,將P1端口的值分別與0x10、0x20、0x40、0x80進行與操作,如果與其中之一相與后結果為0,則表明對應按鍵按下,這4個數(shù)高4位分別是0001(1)、0010(2)、0100(4)、1000(8)。
每當有鍵按下時,都會立即導致LED移位顯示,但按鍵未釋放時不會形成LED連續(xù)移位顯示,因為按鍵后Recent_Key保存了P1端口的按鍵狀態(tài)信息,在下一個循環(huán)中,如果P1端口的按鍵尚未釋放,則P1與Recent_Key相等,if語句內的代碼不會執(zhí)行,Move_LED函數(shù)不會被調用,LED不會繼續(xù)出現(xiàn)移位顯示。
每當按鍵釋放時,P1變?yōu)?xFF,此時P1與Recent_Key不相等,if語句內的代碼又再次執(zhí)行,Recent_Key也變?yōu)?xFF,Move_LED函數(shù)被調用,但由于Move_LED函數(shù)內部P1 和0x10,0x20,0x40,0x80執(zhí)行與操作時均不等于0,因此不會導致移位顯示。
當再次有鍵按下時,由于P1不等于值為0xFF的Recent_Key,LED繼續(xù)移位顯示,整個程序的執(zhí)行如此重復。
讀者可以思考如果將K1~K4連接在P1端口的低4位時應該如何修改代碼,另外,讀者還可在單只數(shù)碼管顯示0~9的案例中添加按鍵,使按鍵每次按下時切換數(shù)字顯示。
源程序代碼:
//----------------------------------------------------------------- // 名稱: K1~K4控制LED移位 //----------------------------------------------------------------- // 說明: 按下K1時, P0端口LED上移一位 // 按下K2時, P0端口LED下移一位 // 按下K3時, P2端口LED上移一位 // 按下K4時, P2端口LED下移一位 //----------------------------------------------------------------- #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int //----------------------------------------------------------------- // 延時 //----------------------------------------------------------------- void DelayMS(uint x) { uchar i; while(x--) for(i = 0; i < 120; i++); } //----------------------------------------------------------------- // 根據(jù)P1端口的按鍵移動LED //----------------------------------------------------------------- void Move_LED() { if ((P1 & 0x10) == 0) P0 = _cror_(P0, 1); //K1 else if((P1 & 0x20) == 0) P0 = _crol_(P0, 1); //K2 else if((P1 & 0x40) == 0) P2 = _cror_(P2, 1); //K3 else if((P1 & 0x80) == 0) P2 = _crol_(P2, 1); //K4 } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { uchar Recent_Key; //最近按鍵 P0 = 0xFE; P2 = 0xFE; P1 = 0xFF; Recent_Key = 0xFF; while(1) { if (Recent_Key != P1) { Recent_Key = P1; //保存最近按鍵 Move_LED(); DelayMS(10); } } }
推薦閱讀
- Java程序設計與開發(fā)
- Python高級編程
- Mastering PHP Design Patterns
- C/C++常用算法手冊(第3版)
- Podman實戰(zhàn)
- Getting Started with SQL Server 2012 Cube Development
- Mastering Predictive Analytics with Python
- 實戰(zhàn)Java高并發(fā)程序設計(第3版)
- KnockoutJS Starter
- Natural Language Processing with Java and LingPipe Cookbook
- INSTANT Yii 1.1 Application Development Starter
- 基于SpringBoot實現(xiàn):Java分布式中間件開發(fā)入門與實戰(zhàn)
- ActionScript 3.0從入門到精通(視頻實戰(zhàn)版)
- Building Business Websites with Squarespace 7(Second Edition)
- Python網(wǎng)絡爬蟲實例教程(視頻講解版)