×
单片机 > 单片机程序设计 > 详情

AVR单片机简单计算器的Proteus仿真实现+源码

发布时间:2020-08-26 发布时间:
|

单片机源程序如下:

#include "mega16.h"

#include "1602.h"

#include "key.h"



float k1,k2;              //记录最终输入运算的两个数


uint one,two,three,four;   //记录每次输入的数字


uint flag;                //计数标志位


uint flag1,flag2;   //第一个数   第二个数 完成标志位


uint flag3;//记录加减乘除标志位


long Result;     //最后运算的结果



void main()

{

     init();  //液晶初始化

    // write_com(0x80+15);

    // write_date('0');

     Init_Keypad();   //键盘初始化

     flag1 = 1;

     while(1)

    {

        Key_Event();  //扫描键盘

    

        if(key_Flag == 1)

        {

            key_Flag = 0;

            if(key_val <= 10)   //小于10  则为需要的数字

            {

            

              if(flag1)       //flag1为1  表示正在输入第一个数字

              {

                switch(flag)

                {

                    case 0:

                     flag = 1;

                     one = key_val%10;

                     write_com(0x80+6);

                     write_date(tab[key_val]);

                     k1 = (float)one;

                     break;

                    case 1:

                       flag = 2;

                       two = key_val%10;

                       write_com(0x80+7);

                       write_date(tab[key_val]);

                       k1 = (float)(one*10 + two);

                     break;

                 case 2:

                      flag = 3;

                         three = key_val%10;

                       write_com(0x80+8);

                       write_date(tab[key_val]);

                      k1 = (float)(one*100 + two * 10 + three);

                      break;

                 case 3:

                     flag = 4;

                        four = key_val%10;

                     write_com(0x80+9);

                     write_date(tab[key_val]);

                        k1 = (float)(one*1000 + two * 100 + three*10 + four);

                     break;

                   case 4:

                      flag = 0;

                      break;   

                 }

                }

                

                

                

                

                

                if(flag2)        //flag2为1  表示正在输入第2个数字

              {

                switch(flag)

                {

                    case 0:

                     flag = 1;

                     one = key_val%10;

                     write_com(0x80+12);

                     write_date(tab[key_val]);

                     k2 = (float)one;

                     break;

                    case 1:

                       flag = 2;

                       two = key_val%10;

                       write_com(0x80+13);

                       write_date(tab[key_val]);

                       k2 = (float)(one*10 + two);

                     break;

                 case 2:

                      flag = 3;

                         three = key_val%10;

                       write_com(0x80+14);

                       write_date(tab[key_val]);

                      k2 = (float)(one*100 + two * 10 + three);

                      break;

                 case 3:

                     flag = 4;

                        four = key_val%10;

                     write_com(0x80+15);

                     write_date(tab[key_val]);

                        k2 = (float)(one*1000 + two * 100 + three*10 + four);

                     break;

                   case 4:

                      flag = 0;

                      break;   

                 }

                }

                

                

            }

            

            

            

            else if(key_val>=13 || key_val <= 16)  //判断运算符

            {

                flag1 = 0;

                flag2 = 1;

                flag = 0;

                switch(key_val)

                {

                    case 13:

                      write_com(0x80+11);

                      write_date('+');

                      flag3 = 1;

                      break; 

                    case 14:

                      write_com(0x80+11);

                      write_date('-');

                      flag3 = 2;

                      break; 

                    case 15:



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项