表決器是用1602液晶顯示的,基于51單片機和矩陣按鍵,計算器是用數碼管顯示的
4*4矩陣鍵盤掃描方法一:
逐行掃描:我們可以通過高四位輪流輸出低電平來對矩陣鍵盤進行逐行掃描,當低四位接收到的數據不全為1的時候,說明有按鍵按下,然后通過接收到的數據是哪一位為0來判斷是哪一個按鍵被按下。
方法二:
行列掃描:我們可以通過高四位全部輸出低電平,低四位輸出高電平。當接收到的數據,低四位不全為高電平時,說明有按鍵按下,然后通過接收的數據值,判斷是哪一列有按鍵按下,然后再反過來,高四位輸出高電平,低四位輸出低電平,然后根據接收到的高四位的值判斷是那一行有按鍵按下,這樣就能夠確定是哪一個按鍵按下了。
ppt課件:
表決器單片機源程序如下:
- /**********************BST-M51實驗開發板例程************************
- * 平臺:BST-M51 + Keil U4 + STC89C52
- * 名稱:表決器
- * 公司:深圳市亞博軟件開發有限公司
- * 日期:2012-8-12
- * 晶振:11.0592MHZ
- ******************************************************************
- 程序功能:表決器,模擬三位評委的表決,并做出判斷,將結果顯示于1602上。
- 共用到薄膜鍵盤上的“1,2,4,5,7,8,*”
- 其中“*”為清零鍵,對1602進行清屏和對相關變量清零。
- 每位評委操控兩個按鍵,分別代表“通過”和“不通過”。
- 第一位評委控制“1”(通過)與“2”(不通過);
- 第二位評委控制“3”(通過)與“4”(不通過);
- 第三位評委控制“5”(通過)與“6”(不通過);
- 當按“通過”次數多于“不通過”時,1602將顯示“yes”,否則顯示“no”。
- 在一個回合中,每位評委只有一次按鍵的權利,一旦按下,其操控的兩個
- 按鍵均將被封鎖,再按也不會有任何作用。除非按下清零鍵“*”清零后開始下一回合。
- ************************************************************************************/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit rs=P1^0;
- sbit rw=P1^1;
- sbit beep=P2^3;
- sbit lcden=P2^5;
- bit ok1,ok2,ok3,clear;
- uchar pass,nopass,temp;
- uchar table[]="yes";
- uchar table1[]="no";
- uchar table2[]="agree";
- uchar table3[]="disagree";
- uchar table4[]=" ";
- uchar table5[]=" ";
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)
- {
- rs=0;
- lcden=0;
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_date(uchar date)
- {
- rs=1;
- lcden=0;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init()
- {
- rw=0;
- write_com(0x38);
- delay(20);
- write_com(0x0c);
- delay(20);
- write_com(0x06);
- delay(20);
- write_com(0x01);
- delay(20);
-
- }
- void yes()
- {
- uchar a;
- write_com(0x80+12);
- delay(20);
- for(a=0;a<3;a++)
- {
- write_date(table[a]);
- delay(20);
- }
- }
- void no()
- {
- uchar a;
- write_com(0x80+0x40+12);
- delay(20);
- for(a=0;a<2;a++)
- {
- write_date(table1[a]);
- delay(20);
- }
- }
- void agree()
- {
- uchar a;
- write_com(0x80);
- delay(20);
- for(a=0;a<5;a++)
- {
- write_date(table2[a]);
- delay(20);
- }
- }
- void disagree()
- {
- uchar a;
- write_com(0x80+0x40);
- delay(20);
- for(a=0;a<8;a++)
- {
- write_date(table3[a]);
- delay(20);
- }
- }
- void keyscan()
- {
- if(!ok1)
- {
- P3=0xfe;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xee: //1110 1110 "1"被按下
- pass++;
- ok1=1; //一號評委已判決。
- break;
- case 0xde: //1101 1110 "2"被按下
- nopass++;
- ok1=1;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- beep=0;
- }
- beep=1;
- }
- }
- }
- if(!ok2)
- {
- P3=0xfd;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xed: //1110 1101 "4"被按下
- pass++;
- ok2=1;
- break;
- case 0xdd: //1101 1101 "5"被按下
- nopass++;
- ok2=1;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- beep=0;
- }
- beep=1;
- }
- }
- }
- if(!ok3)
- {
- P3=0xfb;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xeb: //1110 1011 "7"被按下
- pass++;
- ok3=1;
- break;
- case 0xdb: //1101 1011 "8"被按下
- nopass++;
- ok3=1;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- beep=0;
- }
- beep=1;
- }
- }
- }
- P3=0xf7;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xe7: //1110 0111 "*"被按下
- clear=1;
- break;
-
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- beep=0;
- }
- beep=1;
- }
- }
- }
- void main()
- {
- uchar a,b;
- init();
- while(1)
- {
- agree();
- disagree();
- keyscan();
- if(pass||nopass)
- {
- write_com(0x80+10);
- delay(20);
- write_date(0x30+pass);
- write_com(0x80+0x40+10);
- delay(20);
- write_date(0x30+nopass);
- }
- a=pass+nopass;
- if(a==3)
- {
- if(pass>nopass)
- yes();
- if(pass<nopass)
- no();
- }
- if(clear)
- {
- ok1=0; ok2=0; ok3=0;
- pass=0; nopass=0; clear=0; a=0;
- agree();
- disagree();
- write_com(0x80+10);
- delay(20);
- write_date(0x30+pass);
- write_com(0x80+0x40+10);
- delay(20);
- write_date(0x30+nopass);
-
- write_com(0x80+12);
- for(b=0;b<3;b++)
- {
- write_date(table4[b]);
- delay(20);
- }
- write_com(0x80+0x40+12);
- for(b=0;b<2;b++)
- {
- write_date(table5[b]);
- delay(20);
- }
- }
- }
- }
復制代碼
單片機源程序如下:
- /**********************BST-M51實驗開發板例程**************
- * 平臺:BST-M51 + Keil U4 + STC89C52
- * 名稱:矩陣鍵盤掃描 數碼管顯示
- * 公司:深圳市亞博軟件開發有限公司
- * 日期:2015-7
- * 晶振:11.0592MHZ
- *實驗效果 :按4*4矩陣按鍵,數碼管4位依次顯示1,2,3,A,
- 4,5,6,B,
- 7,8,9,C,
- E,0,F,D
- *********************************************************/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
- 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 ,
- 0x5e , 0x79 , 0x71 , 0x00}; //0-9&A-F&“不顯示” 字型碼
- void delay(uint xms) //延遲xms
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=112;j>0;j--);
- }
- void display(uchar num) //數碼管顯示函數
- {
- P0=table[num]; //段選
- }
- void keyscan4x4()
- {
- uchar temp,key;
- ///////////////第一行掃描///////////////////
- P3=0xfe;//1111 1110 讓P3.0口輸出低
- temp=P3;
- temp=temp&0xf0;//1111 0000 位與操作 屏蔽后四位
- if(temp!=0xf0)
- {
- delay(10);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xee: //1110 1110 "1"被按下
- key=1;
- break;
- case 0xde: //1101 1110 "2"被按下
- key=2;
- break;
- case 0xbe: //1011 1110 "3"被按下
- key=3;
- break;
- case 0x7e: //0111 1110 "A"被按下
- key=10;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- display(key);
- }
- }
- ///////////////第二行掃描///////////////////
- P3=0xfd;//1111 1101 讓P3.1口輸出低
- temp=P3;
- temp=temp&0xf0;//1111 0000 位與操作 屏蔽后四位
- if(temp!=0xf0)
- {
- delay(10);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xed: //1110 1101 "4"被按下
- key=4;
- break;
- case 0xdd: //1101 1101 "5"被按下
- key=5;
- break;
- case 0xbd: //1011 1101 "6"被按下
- key=6;
- break;
- case 0x7d: //0111 1101 "B"被按下
- key=11;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- display(key);
- }
- }
- ///////////////第三行掃描///////////////////
- P3=0xfb;//1111 1011 讓P3.2口輸出低
- temp=P3;
- temp=temp&0xf0;//1111 0000 位與操作 屏蔽后四位
- if(temp!=0xf0)
- {
- delay(10);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xeb: //1110 1011 "7"被按下
- key=7;
- break;
- case 0xdb: //1101 1011 "8"被按下
- key=8;
- break;
- case 0xbb: //1011 1011 "9"被按下
- key=9;
- break;
- case 0x7b: //0111 1011 "C"被按下
- key=12;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- display(key);
- }
- }
- ///////////////第四行掃描///////////////////
- P3=0xf7;//1111 0111 讓P3.0口輸出低
- temp=P3;
- temp=temp&0xf0;//1111 0000 位與操作 屏蔽后四位
- if(temp!=0xf0)
- {
- delay(10);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xe7: //1110 0111 "*"被按下
- key=14;
- break;
- case 0xd7: //1101 0111 "0"被按下
- key=0;
- break;
- case 0xb7: //1011 0111 "#"被按下
- key=15;
- break;
- case 0x77: //0111 0111 "D"被按下
- key=13;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- display(key);
- }
- }
- }
- void main()
- {
- P2 = P2 | 0xf0; //位選 鎖存為4位同時顯示
- while(1)
- {
- keyscan4x4();
- }
- }
復制代碼
所有資料51hei提供下載:
矩陣鍵盤掃描.zip
(4.68 MB, 下載次數: 29)
2018-9-12 20:06 上傳
點擊文件名下載附件
|