STC89C52单片机 独立键盘
生活随笔
收集整理的這篇文章主要介紹了
STC89C52单片机 独立键盘
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
獨立鍵盤
鍵盤介紹
鍵盤是電子系統中人機對話的重要組成部分,是人向機器發出指令、輸入信息的必須設備
鍵盤在單片機應用系統中是使用最廣泛的一種數據輸入設備。鍵盤是由多個按鍵組成的。
按鍵的工作原理
按鍵通常是一種常開型開關,常態下按鍵的兩個觸點處于斷開狀態,按下按鍵時它們才閉合。
以下是 輕觸開關和輕觸按鍵 圖
鍵盤類型
通常鍵盤有編碼鍵盤和非編碼鍵盤兩種。編碼鍵盤通過硬件電路產生被按按鍵的鍵值碼,這種鍵盤使用方便,所需程序簡單,但硬件電路復雜,
如計算機的鍵盤,單片機則通常不采用編碼鍵盤。
而軟件編程來識別的稱為非編碼鍵盤,非編碼鍵盤硬件電路簡單。
在單片機組成的各種系統中,最常用的是非編碼鍵盤。
獨立鍵盤與矩陣鍵盤的特點
非編碼鍵盤分為獨立鍵盤和矩陣鍵盤。
獨立鍵盤特點:每個按鍵占用一個IO口,當按鍵數量較多時,IO口利用效率不高,但程序簡單,適用于所需按鍵較少的場合。
矩陣鍵盤特點:電路連接復雜,但提高了IO口利用率,軟件編程較復雜。適用于使用大量按鍵的場合。
相關原理圖分析
按鍵一端與IO口連接,另外一端接地。通過控制IO口輸出高電平即可檢測按鍵是否按下,當按下時IO口會被拉低,松開后IO口回到高電平。
按鍵特性
機械按鍵在按下或松開時會存在抖動現象。
使用獨立按鍵 S2 控制燈 LED1 亮滅;
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選 sbit key_s2 = P3^0;//獨立按鍵S2 uchar num;//數碼管顯示的值 uchar count;//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//毫秒級延時函數定義 void delay(uint z){uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } void main()//main函數自身會循環 {while(1){if(key_s2 == 0)//判斷S2是否被按下{delay(20);//按鍵消抖if(key_s2 == 0){if( count == 0){ // 當 count = 0 的時候 點亮LED1燈P1 = 0XFE; // 點亮 LED1 燈count = 1; }else if(count == 1){ // 當 count = 1 的時候 關閉LED1燈P1 = 0xff; // 關閉所有的LED 燈 count = 0; }}while(!key_s2);//松手檢測}} }獨立按鍵 S2 控制流水燈亮滅。
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選 sbit key_s2 = P3^0;//獨立按鍵S2 sbit key_s3 = P3^1;//獨立按鍵S3 uchar num;//數碼管顯示的值 uchar count; uchar temp; // LED燈相關變量//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//毫秒級延時函數定義 void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } void main() {//main函數自身會循環if(count == 0){temp = 0xfe;P1 = temp; // 1111 1110delay(100);} else if(count == 1) {P1 = 0xff;}while(1){if(count == 0){temp = _crol_(temp, 1); // 循環左移P1 = temp;delay(100);} else if(count == 1) {P1 = 0xff;}if(key_s2 == 0){//判斷S2是否被按下delay(20);//按鍵消抖if(key_s2 == 0){if( count == 0){delay(100); // 延時 100毫秒 通過增加延時的時間或減少延時的時間,來控制流水燈的速度 count = 1;}else if(count == 1){P1 = 0xff; // 關閉所有的LED 燈 count = 0; }}}while(!key_s2);//松手檢測 } }每次按動按鍵 S3,控制數碼管顯示數字加 1,當數碼管數字變為 10 時, 按動按鍵 S3,會讓數碼管重新變為 00。
方法一:
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選 sbit key_s2 = P3^0;//獨立按鍵S2 sbit key_s3 = P3^1;//獨立按鍵S3 sbit key_s4 = P3^2;//獨立按鍵S2 uchar num1 = 0, num2 = 0;//數碼管顯示的值 uchar count = 0;//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//毫秒級延時函數定義 void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } /*==================================== 描述 :兩位共陰數碼管動態顯示 ====================================*/ void display(uchar num1, uchar num2) {/*第一位顯示*/ P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num1];//DU = 0;//鎖存段選數據delay(1);/*第二位顯示*/P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFD; //1111 1101WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num2];//DU = 0;//鎖存段選數據delay(1);}void main()//main函數自身會循環 {display(num1, num2); //數碼管顯示函數while(1){if(key_s3 == 0)//判斷S2是否被按下{delay(20);//按鍵消抖if(key_s3 == 0){num2++; if(num2 == 10){num1 = 1;num2 = 0;count++;} else if(count == 1){num1 = 0;num2 = 0;count = 0;display(num1, num2);}while(!key_s3);//松手檢測 } }display(num1, num2); } }方法二:
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選sbit key_s3 = P3^1;//獨立按鍵S3uchar display_num = 0; // 對數碼管顯示的數值初始化 uchar num1 = 0, num2 = 0;//數碼管顯示的值//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//毫秒級延時函數定義 void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } /*==================================== 描述 :兩位共陰數碼管動態顯示 ====================================*/ void display(uchar num1, uchar num2) {/*第一位顯示*/ P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num1];//DU = 0;//鎖存段選數據delay(1);/*第二位顯示*/P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFD; //1111 1101WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num2];//DU = 0;//鎖存段選數據delay(1);}void main()//main函數自身會循環 {display(num1, num2); //數碼管顯示函數while(1){if(key_s3 == 0)//判斷S2是否被按下{display_num++; // 每按一次獨立按鍵,數碼管顯示的值加 1delay(20);//按鍵消抖if(key_s3 == 0){switch(display_num){ // 通過 switch case 語句對 數碼管的數值進行精準的管理case 0 :num1 = 0;num2 = 0;break; case 1 :num1 = 0;num2 = 1;break;case 2 :num1 = 0;num2 = 2;break;case 3 :num1 = 0;num2 = 3;break;case 4 :num1 = 0;num2 = 4;break;case 5 :num1 = 0;num2 = 5;break;case 6 :num1 = 0;num2 = 6;break; case 7 :num1 = 0;num2 = 7;break; case 8 :num1 = 0;num2 = 8;break;case 9 :num1 = 0;num2 = 9;break;case 10 :num1 = 1;num2 = 0;break;default : // 當display_num數值大于10的時候,display_num 重新賦值0,不能使 display_num 大于 10display_num = 0;num1 = 0;num2 = 0; }while(!key_s3);//松手檢測 } }display(num1, num2); } }每次按動按鍵 S4,控制數碼管顯示數字減 1,當數碼管數字變為 00 時, 按動按鍵 S4,會讓數碼管重新變為 10。
方法一:
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選 sbit key_s2 = P3^0;//獨立按鍵S2 sbit key_s3 = P3^1;//獨立按鍵S3 sbit key_s4 = P3^2;//獨立按鍵S2 uchar num1 = 0, num2 = 0;//數碼管顯示的值 uchar count = 0;//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//毫秒級延時函數定義 void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } /*==================================== 描述 :兩位共陰數碼管動態顯示 ====================================*/ void display(uchar num1, uchar num2) {/*第一位顯示*/ P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num1];//DU = 0;//鎖存段選數據delay(1);/*第二位顯示*/P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFD; //1111 1101WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num2];//DU = 0;//鎖存段選數據delay(1);}void main()//main函數自身會循環 {display(num1, num2); //數碼管顯示函數while(1){if(key_s4 == 0)//判斷S2是否被按下{delay(20);//按鍵消抖if(key_s4 == 0){if(count == 0){num1 = 1;num2 = 0;count++;} else if(count == 1){ num1 = 0;num2 = 9;count++;} else if(count < 11){num2--;count++;} else {count = 0;}if(count == 0){num1 = 1;num2 = 0;count++;} while(!key_s4);//松手檢測 } }display(num1, num2); } }方法二:
/********************************************************************************* * 【作 者】: vvcat * 【版 本】: V1.0 * 【外部晶振】: 11.0592mhz * 【主控芯片】: STC89C52 * 【編譯環境】: Keil μVisio4 * 【程序功能】: 獨立按鍵識別 * 【使用說明】: 每次按動按鍵 S4,控制數碼管顯示數字減 1,當數碼管數字變為 00 時, 按動按鍵 S4,會讓數碼管重新變為 10。 **********************************************************************************/ #include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選 sbit key_s4 = P3^2;//獨立按鍵S4 uchar display_num = 0; // 對數碼管顯示的數值初始化 uchar num1 = 0, num2 = 0;//數碼管顯示的值//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//毫秒級延時函數定義 void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } /*==================================== 描述 :兩位共陰數碼管動態顯示 ====================================*/ void display(uchar num1, uchar num2) {/*第一位顯示*/ P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num1];//DU = 0;//鎖存段選數據delay(1);/*第二位顯示*/P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFD; //1111 1101WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num2];//DU = 0;//鎖存段選數據delay(1);}void main()//main函數自身會循環 {display(num1, num2); //數碼管顯示函數while(1){if(key_s4 == 0)//判斷S4是否被按下{display_num--; // 每按一次獨立按鍵,數碼管顯示的值減去1delay(20);//按鍵消抖if(key_s4 == 0){switch(display_num){ // 通過 switch case 語句對 數碼管的數值進行精準的管理case 0 :num1 = 0;num2 = 0;break; case 1 :num1 = 0;num2 = 1;break;case 2 :num1 = 0;num2 = 2;break;case 3 :num1 = 0;num2 = 3;break;case 4 :num1 = 0;num2 = 4;break;case 5 :num1 = 0;num2 = 5;break;case 6 :num1 = 0;num2 = 6;break; case 7 :num1 = 0;num2 = 7;break; case 8 :num1 = 0;num2 = 8;break;case 9 :num1 = 0;num2 = 9;break;case 10 :num1 = 1;num2 = 0;break;default : // 當display_num數值小于0的時候,display_num 重新賦值10,不能使 display_num 變為負數display_num = 10;num1 = 1;num2 = 0; }while(!key_s4);//松手檢測 } }display(num1, num2); } }每次按動按鍵 S5,可以讓數碼管復位為 0.0.。
/********************************************************************************* * 【作 者】: vvcat * 【版 本】: V1.0 * 【外部晶振】: 11.0592mhz * 【主控芯片】: STC89C52 * 【編譯環境】: Keil μVisio4 * 【程序功能】: 獨立按鍵識別 * 【使用說明】: 按下開發板左下角S3按鍵數碼管值+1,最大到10按下S4按下,值減一,最小減到0按下s5復位 **********************************************************************************/ #include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選sbit key_s3 = P3^1;//獨立按鍵S3 sbit key_s4 = P3^2;//獨立按鍵S4 sbit key_s5 = P3^3;//獨立按鍵S5 uchar num1 = 0, num2 = 0;//數碼管顯示的值 uchar count = 0; uchar count2 = 0;//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//毫秒級延時函數定義 void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } /*==================================== 描述 :兩位共陰數碼管動態顯示 ====================================*/ void display(uchar num1, uchar num2){/*第一位顯示*/ P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num1];//DU = 0;//鎖存段選數據delay(2);/*第二位顯示*/P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFD; //1111 1101WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num2];//DU = 0;//鎖存段選數據delay(2);}/*==================================== 描述 :兩位共陰數碼管復位函數顯示 0.0. ====================================*/ void restoration(){/*第一位顯示*/ P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = 0XBF;// 1011 1111DU = 0;//鎖存段選數據delay(2);/*第二位顯示*/P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFD; //1111 1101WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = 0XBF;// 1011 1111DU = 0;//鎖存段選數據delay(2);}void main()//main函數自身會循環 {while(1){if(count2 == 1){restoration();}else if(count2 == 0){display(num1, num2); //數碼管顯示函數}if(key_s3 == 0)//判斷S2是否被按下{count2 = 0; // 目的是為了調用 display(num1, num2); 數碼管顯示函數count++; delay(20);//按鍵消抖switch(count){ // 通過 switch case 語句對 數碼管的數值進行精準的管理case 0 :num1 = 0;num2 = 0;break; case 1 :num1 = 0;num2 = 1;break;case 2 :num1 = 0;num2 = 2;break;case 3 :num1 = 0;num2 = 3;break;case 4 :num1 = 0;num2 = 4;break;case 5 :num1 = 0;num2 = 5;break;case 6 :num1 = 0;num2 = 6;break; case 7 :num1 = 0;num2 = 7;break; case 8 :num1 = 0;num2 = 8;break;case 9 :num1 = 0;num2 = 9;break;case 10 :num1 = 1;num2 = 0;break;default : // 當count數值大于10的時候,count 重新賦值0,不能使count 大于 10count = 0;num1 = 0;num2 = 0; }while(!key_s3);//松手檢測 display(num1, num2); // 調用函數顯示數值}if(key_s4 == 0)//判斷S4是否被按下{count2 = 0; // 目的是為了調用 display(num1, num2); 數碼管顯示函數count--; // 每次按下 獨立按鍵S4 數碼管數值減一 delay(20);//按鍵消抖if(key_s4 == 0){switch(count){case 0 :num1 = 0;num2 = 0;break; case 1 :num1 = 0;num2 = 1;break;case 2 :num1 = 0;num2 = 2;break;case 3 :num1 = 0;num2 = 3;break;case 4 :num1 = 0;num2 = 4;break;case 5 :num1 = 0;num2 = 5;break;case 6 :num1 = 0;num2 = 6;break; case 7 :num1 = 0;num2 = 7;break; case 8 :num1 = 0;num2 = 8;break;case 9 :num1 = 0;num2 = 9;break;case 10 :num1 = 1;num2 = 0;break;default : // 當count數值小于0的時候,count 重新賦值10,不能使count 變為負數count = 10;num1 = 1;num2 = 0; }while(!key_s4);//松手檢測display(num1, num2); } }if(key_s5 == 0)//判斷S3是否被按下{delay(20);//按鍵消抖if(key_s5 == 0){count = 0; // 按下后count 初始化為0,數碼管的值會從0開始重新計數count2 = 1; // 目的是為了調用 restoration 數碼管顯示函數 顯示0.0.num1 = 0; // 將數碼管第一位的值初始化為0num2 = 0; // 將數碼管第二位的值初始化為0while(!key_s5); // s5松手檢測restoration(); // 目的是為了調用 restoration 數碼管顯示函數 } }} }總結
以上是生活随笔為你收集整理的STC89C52单片机 独立键盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 设计Date类
- 下一篇: STC89C52单片机 点亮两个数码管,