找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1260|回复: 7
打印 上一主题 下一主题
收起左侧

大佬们,有关单片机计算器的问题,按键之后好像会陷入死循环

[复制链接]
跳转到指定楼层
楼主
ID:844638 发表于 2020-12-26 14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
只学了矩阵键盘,没有学LCD所以请大佬们帮忙看看怎么解决这个东西另外由于仿真图的矩阵键盘好像用不了 就不放了,板子是ct107d的,熬夜好几个晚上了,救救孩子吧

单片机源程序如下:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sfr P4 = 0xC0;
//行线
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
//列线
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;

uint Num,temp;
uchar fuhao,keyvalue,bai,shi,ge,flag,sign,a,b;
uchar i = 0;
uchar x1, x2, x3, x4, x5, x6, x7, x8;

uchar code tab[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff,
0x89,0x8e,0xc7,0xc0 };//段码表

//延时函数
void delay(uint z)
{
        uint x, y;
        for (x = z; x > 0; x--)
                for (y = 112; y > 0; y--);
}

//扫描键盘函数
uchar Key_Scan()
{
        R1 = 0;                 //第一行线清零0,其余行列置1
        R2 = R3 = R4 = 1;
        C1 = C2 = C3 = C4 = 1;
        
        if(C1 == 0)
        {
                while(!C1);
                Num = 0;
        }
        else if(C2 == 0)
        {
                while(!C2);
                Num = 1;
        }
        else if(C3 == 0)
        {
                while(!C3);
                Num = 2;
        }
        else if(C4 == 0)
        {
                while(!C4);
                fuhao = '+';
        }

        R2 = 0;                 //第二行线清零0,其余行列置1
        R1 = R3 = R4 = 1;
        C1 = C2 = C3 = C4 = 1;
        
        if(C1 == 0)
        {
                while(!C1);
                Num = 3;
        }
        else if(C2 == 0)
        {
                while(!C2);
                Num = 4;
        }
        else if(C3 == 0)
        {
                while(!C3);
                Num = 5;
        }
        else if(C4 == 0)
        {
                while(!C4);
                fuhao = '-';
        }

        R3 = 0;                 //第三行线清零0,其余行列置1
        R1 = R2 = R4 = 1;
        C1 = C2 = C3 = C4 = 1;
        
        if(C1 == 0)
        {
                while(!C1);
                Num = 6;
        }
        else if(C2 == 0)
        {
                while(!C2);
                Num = 7;
        }
        else if(C3 == 0)
        {
                while(!C3);
                Num = 8;
        }
        else if(C4 == 0)
        {
                while(!C4);
                fuhao = '*';
        }
        
        R4 = 0;                 //第四行线清零0,其余行列置1
        R1 = R2 = R3 = 1;
        C1 = C2 = C3 = C4 = 1;
        
        if(C1 == 0)
        {
                while(!C1);
                Num = 9;
        }
        else if(C2 == 0)
        {
                while(!C2);
                fuhao = 'r';
        }
        else if(C3 == 0)
        {
                while(!C3);
                fuhao = '=';
        }
        else if(C4 == 0)
        {
                while(!C4);
                fuhao = '/';
        }
        return Num;
}

//计算键值函数
void  calculate()
{
        if (keyvalue == '+' || keyvalue == '-' || keyvalue == '*' || keyvalue == '/' || keyvalue == 'r' || keyvalue == '=')
        {
                if (flag == 0)//如果输入的是第一个数据
                {
                        a = temp;//将temp的值赋给变量a
                        flag = 1;
                }
                else
                {
                        b = temp;//将temp的值赋给变量b
                }
                temp = 0;


                if (keyvalue != '=')
                {
                        sign = keyvalue;
                }
                else
                {
                        flag = 0;
                        switch (sign)
                        {
                        case '+':a = a + b;
                                break;
                        case '-':a = a - b;
                                break;
                        case '*':a = a * b;
                                break;
                        case '/':a = a / b;
                                break;
                        case 'r':a = 0;
                        default:break;
                        }
                        temp = a;//将a的值赋给变量temp
                }
                sign = 0;//将所有数据清零
                a = b = 0;
                temp = 0;
        }
        
        
        else if (
                keyvalue == 0 || keyvalue == 1 || keyvalue == 2 ||
                keyvalue == 3 || keyvalue == 4 || keyvalue == 5 ||
                keyvalue == 6 || keyvalue == 7 || keyvalue == 8 ||
                keyvalue == 9)
        {
                if (flag == 0)
                {
                        temp = keyvalue;
                        flag = 1;
                }
                else
                {
                        temp = temp * 10 + keyvalue;
                }
        }
}

