51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真


文章目录

  • 51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真
  • 实验内容
  • 一、实验一 矩阵键盘中断实验 数码管显示
    • 1.仿真图
    • 2.代码
  • 二、实验二 矩阵键盘简易计算器 LCD显示
    • 1.仿真图
    • 2.代码
  • 总结

实验内容

设计一个单片机键盘接口电路,实现4*4矩阵键盘,用数码管显示相应按键内容,当指定某一个按键连续被按三次时,显示“口”字符号,按键有去抖动功能,数码管可以通过清零键清零。

在设计4*4矩阵键盘基础上,完成两个数的加、减、乘、除运算,结果通过数码管或液晶显示。


一、实验一 矩阵键盘中断实验 数码管显示

1.仿真图

2.代码


//0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 共阴
//0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E 共杨#include <reg52.h>#define GPIO_DIG    P0   //段选数码管
#define GPIO_KEY     P2      //矩阵按键
sbit led = P1^0;
typedef unsigned char uchar;
typedef unsigned int uint;uint keynum = 0;uint count=0;uchar code table[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};uchar code table0[]={0x5c};void delay( uchar i ){while( i-- );
}void key44scan(void)//键盘扫描函数
{
//      uint count=0;uint t;P2=0xfe;t=P2;t=t&0xf0;if(t!=0xf0){delay(100);if(t!=0xf0){t=P2;count++;switch(t){case 0xee:keynum=1; break;case 0xde:keynum=5; break;case 0xbe:keynum=9; break;case 0x7e:keynum=13; break;             }P0=table[keynum];while(t!=0xf0){t=P2;t=t&0xf0;}}}P2=0xfd;t=P2;t=t&0xf0;if(t!=0xf0){delay(100);if(t!=0xf0){t=P2;count++;switch(t){case 0xed:keynum=2; break;case 0xdd:keynum=6; break;case 0xbd:keynum=10; break;case 0x7d:keynum=14; break;             }P0=table[keynum];while(t!=0xf0){            t=P2;t=t&0xf0;}}}P2=0xfb;t=P2;t=t&0xf0;if(t!=0xf0){delay(100);if(t!=0xf0){t=P2;count++;switch(t){case 0xeb:keynum=3; break;case 0xdb:keynum=7; break;case 0xbb:keynum=11; break;case 0x7b:keynum=15; break;             }P0=table[keynum];while(t!=0xf0){             t=P2;t=t&0xf0;}}}P2=0xf7;t=P2;t=t&0xf0;if(t!=0xf0){delay(100);if(t!=0xf0){t=P2;count++;switch(t){case 0xe7:keynum=4; break;case 0xd7:keynum=8; break;case 0xb7:keynum=12; break;case 0x77:keynum=0; break;             }P0=table[keynum];while(t!=0xf0){             t=P2;t=t&0xf0;}}}
//          if(count==3){//                      count = 0;
//                      led =~ led;
//                      P0=table0[0];
//                      delay(1000);
//                  }}void main (){led = 0;while(1) {key44scan();if(count==3){//count = 0;led =~ led;P0=table0[0];//  delay(1000);}if(count==4){count = 0;led =~ led;P0=table[0];//  delay(1000);}}
}

二、实验二 矩阵键盘简易计算器 LCD显示

1.仿真图

2.代码

