表决器是用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)
|