- 單片機C語言程序設計實訓100例
- 彭偉編著
- 485字
- 2018-12-27 05:12:05
3.13 K1~K4分組控制LED
本例區別于前兩種方法,給出了新的識別按鍵的方法,在得出鍵號后分別對LED執行4種不同操作。
本例電路及運行效果如圖3-11所示。

圖3-11 K1~K4分組控制LED電路
程序設計調試與實訓:
程序將4只按鍵所在的P1端口高4位移到低4位,如果有鍵按下,則這4位中必有一位為0,為便于對這一位0所在位置進行判斷,代碼將其預先取反,然后再右移4位,這樣處理后的8位中,僅低4位中有一位為1,其他7位均為0,接下來的循環在該值不等于全0時累加按鍵號,并將該值向右移位,循環中止時即可得出按鍵號1~4,最后根據按鍵號執行相應操作。
讀者可修改程序代碼,在K1按鍵的長按、短按以及雙擊上實現不同的顯示效果。
源程序代碼:
//----------------------------------------------------------------- // 名稱: K1~K4 分組控制LED //----------------------------------------------------------------- // 說明:每次按下K1時遞增點亮一只LED,全亮時再按下則再次循環開始, // K2按下后點亮上面4只LED, // K3按下后點亮下面4只LED, // K4按下后關閉所有LED。 //----------------------------------------------------------------- #include <reg51.h> #define uchar unsigned char #define uint unsigned int //----------------------------------------------------------------- // 延時 //----------------------------------------------------------------- void DelayMS(uint x) { uchar t; while(x--) for(t = 0; t < 120; t++); } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { uchar k,t,Key_State; P0 = 0xFF; P1 = 0xFF; while(1) { t = P1; if (t != 0xFF ) { DelayMS(10); //再次檢查按鍵 if ( t != P1 ) continue; //取得4位按鍵值,由模式XXXX1111(X中有一位為0,其他均為1) //變為模式0000XXXX(X中有一位為1,其他均為0) Key_State = ~t >> 4 ; k = 0; //檢查1所在位置,累加獲取按鍵號k while (Key_State != 0) { k++; Key_State >>= 1; } //根據按鍵號k進行4種處理 switch(k) { case 1: if (P0 == 0x00) P0 = 0xFF; P0 <<= 1 ; DelayMS(200); break; case 2: P0 = 0xF0; break; case 3: P0 = 0x0F; break; case 4: P0 = 0xFF; } } } }
推薦閱讀
- Mastering Ext JS(Second Edition)
- Getting Started with React
- Wireshark Network Security
- 游戲程序設計教程
- Full-Stack React Projects
- Java性能權威指南(第2版)
- JavaScript by Example
- Learning Apache Kafka(Second Edition)
- 教孩子學編程:C++入門圖解
- Bootstrap 4:Responsive Web Design
- Unity 5.x By Example
- ArcGIS By Example
- Python Data Analysis Cookbook
- Python算法指南:程序員經典算法分析與實現
- 零基礎Java學習筆記