51单片机用数码管做的简易计算器

这篇博客介绍了一个使用51单片机和数码管7SEG-MPX4-CA构建的简易计算器实验。通过P2口控制数码管位选,P3口控制段选,P0口控制矩阵键盘。实验中,作者创建了显示函数、矩阵键盘判断函数,并实现了数字0-9及加减乘除运算。当按键按下时,数码管显示相应的数值或运算结果,除法运算时还进行了除数为零的错误处理。
摘要由CSDN通过智能技术生成
  1. 本次计算器仿真实验中,使用了共阳极的数码管7SEG-MPX4-CA为计算器的显示组件,十六个button按钮为计算器的选择按钮。如果你想显示更多位可以自己选别的,接线方式一样,如若是6位以上的推荐用译码器啥的节省io口(ps用的89c51芯片仿真)
  2. 本次实验使用P2口控制数码管位选,P3口控制数码管段选,P0口控制矩阵键盘,P0口低四位控制行选择,高四位控制列选择:
    int digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};    //共阳极数码管0-9
    int box[4]={0};   //用来动态改变digit数组的值
    int KeyValue;    //用来保存按键的值  
    int KeySwitch;	  //用来判断KeyValue是否是0到9的数

  3. 创建显示函数,即四位数码管数字在极短延时下交错显示,具体代码如下(延时函数自己写一下就好):

    void display()   
    	{ 
    	  P2=0x01;P3=digit[box[3]]; delay(10);//初值都为零,上面定义了
    	  P2=0x02;P3=digit[box[2]];delay(10);
    	  P2=0x04;P3=digit[box[1]];delay(10);
    	  P2=0x08;P3=digit[box[0]];delay(10);
    	  
    	}

  4. 创建矩阵键盘的行列判断函数,先判断列,再判断行,具体代码如下:
    //这样给keyvalue赋值,能巧妙的使keyvalue的0~9值对应键盘按键的0~9,方便后面给数码管赋值,行列选择原理是按下按钮后,低电平会拉低高电平,改变端口值      
    		P1=0xf0;
    	   if(P1!=0xf0)
           {   delay(20);
               if(P1!=0xf0)
               {  P1=0xf0;
    			 switch(P1)
                {   case(0Xe0): KeyValue=0;break;
                    case(0Xd0): KeyValue=1;break;
                    case(0Xb0): KeyValue=2;break;
                    case(0X70): KeyValue=3;break;}
    			P1=0x0f;
    			switch(P1)   
                {   case(0X0e): KeyValue=KeyValue;break;
                    case(0X0d): KeyValue=KeyValue+4;break;
                    case(0X0b): KeyValue=KeyValue+8;break;
                    case(0X07): KeyValue=KeyValue+12;break;}

  5. 定义数字0~9的按键状态若被按下则keyswitch值为1,目的是为了和后面的运算符号区别开来做判断,具体代码如下:
    if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9)
       			{
           			KeySwitch=1;
       			}

  6. 松开按键判断,因为不做这个判断的话,按下一个数字后,KeySwitch的值一直为1,则会直接使四个数码都显示为同一个数字,具体代码如下:
    Int a;  a=0;	//P1是判断上面的键盘选择的值的	 
    while((a<100)&&(P1!=0x
  • 9
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
这个问题涉及到硬件和软件两个方面的内容,下面给出一个简单的示例: 硬件部分: 1. 使用89c51单片机作为主控芯片。 2. 连接数码管,使用数码管的共阴极接法。 3. 连接按键,用于输入数字和运算符。 软件部分: 1. 初始化数码管和按键。 2. 循环读取按键输入,通过编程实现的逻辑运算。 3. 将算结果转换为数码管显示的格式,并输出到数码管上。 示例代码如下: ``` #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit D1 = P1^0; sbit D2 = P1^1; sbit D3 = P1^2; sbit D4 = P1^3; sbit K1 = P3^0; sbit K2 = P3^1; sbit K3 = P3^2; sbit K4 = P3^3; sbit K5 = P3^4; sbit K6 = P3^5; sbit K7 = P3^6; sbit K8 = P3^7; uchar code seg[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 数码管显示0~9的编码 void delay(uint ms) { uint i, j; for(i = ms; i > 0; i--) for(j = 114; j > 0; j--); } uchar getkey() { uchar key = 0xFF; K1 = 0; if(K2 == 0) key = 1; if(K3 == 0) key = 2; if(K4 == 0) key = 3; K1 = 1; K2 = 0; if(K1 == 0) key = 4; if(K3 == 0) key = 5; if(K4 == 0) key = 6; K2 = 1; K3 = 0; if(K1 == 0) key = 7; if(K2 == 0) key = 8; if(K4 == 0) key = 9; K3 = 1; K4 = 0; if(K1 == 0) key = 0; if(K2 == 0) key = '+'; if(K3 == 0) key = '-'; K4 = 1; K5 = 0; if(K1 == 0) key = '*'; if(K2 == 0) key = '/'; if(K3 == 0) key = '='; K5 = 1; return key; } void display(uchar num) { D1 = seg[num%10]; D2 = seg[num/10%10]; D3 = seg[num/100%10]; D4 = seg[num/1000%10]; } void main() { uchar key; uint a = 0, b = 0, result = 0; uchar operator = 0; while(1) { key = getkey(); if(key != 0xFF) { if(key >= 0 && key <= 9) { if(operator == 0) { a *= 10; a += key; display(a); } else { b *= 10; b += key; display(b); } } else if(key == '+' || key == '-' || key == '*' || key == '/') { operator = key; } else if(key == '=') { switch(operator) { case '+': result = a + b; break; case '-': result = a - b; break; case '*': result = a * b; break; case '/': result = a / b; break; } display(result); a = result; b = 0; operator = 0; } } delay(10); } } ``` 注意:该示例代码仅供参考,实际实现需要根据具体的电路和需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值