#include"reg52.h"
#include"math.h"#define uchar unsigned char
#define uint unsigned int#define key P1
#define duan P2
#define wei P3sbit led=P0^0;
sbit buzzer=P0^1;uchar num,temp,num1,i=0;
long bczs=0,czs=0,jiguo=0,jiguo1=0;
uchar czs12=1;   //输入数的选择标志位,1为第一个数,2为第二个数
uchar yiweiflag,qinflag;  //移位标志uchar code shuzi[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};     //0~9,-,
uchar code weizi[9]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code error[10]={0xff,0xaf,0xc0,0xaf,0xaf,0x86,0xff,0xff,0xff};//error
uchar playshuzu[9],fuhao;
uchar temp1[8],mm[4],temp2[8];
uchar zhi,weishu=0;void init();          //函数申明
uchar keyscan();
uchar scanzhi();
void display();
void duzhichuli();
void zhuandisplayjiguo();
void jiafa();
void jianfa();
void chengfa();
void chufa();
void qin();
void displayerror();
//======================================
void main()           //主函数
{init();display();while(1){duzhichuli();}
}
//===============================================================================
void init()
{uchar i;czs12=1;yiweiflag=1;  //1不移qinflag=0;    //不清除duan=shuzi[8];wei=weizi[5];playshuzu[1]=shuzi[0];for(i=2;i<9;i++)playshuzu[i]=shuzi[10];bczs=0;czs=0;jiguo=0,jiguo1=0;
}
//===============================================================================
void delay(uint x)
{uchar y;for(x;x>0;x--)for(y=112;y>0;y--);
}//====================================
uchar keyscan()
{unsigned char recode,i,j;for(i=0;i<4;i++){P1=~(0x01<<i);recode=P1>>4;if(recode<0x0f){ for(j=0;j<4;j++){if(!(recode&0x01<<j))break;} return (i<<2)+(j+1); //返回键值 1-16} delay(5); //延时5ms}return 0; //无按键返回
}
//========================================
uchar scanzhi()
{uchar zhi,k;k=keyscan();switch(k){case 0: zhi=27;break;case 1: zhi=7;break;case 2: zhi=8;break;case 3: zhi=9;break;case 4: zhi=24;break;   // /case 5: zhi=4;break;case 6: zhi=5;break;case 7: zhi=6;break;case 8: zhi=23;break;   //*case 9: zhi=1;break;case 10: zhi=2;break;case 11: zhi=3;break;case 12: zhi=22;break;   //-case 13: zhi=26;break;  //nccase 14: zhi=0;break;case 15: zhi=25;break;  //=case 16: zhi=21;break;  //+}return(zhi);
}
//===========================================
void duzhichuli()
{uchar tt,u;tt=scanzhi();if(tt!=27){led=0;buzzer=0;if(tt<=9)//数字输入{if(qinflag==1)  qin();qinflag=0;if(yiweiflag!=1){for(u=8;u>1;u--)             //移位输入{playshuzu[u]=playshuzu[u-1];} }yiweiflag=0;    //移位playshuzu[1]=shuzi[tt];   if(czs12==1)   bczs=bczs*10+tt;         //if(czs12==2)   czs=czs*10+tt;     }if(tt>20)//符号输入{switch(tt){case 21:       jiafa();break;        //+case 22:    jianfa();break;     //-case 23:    chengfa();break; //*case 24:    chufa();break;case 25:    zhuandisplayjiguo();break;     //=case 26:    init();break;       //nc}       } }//-----------------------------------------------while(tt!=27)     //松手检测{led=0;buzzer=0;tt=scanzhi();delay(1);if(tt==27) goto chu;}chu: delay(1);led=1;buzzer=1;
}//============================================
void display()
{TMOD=0x01;TH0=(65536-200)/256;TL0=(65536-200)%256;EA=1;ET0=1;TR0=1;}
void TIME0(void) interrupt 1
{TH0=(65536-200)/256;TL0=(65536-200)%256;i++;if(i==9) i=1;wei=weizi[i];duan=playshuzu[i];
}
//===============================================       //显示数转操作数
void zhuandisplayjiguo()
{uchar i,k;long ttt;for(i=1;i<9;i++)playshuzu[i]=shuzi[10];//----------------------------------------switch(fuhao){case 1: jiguo=bczs+czs;break;case 2: jiguo=bczs-czs;break;case 3: jiguo=bczs*czs;break;case 4: jiguo=bczs/czs;break;case 0: jiguo=jiguo1;break;}fuhao=0;//----------------------------------------ttt=jiguo;jiguo1=jiguo;                               //显示处理k=1;                  //取数的个数for(i=1;i<=8;i++){if(ttt/10!=0)  k++;ttt=ttt/10;  }   for(i=8;i>k;i--){playshuzu[i]=shuzi[10];}if(jiguo<0)  { jiguo=fabs(jiguo);playshuzu[k+1]=shuzi[11]; }   //取正加负号for(i=1;i<=k;i++){playshuzu[i]=shuzi[jiguo%10];jiguo=jiguo/10;   }if(jiguo1>99999999) displayerror();}
//===================================================
void qin()
{uchar i;yiweiflag=1;  //1不移playshuzu[1]=shuzi[0];for(i=2;i<9;i++)playshuzu[i]=shuzi[10];
}
//===================================================
void displayerror()
{uchar i;for(i=1;i<=8;i++)playshuzu[i]=error[i];
}
//===================================================
void jiafa()   //+
{qinflag=1;if(jiguo1!=0) bczs=jiguo1;czs=0;czs12=2;fuhao=1;   //+
}void jianfa()
{qinflag=1;if(jiguo1!=0) bczs=jiguo1;czs=0;czs12=2;fuhao=2;   //-
}void chengfa()
{qinflag=1;if(jiguo1!=0) bczs=jiguo1;czs=0;czs12=2;fuhao=3;   //*
}void chufa()
{qinflag=1;if(jiguo1!=0) bczs=jiguo1;czs=0;czs12=2;fuhao=4;   // /
}

总结

大佬们,可以支持一下。谢谢!!!
实验一 矩阵键盘中断实验 数码管显示
实验二 矩阵键盘简易计算器 LCD显示

51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真相关推荐

  1. 【51单片机】矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤

    [51单片机]矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤 一.环境 二.硬件部分 1. Proteus新建工程 2. 添加元件 3.连接线路 4.硬件效果 三.软件部分 1 ...

  2. 51单片机4x4矩阵键盘扫描+数码管显示

    51单片机4x4矩阵键盘扫描+数码管显示 个位闪烁感在这篇文章已经修复<51单片机4x4矩阵键盘扫描+数码管显示(二)(修bug篇)> 材料:AT89C52.2位数码管.74HC595. ...

  3. 51单片机开发实例 基于51单片机的矩阵键盘+显示

    一.系统设计 通过在矩阵键盘内输入数字并在LCD1602上进行显示,可以输入的数字有16个,分别是0-15.按下矩阵键盘就会上LCD1602上显示对应的数字,整个系统使用STC89C52单片机进行主控 ...

  4. 使用51单片机的矩阵键盘和LCD1602做一个密码锁

    文章目录 前言 一.工具准备 工具一:51单片机 工具二:LCD1602液晶显示屏 工具三:Keil软件 二.开始操作 1.LCD1602的程序调试 2.矩阵键盘的程序调试 3.密码锁程序设计 总结 ...

  5. (五)51单片机基础——矩阵键盘

    矩阵键盘介绍: 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的"扫描",就可以读出任何位置按键的状态 扫描: 数码管扫描(输出扫描) 原 ...

  6. 51单片机入门——矩阵键盘(附51代码)

    1.硬件介绍 矩阵键盘电路图 硬件如图非常简单,将一个4*4的矩阵键盘的8个管脚引到端子上,在连接到8个I/O口上,ARRAY_H代表着行,ARRAY_L代表着列,当行与列的电平都置低的时候,就选中的 ...

  7. 单片机学习笔记————51单片机实现矩阵键盘的组合按键触发

    一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...

  8. 51单片机之矩阵键盘多按键检测和松手检测

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 文章目录 前言 一.矩阵键盘是什么? 二.多按键检测 1.基本思想 三.松手检测 四.你如何拿去使用? 其他的随便,但是这玩 ...

  9. 21、基于51单片机智能电饭堡系统设计(程序+原理图+PCB图+Proteus仿真+答辩技巧+开题报告+参考论文+元器件清单等)

    摘  要 电饭煲是人们日常生活中最普遍的家用电器,随着人们生活水平的提到,电饭煲也日趋智能化,本课题主要基于家电智能化的背景下,根据智能电饭煲的发展和现状,探讨智能电饭煲如何实现智能化的煮饭.预约.再 ...

最新文章

  1. Linux绝对权限和相对权限法,Linux基础学习笔记
  2. 部署Oracle数据库
  3. python 自定义log
  4. java设计模——反射的应用 (利用反射来去除if判断语句)
  5. libusb usb设备访问接口库
  6. C/C++中near和far的区别
  7. python文件路径过滤器_SUMO入门(八) - 从Python引入TraCI接口
  8. php商品显示循环,php – 如何在循环中显示GROUP BY数据
  9. Linux 内核参数及Oracle相关参数调整
  10. linux系统下如何创建二级域名和删除这个目录文件
  11. 迪杰斯特拉算法 php,最短路径算法
  12. numpy array
  13. 用C#,SQL Server编写的音乐播放软件
  14. 命运2服务器维修,命运2服务器
  15. java对象转json字符串
  16. java简单封装FusionChartsFree.
  17. 投资港股市场该选择哪种交易接口获取行情数据?
  18. html怎么拼图没有缝隙,【答疑】ps怎么拼图不留缝隙?急需答案!! - 视频教程线上学...
  19. 微软官方的 Power Apps 介绍和视频 来自于youtub 网站
  20. ESP8266的Web配网以及强制门户的实现(连接wifi自动打开网页)

热门文章

  1. 初学算法——第一天:发现算法之美
  2. 四六级英语听力软件测试,12月四六级考试听力题答题技巧总结
  3. Thinkpad win11截图快捷键win + sihft +s无反应
  4. Oracle EBS 企业税改方案(二)-未结销售订单
  5. 【Go 专家编程】go.mod 文件中的indirect准确含义
  6. 梦幻西游新资源的提取二
  7. 【sklearn报错解决方案】UndefinedMetricWarning: Precision is ill-defined and being set to 0.0
  8. intel各cpu型号标识
  9. 计算机策略中封运行程序,使用组策略封禁IP地址的方法
  10. 小米android安全补丁,小米 A1 Android 8.1 测试版固件:最新 5 月安全补丁