- 單片機C語言程序設計實訓100例
- 彭偉編著
- 478字
- 2018-12-27 05:12:05
3.14 K1~K4控制數碼管移位顯示
本例給出不同的識別多位獨立按鍵的方法,并用按鍵控制數碼管的顯示。
本例電路及運行效果如圖3-12所示。
程序設計調試與實訓:
本例用直接與P1端口狀態進行比較的方法識別獨立按鍵,因為P1端口沒有連接其他元件,其狀態相對固定,因此使用這種方法也能很有效地識別獨立按鍵。在顯示數碼時,程序中使用了8位的顯示緩沖Display_Buffer,待顯示的數碼被預先存在Display_Buffer數組中。
讀者可將電路中原有的8位數碼管改為4位數碼管(例如,7SEG-MPX-CA-BLUE),然后修改代碼,在4只集成式數碼管上實現按鍵控制移位顯示。

圖3-12 K1~K4控制數碼管移位顯示電路
源程序代碼
//----------------------------------------------------------------- // 名稱: K1~K4 控制數碼管移位顯示 //----------------------------------------------------------------- // 說明: 按下K1時加1計數并增加顯示位, // 按下K2時減1計數并減少顯示位, // 按下K3時清零。 //----------------------------------------------------------------- #include <reg51.h> #define uchar unsigned char #define uint unsigned int //0~9的段碼,0xFF為黑屏 uchar code DSY_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF}; //位碼 uchar code DSY_Index[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //待顯示到各數碼管的數字緩沖(開始時僅在0位上顯示0,其他數碼管黑屏) uchar Display_Buffer[] = {0,10,10,10,10,10,10,10}; //----------------------------------------------------------------- // 延時 //----------------------------------------------------------------- void DelayMS(uint x) { uchar t; while(x--) for(t = 0; t < 120; t++); } //----------------------------------------------------------------- // 顯示 //----------------------------------------------------------------- void Show_Count_ON_DSY() { uchar i; for(i = 0; i < 8; i++) { P2 = DSY_Index[i]; //位碼 P0 = DSY_CODE[Display_Buffer[i]] ; //段碼 DelayMS(2); } } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { uchar i; uchar Key_NO, Key_Counts=0; P0 = 0xFF; P1 = 0xFF; P2 = 0x00; while(1) { Show_Count_ON_DSY(); P1 = 0xFF; Key_NO = P1; //P1端口按鍵狀態分別為K1-11111110(0xFE),K2-11111101(0xFD),K3-11111011 (0xFB) switch(Key_NO) { case 0xFE: Key_Counts++; if (Key_Counts > 8) Key_Counts = 8; Display_Buffer[Key_Counts-1] = Key_Counts; break; case 0xFD: if (Key_Counts > 0) Display_Buffer[--Key_Counts] = 10; if (Key_Counts ==0) Display_Buffer[0] = 0; break; case 0xFB: Display_Buffer[0] = 0; for(i = 1; i < 8; i++) Display_Buffer[i] = 10; Key_Counts = 0; } //如果按鍵未釋放則僅執行刷新顯示,不進行按鍵掃描 while (P1 != 0xFF) Show_Count_ON_DSY(); } }
推薦閱讀
- C++案例趣學
- jQuery Mobile Web Development Essentials(Third Edition)
- HoloLens Beginner's Guide
- Practical Windows Forensics
- STM32F0實戰:基于HAL庫開發
- ADI DSP應用技術集錦
- H5頁面設計:Mugeda版(微課版)
- 運用后端技術處理業務邏輯(藍橋杯軟件大賽培訓教材-Java方向)
- 響應式Web設計:HTML5和CSS3實戰(第2版)
- OpenCV 3計算機視覺:Python語言實現(原書第2版)
- Test-Driven iOS Development with Swift
- Mastering Object:Oriented Python(Second Edition)
- 每個人的Python:數學、算法和游戲編程訓練營
- Elasticsearch實戰(第2版)
- 區塊鏈原理、架構與應用(第2版)