找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1846|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

大佬們,有關(guān)單片機計算器的問題,按鍵之后好像會陷入死循環(huán)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:844638 發(fā)表于 2020-12-26 14:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
只學(xué)了矩陣鍵盤,沒有學(xué)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 };//段碼表

//延時函數(shù)
void delay(uint z)
{
        uint x, y;
        for (x = z; x > 0; x--)
                for (y = 112; y > 0; y--);
}

//掃描鍵盤函數(shù)
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;
}

//計算鍵值函數(shù)
void  calculate()
{
        if (keyvalue == '+' || keyvalue == '-' || keyvalue == '*' || keyvalue == '/' || keyvalue == 'r' || keyvalue == '=')
        {
                if (flag == 0)//如果輸入的是第一個數(shù)據(jù)
                {
                        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;//將所有數(shù)據(jù)清零
                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;
                }
        }
}

//顯示函數(shù)
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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:844638 發(fā)表于 2020-12-26 14:49 | 只看該作者
問題好像主要在計算函數(shù)那,網(wǎng)上大家用的方法看不懂
回復(fù)

使用道具 舉報

板凳
ID:867408 發(fā)表于 2020-12-26 15:43 | 只看該作者
好像確實是計算函數(shù)那里,還是上網(wǎng)找找一些常用的寫法吧
回復(fù)

使用道具 舉報

地板
ID:867408 發(fā)表于 2020-12-26 15:44 | 只看該作者
君顏兮夢 發(fā)表于 2020-12-26 14:49
問題好像主要在計算函數(shù)那,網(wǎng)上大家用的方法看不懂

感覺就是計算函數(shù)那里,還是找找網(wǎng)上常用的寫法吧
回復(fù)

使用道具 舉報

5#
ID:844638 發(fā)表于 2020-12-26 21:13 | 只看該作者
麥麥123 發(fā)表于 2020-12-26 15:44
感覺就是計算函數(shù)那里,還是找找網(wǎng)上常用的寫法吧

現(xiàn)在改了一下,吧Num改成 Scan里的局部變量 然后寫了個判斷語句,如果沒有按鍵按下就返回一個-1;剩下還在調(diào)試
回復(fù)

使用道具 舉報

6#
ID:868655 發(fā)表于 2020-12-27 10:58 來自手機 | 只看該作者
Num改成 Scan里的局部變量 然后寫了個判斷語句,如果沒有按鍵按下就返回一個-1;剩下還在調(diào)試
回復(fù)

使用道具 舉報

7#
ID:332444 發(fā)表于 2020-12-27 11:06 | 只看該作者
回復(fù)

使用道具 舉報

8#
ID:844638 發(fā)表于 2020-12-27 17:30 | 只看該作者
xianfajushi 發(fā)表于 2020-12-27 11:06
可參https://blog.csdn.net/xianfajushi/article/details/80884859?ops_request_misc=%25257B%252522reques ...

謝謝,已參考csdn中藍(lán)橋杯的算法,加了一個二維數(shù)據(jù)解決了,調(diào)試可用
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表