首页 > 编程知识 正文

51单片机4×4计算器键盘程序,51单片机汇编语言

时间:2023-05-05 12:46:19 阅读:274729 作者:4254

键盘分类

键盘分为编码键盘和非编码键盘。
编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值 (如计算机键盘)
非编码键盘:靠软件编程来识别 (分为独立键盘矩阵键盘

在单片机组成的各种系统中,用的最多的是非编码键盘。

独立键盘

独立键盘控制数码管的数值
代码示例:

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit we = P2^7;sbit du = P2^6;sbit S2 = P3^0;sbit S3 = P3^1;uchar counter,time_counter;uchar code leddata[]={0x3F,//00x06,//10x5B,//20x4F,//30x66,//40x6D,//50x7D,//60x07,//70x7F,//80x6F,//90x77,//A0x7C,//B0x39,//C0x5E,//D0x79,//E0x71,//F0x76,//H0x38,//L0x37,//n0x3E, //u0x73,//P0x5C,//o0x40,//_0x00,//熄灭0x00//自定义}; //数字字母的对应数组void delay(uint z)//延时{uint x,y;for(x = z;x > 0;x --)for(y = 114; y > 0; y -- );}void display(uchar i)//数码管显示{uchar shi,ge;shi = i / 10; //求模(十位)ge = i % 10; //求余(个位)P0 = 0xff;we = 1;P0 = 0xbf; //1011 1111点亮第七位数码管we = 0; du = 1;P0 = leddata[shi];du = 0;delay(1);P0 = 0xff;we = 1;P0 = 0x7f; //0111 1111点亮第八位数码管we = 0;du = 1;P0 = leddata[ge];du = 0;delay(1);}void main(){while(1){display(time_counter);if(S2 == 0){delay(5);//软件消抖if(S2 == 0){time_counter ++;while(!S2);//松手检测}}if(S3 == 0){delay(5);//软件消抖if(S3 == 0 && time_counter != 0){time_counter --;while(!S3);}}}} 四乘四矩阵键盘

按下按键,八个数码管显示对应的按键号
代码示例:

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit we = P2^7;sbit du = P2^6;uchar code leddata[]={0x3F,//00x06,//10x5B,//20x4F,//30x66,//40x6D,//50x7D,//60x07,//70x7F,//80x6F,//90x77,//A0x7C,//B0x39,//C0x5E,//D0x79,//E0x71,//F0x76,//H0x38,//L0x37,//n0x3E, //u0x73,//P0x5C,//o0x40,//_0x00,//熄灭0x00//自定义}; //数字字母的对应数组void delay(uint z)//延时{uint x,y;for(x = z;x > 0;x --)for(y = 114; y > 0; y -- );}uchar KeyScan() //带返回值的函数{uchar cord_l,cord_h; //声明列线和行线的值的储存变量P3 = 0xf0;// 1111 0000if((P3 & 0xf0) != 0xf0) //判断是否有按键按下{delay(5);//软件消抖if((P3 & 0xf0) != 0xf0)//判断是否有按键按下{cord_l = P3 & 0xf0; //储存列线值P3 = cord_l | 0x0f;cord_h = P3 & 0x0f; //储存行线值while(P3 & 0x0f != 0x0f);//松手检测return (cord_l + cord_h); //返回键值码}}}void KeyPro(){switch(KeyScan()){//第一行键值码case 0xee: P0 = leddata[0];break;case 0xde: P0 = leddata[1];break;case 0xbe: P0 = leddata[2];break;case 0xee: P0 = leddata[3];break;//第二行键值码case 0xed: P0 = leddata[4];break;case 0xdd: P0 = leddata[5];break;case 0xbd: P0 = leddata[6];break;case 0xed: P0 = leddata[7];break;//第三行键值码case 0xeb: P0 = leddata[8];break;case 0xdb: P0 = leddata[9];break;case 0xbb: P0 = leddata[10];break;case 0xeb: P0 = leddata[11];break;//第四行键值码case 0xe7: P0 = leddata[12];break;case 0xd7: P0 = leddata[13];break;case 0xb7: P0 = leddata[14];break;case 0xe7: P0 = leddata[15];break;}}void mian(){we = 1;//打开位选P0 = 0;//八位数码管全显示we = 0;//锁存位选du = 1;//打开段选while(1){KeyPro(); //提取键值码并且送不同数值给数码管显示}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。