//显示函数
void display(uchar aa, uchar bb, uchar cc, uchar dd, uchar ee, uchar ff, uchar gg, uchar hh)
{
        P2 = 0x0; P0 = 0x0;
        P2 = ((P2 & 0x1f) | 0xc0);         P0 = 0x01;
        P2 = 0x0; P0 = 0xff;
        P2 = ((P2 & 0x1f) | 0xe0);        P0 = tab[aa];
        delay(5);

        P2 = 0x0; P0 = 0x0;
        P2 = ((P2 & 0x1f) | 0xc0);         P0 = 0x02;
        P2 = 0x0; P0 = 0xff;
        P2 = ((P2 & 0x1f) | 0xe0);        P0 = tab[bb];
        delay(5);

        P2 = 0x0; P0 = 0x0;
        P2 = ((P2 & 0x1f) | 0xc0);         P0 = 0x04;
        P2 = 0x0; P0 = 0xff;
        P2 = ((P2 & 0x1f) | 0xe0);        P0 = tab[cc];
        delay(5);

        P2 = 0x0; P0 = 0x0;
        P2 = ((P2 & 0x1f) | 0xc0);         P0 = 0x08;
        P2 = 0x0; P0 = 0xff;
        P2 = ((P2 & 0x1f) | 0xe0);        P0 = tab[dd];
        delay(5);

        P2 = 0x0; P0 = 0x0;
        P2 = ((P2 & 0x1f) | 0xc0);         P0 = 0x10;
        P2 = 0x0; P0 = 0xff;
        P2 = ((P2 & 0x1f) | 0xe0);        P0 = tab[ee];
        delay(5);

        P2 = 0x0; P0 = 0x0;
        P2 = ((P2 & 0x1f) | 0xc0);         P0 = 0x20;
        P2 = 0x0; P0 = 0xff;
        P2 = ((P2 & 0x1f) | 0xe0);        P0 = tab[ff];
        delay(5);

        P2 = 0x0; P0 = 0x0;
        P2 = ((P2 & 0x1f) | 0xc0);         P0 = 0x40;
        P2 = 0x0; P0 = 0xff;
        P2 = ((P2 & 0x1f) | 0xe0);        P0 = tab[gg];
        delay(5);

        P2 = 0x0; P0 = 0x0;
        P2 = ((P2 & 0x1f) | 0xc0);         P0 = 0x80;
        P2 = 0x0; P0 = 0xff;
        P2 = ((P2 & 0x1f) | 0xe0);        P0 = tab[hh];
        delay(5);
}

//计算每一位的值
void computer(uchar x)
{
        x8 = x / 10000000;
        x7 = (x - x8 * 10000000) / 1000000;
        x6 = (x - x7 * 1000000) / 100000;
        x5 = (x - x6 * 100000) / 10000;
        x4 = (x - x5 * 10000) / 1000;
        x3 = (x - x4 * 1000) / 100;
        x2 = (x - x3 * 100) / 10;
        x1 = x - x2 * 10;
        display(x8, x7, x6 , x5 , x4 , x3 , x2 , x1);
}



void main()
{
        P2 = ((P2&0x1f)|0xa0);
        P0 = 0X00;  
        P2 = ((P2&0x1f)|0x80);
        P0 = 0xff;
        while(1)
        {

                        keyvalue = Key_Scan();
                        calculate();
                        computer(temp);
                        delay(10);               
        }
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:844638 发表于 2020-12-26 14:49 | 只看该作者
问题好像主要在计算函数那,网上大家用的方法看不懂
回复

使用道具 举报

板凳
ID:867408 发表于 2020-12-26 15:43 | 只看该作者
好像确实是计算函数那里,还是上网找找一些常用的写法吧
回复

使用道具 举报

地板
ID:867408 发表于 2020-12-26 15:44 | 只看该作者
君颜兮梦 发表于 2020-12-26 14:49
问题好像主要在计算函数那,网上大家用的方法看不懂

感觉就是计算函数那里,还是找找网上常用的写法吧
回复

使用道具 举报

5#
ID:844638 发表于 2020-12-26 21:13 | 只看该作者
麦麦123 发表于 2020-12-26 15:44
感觉就是计算函数那里,还是找找网上常用的写法吧

现在改了一下,吧Num改成 Scan里的局部变量 然后写了个判断语句,如果没有按键按下就返回一个-1;剩下还在调试
回复

使用道具 举报

6#
ID:868655 发表于 2020-12-27 10:58 来自手机 | 只看该作者
Num改成 Scan里的局部变量 然后写了个判断语句,如果没有按键按下就返回一个-1;剩下还在调试
回复

使用道具 举报

7#
ID:332444 发表于 2020-12-27 11:06 | 只看该作者
回复

使用道具 举报

8#
ID:844638 发表于 2020-12-27 17:30 | 只看该作者
xianfajushi 发表于 2020-12-27 11:06
可参https://blog.csdn.net/xianfajushi/article/details/80884859?ops_request_misc=%25257B%252522reques ...

谢谢,已参考csdn中蓝桥杯的算法,加了一个二维数据解决了,调试可用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表