找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stm32f103zet6的简易计算器 含源码

  [复制链接]
跳转到指定楼层
楼主
ID:804520 发表于 2020-7-17 01:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我用正点原子开发板战舰3做的一个计算器


主要代码如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"     
  7. #include "24cxx.h"
  8. #include "w25qxx.h"
  9. #include "touch.h"



  10. int aa = 0;

  11. //清空屏幕并在右上角显示"RST"
  12. void Load_Drow_Dialog(void)
  13. {
  14.     LCD_Clear(WHITE);    //清屏   
  15.      POINT_COLOR=BLUE;    //设置字体为蓝色
  16.     LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域
  17.   POINT_COLOR=RED;    //设置画笔蓝色
  18. }
  19. ////////////////////////////////////////////////////////////////////////////////
  20. //电容触摸屏专有部分
  21. //画水平线
  22. //x0,y0:坐标
  23. //len:线长度
  24. //color:颜色
  25. void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
  26. {
  27.     if(len==0)return;
  28.     LCD_Fill(x0,y0,x0+len-1,y0,color);   
  29. }
  30. //画实心圆
  31. //x0,y0:坐标
  32. //r:半径
  33. //color:颜色
  34. void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
  35. {                                             
  36.     u32 i;
  37.     u32 imax = ((u32)r*707)/1000+1;
  38.     u32 sqmax = (u32)r*(u32)r+(u32)r/2;
  39.     u32 x=r;
  40.     gui_draw_hline(x0-r,y0,2*r,color);
  41.     for (i=1;i<=imax;i++)
  42.     {
  43.         if ((i*i+x*x)>sqmax)// draw lines from outside  
  44.         {
  45.              if (x>imax)
  46.             {
  47.                 gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
  48.                 gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
  49.             }
  50.             x--;
  51.         }
  52.         // draw lines from inside (center)  
  53.         gui_draw_hline(x0-x,y0+i,2*x,color);
  54.         gui_draw_hline(x0-x,y0-i,2*x,color);
  55.     }
  56. }  
  57. //两个数之差的绝对值
  58. //x1,x2:需取差值的两个数
  59. //返回值:|x1-x2|
  60. u16 my_abs(u16 x1,u16 x2)
  61. {            
  62.     if(x1>x2)return x1-x2;
  63.     else return x2-x1;
  64. }  
  65. //画一条粗线
  66. //(x1,y1),(x2,y2):线条的起始坐标
  67. //size:线条的粗细程度
  68. //color:线条的颜色
  69. void lcd_draw_bline(u16 x1, u16 y1, u16 x2, u16 y2,u8 size,u16 color)
  70. {
  71.     u16 t;
  72.     int xerr=0,yerr=0,delta_x,delta_y,distance;
  73.     int incx,incy,uRow,uCol;
  74.     if(x1<size|| x2<size||y1<size|| y2<size)return;
  75.     delta_x=x2-x1; //计算坐标增量
  76.     delta_y=y2-y1;
  77.     uRow=x1;
  78.     uCol=y1;
  79.     if(delta_x>0)incx=1; //设置单步方向
  80.     else if(delta_x==0)incx=0;//垂直线
  81.     else {incx=-1;delta_x=-delta_x;}
  82.     if(delta_y>0)incy=1;
  83.     else if(delta_y==0)incy=0;//水平线
  84.     else{incy=-1;delta_y=-delta_y;}
  85.     if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  86.     else distance=delta_y;
  87.     for(t=0;t<=distance+1;t++ )//画线输出
  88.     {  
  89.         gui_fill_circle(uRow,uCol,size,color);//画点
  90.         xerr+=delta_x ;
  91.         yerr+=delta_y ;
  92.         if(xerr>distance)
  93.         {
  94.             xerr-=distance;
  95.             uRow+=incx;
  96.         }
  97.         if(yerr>distance)
  98.         {
  99.             yerr-=distance;
  100.             uCol+=incy;
  101.         }
  102.     }  
  103. }   
  104. ////////////////////////////////////////////////////////////////////////////////
  105. //5个触控点的颜色                                                
  106. const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};  
  107. //电阻触摸屏测试函数
  108. void rtp_test(void)
  109. {
  110.     u8 key;
  111.     u8 i=0;      
  112.     while(1)
  113.     {
  114.          key=KEY_Scan(0);
  115.         tp_dev.scan(0);         
  116.         if(tp_dev.sta&TP_PRES_DOWN)            //触摸屏被按下
  117.         {   
  118.              if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
  119.             {   
  120.                 if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
  121.                 else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);        //画图                     
  122.             }
  123.         }else delay_ms(10);    //没有按键按下的时候         
  124.         if(key==KEY0_PRES)    //KEY0按下,则执行校准程序
  125.         {
  126.             LCD_Clear(WHITE);//清屏
  127.             TP_Adjust();      //屏幕校准  
  128.             Load_Drow_Dialog();
  129.         }
  130.         i++;
  131.         if(i%20==0)LED0=!LED0;
  132.     }
  133. }
  134. //电容触摸屏测试函数
  135. void ctp_test(void)
  136. {
  137.     u8 t=0;
  138.     u8 i=0;              
  139.      u16 lastpos[5][2];        //记录最后一次的数据
  140.     while(1)
  141.     {
  142.         tp_dev.scan(0);
  143.         for(t=0;t<CT_MAX_TOUCH;t++)
  144.         {
  145.             if((tp_dev.sta)&(1<<t))
  146.             {
  147.                 if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height)
  148.                 {
  149.                     if(lastpos[t][0]==0XFFFF)
  150.                     {
  151.                         lastpos[t][0] = tp_dev.x[t];
  152.                         lastpos[t][1] = tp_dev.y[t];
  153.                     }
  154.                     lcd_draw_bline(lastpos[t][0],lastpos[t][1],tp_dev.x[t],tp_dev.y[t],2,POINT_COLOR_TBL[t]);//画线
  155.                     lastpos[t][0]=tp_dev.x[t];
  156.                     lastpos[t][1]=tp_dev.y[t];
  157.                     if(tp_dev.x[t]>(lcddev.width-24)&&tp_dev.y[t]<16)
  158.                     {
  159.                         Load_Drow_Dialog();//清除
  160.                     }
  161.                 }
  162.             }else lastpos[t][0]=0XFFFF;
  163.         }
  164.         
  165.         delay_ms(5);i++;
  166.         if(i%20==0)LED0=!LED0;
  167.     }   
  168. }
  169. void jiemian1(void)
  170. {
  171.             POINT_COLOR=GRAY;
  172.             LCD_DrawRectangle(0,320,240,160);
  173.             LCD_DrawRectangle(0,320,240,200);
  174.             LCD_DrawRectangle(0,320,240,240);
  175.             LCD_DrawRectangle(0,320,240,280);
  176.             LCD_DrawRectangle(0,160,240,120);
  177.             
  178.             LCD_DrawRectangle(60,320,120,160);
  179.             LCD_DrawRectangle(0,280,60, 160);
  180.             LCD_DrawRectangle(0,280,120,160);
  181.             LCD_DrawRectangle(0,320,180,160);
  182.             LCD_DrawRectangle(60,160,180,120);
  183.             LCD_DrawRectangle(60,160,120,120);
  184.    
  185.    
  186.    
  187.             POINT_COLOR=BLACK;
  188.             LCD_ShowString(25,170,200,18,24,"7");   
  189.             LCD_ShowString(85,170,200,18,24,"8");   
  190.             LCD_ShowString(145,170,200,18,24,"9");   
  191.             
  192.             LCD_ShowString(25,210,200,18,24,"4");   
  193.             LCD_ShowString(85,210,200,18,24,"5");   
  194.             LCD_ShowString(145,210,200,18,24,"6");

  195.             LCD_ShowString(25,250,200,18,24,"1");   
  196.             LCD_ShowString(85,250,200,18,24,"2");   
  197.             LCD_ShowString(145,250,200,18,24,"3");   

  198.             LCD_ShowString(85,290,200,18,24,"0");   
  199.             
  200.             LCD_ShowString(205,170,200,18,24,"x");   
  201.         
  202.           LCD_ShowString(130,290,200,18,24,"+/-");
  203.             LCD_ShowString(205,201,200,18,24,"_");
  204.             LCD_ShowString(205,250,200,18,24,"+");
  205.             POINT_COLOR=BRRED;
  206.             LCD_ShowString(205,290,200,18,24,"=");   
  207.             POINT_COLOR=RED;
  208.             LCD_ShowString(25,130,200,18,24,"C");
  209.             POINT_COLOR=BRRED;
  210.             LCD_ShowString(10,294,200,18,16,"[]/[]");
  211.             
  212.             POINT_COLOR=BLACK;
  213.             LCD_ShowString(145,125,200,18,24,".");
  214.             LCD_ShowString(205,130,200,18,24,"/");
  215.             LCD_ShowString(66,135,200,18,16,"Delete");   
  216. }
  217. void jiemian2(void)
  218. {
  219.     POINT_COLOR=GRAY;
  220.     LCD_DrawRectangle(0,320,48,75);
  221.     LCD_DrawRectangle(48,320,96,75);
  222.     LCD_DrawRectangle(96,320,144,75);
  223.     LCD_DrawRectangle(144,320,192,75);
  224.     LCD_DrawRectangle(192,320,240,75);
  225.    
  226.     LCD_DrawRectangle(0,110,240,145);
  227.     LCD_DrawRectangle(0,145,240,180);
  228.     LCD_DrawRectangle(0,180,240,215);
  229.     LCD_DrawRectangle(0,215,240,250);
  230.     LCD_DrawRectangle(0,250,240,285);
  231.     LCD_DrawRectangle(0,285,240,320);
  232.    
  233.     POINT_COLOR=BLACK;
  234.     LCD_ShowString(210,291,200,18,24,"=");   
  235.     LCD_ShowString(210,256,200,18,24,"+");
  236.     LCD_ShowString(210,221,200,18,24,"-");
  237.     LCD_ShowString(210,183,200,18,24,"x");
  238.     LCD_ShowString(210,155,200,18,24,"/");
  239.     POINT_COLOR=GRAY;
  240.     LCD_ShowString(214,117,200,18,24,")");
  241.     LCD_ShowString(203,85,200,18,16,"tan");
  242.    
  243.     POINT_COLOR=BLACK;
  244.     LCD_ShowString(152,291,200,18,24,"+/-");   
  245.     LCD_ShowString(162,256,200,18,24,"3");
  246.     LCD_ShowString(162,221,200,18,24,"6");
  247.     LCD_ShowString(162,185,200,18,24,"9");
  248.     LCD_ShowString(164,146,200,18,24,".");
  249.     POINT_COLOR=GRAY;
  250.     LCD_ShowString(158,117,200,18,24,"(");
  251.     LCD_ShowString(158,85,200,18,16,"cos");
  252.    
  253.     POINT_COLOR=BLACK;
  254.     LCD_ShowString(114,291,200,18,24,"0");   
  255.     LCD_ShowString(114,256,200,18,24,"2");
  256.     LCD_ShowString(114,221,200,18,24,"5");
  257.     LCD_ShowString(114,185,200,18,24,"8");
  258.     LCD_ShowString(112,155,200,18,16,"Del");
  259.     POINT_COLOR=GRAY;
  260.     LCD_ShowString(111,120,200,18,16,"ln");
  261.     LCD_ShowString(110,85,200,18,16,"sin");
  262.    
  263.     POINT_COLOR=BLACK;
  264.     LCD_ShowString(66,291,200,18,24,"e");   
  265.     LCD_ShowString(66,256,200,18,24,"1");
  266.     LCD_ShowString(66,221,200,18,24,"4");
  267.     LCD_ShowString(66,185,200,18,24,"7");
  268.     POINT_COLOR=BRRED;
  269.     LCD_ShowString(66,150,200,18,24,"C");
  270.     POINT_COLOR=GRAY;
  271.     LCD_ShowString(66,120,200,18,16,"lg");
  272.     LCD_ShowString(64,85,200,18,16,"deg");   
  273.    
  274.     POINT_COLOR=BRRED;
  275.     LCD_ShowString(5,295,200,18,16,"[]/[]");
  276.     POINT_COLOR=GRAY;
  277.     LCD_ShowString(18,256,200,18,24,"@");
  278.     LCD_ShowString(13,225,200,18,16,"1/X");
  279.     LCD_ShowString(18,185,200,18,24,"x!");
  280.     LCD_ShowString(18,150,200,18,24,"x");
  281.     LCD_ShowString(30,146,200,18,16,"y");
  282.     LCD_ShowString(18,120,200,18,24,"x");
  283.     LCD_ShowString(27,117,200,18,12,"1/2");
  284.     LCD_ShowString(18,85,200,18,16,"2nd");
  285.     POINT_COLOR=BLACK;
  286. }

  287. int main(void)
  288. {
  289.     int qq=0;
  290.     int i=0;
  291.     int j=0;
  292.     int key=0;
  293.     int num=0;
  294.     int num1=0;
  295.     int num2=0;
  296.     int flag=0;
  297.     int F=0;
  298.     int and=0;
  299.     int time=0;
  300.     int minus=0;
  301.     int division=0;
  302.     int quyu = 0;
  303.     int jiecheng=0;
  304.     int cifang=0;
  305.     int num3=0;
  306.     int e = 0;
  307.     u8 *fuhao;
  308.     delay_init();             //延时函数初始化      
  309.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  310.     uart_init(115200);         //串口初始化为115200
  311.      
  312.      LED_Init();                 //LED端口初始化
  313.     LCD_Init();   
  314.     KEY_Init();         
  315.      tp_dev.init();
  316.      
  317.     while(1)
  318.     {
  319.         if(aa == 1)
  320.         {
  321.             jiemian2();
  322.             if(key==22)
  323.             {
  324.                 LCD_ShowxNum(80,50,num1,12,24,1);   
  325.                 F = 0;
  326.                 qq=0;
  327.             }
  328.             else
  329.             {
  330.                 if(num1==0 && num2==0)
  331.                 {
  332.                     LCD_ShowxNum(80,50,num1,12,24,1);
  333.                 }
  334.                 else
  335.                 {
  336.                     if(qq==1)
  337.                     {
  338.                         LCD_ShowString(40,50,200,18,24,"+");
  339.                     }
  340.                     if(qq==2)
  341.                     {
  342.                         LCD_ShowString(40,50,200,18,24,"*");
  343.                     }
  344.                     if(qq==3)
  345.                     {
  346.                         LCD_ShowString(40,30,200,18,24,"_");
  347.                     }
  348.                     if(qq==4)
  349.                     {
  350.                         LCD_ShowString(40,50,200,18,24,".");
  351.                         LCD_ShowString(38,40,200,18,24,"_");
  352.                         LCD_ShowString(40,38,200,18,24,".");
  353.                     }
  354.                     if(qq==6)
  355.                     {
  356.                         LCD_ShowString(40,50,200,18,24,"^");
  357.                     }
  358.                     if(F==1)
  359.                     {
  360.                         //LCD_ShowString(40,80,200,18,24,"_");
  361.                         if(flag)
  362.                         {
  363.                         LCD_ShowxNum(80,30,num2,12,24,1);   
  364.                         LCD_ShowxNum(80,50,num1,12,24,1);        
  365.                                     if(num2/10<1)
  366.                             {
  367.                                 if(num2==0)LCD_ShowString(195,40,200,18,24,"_");
  368.                                 else
  369.                                 {
  370.                                 LCD_ShowString(195,20,200,18,24,"_");
  371.                                 }
  372.                             }
  373.                             else if(num2/10<10)
  374.                             {
  375.                                 LCD_ShowString(183,20,200,18,24,"_");
  376.                             }
  377.                             else if(num2/10<100)
  378.                             {
  379.                                 LCD_ShowString(172,20,200,18,24,"_");
  380.                             }
  381.                             else if(num2/10<1000)
  382.                             {
  383.                                 LCD_ShowString(161,20,200,18,24,"_");
  384.                             }
  385.                                 else if(num2/10<10000)
  386.                             {
  387.                                 LCD_ShowString(150,20,200,18,24,"_");
  388.                             }
  389.                                 else if(num2/10<100000)
  390.                             {
  391.                                 LCD_ShowString(139,20,200,18,24,"_");
  392.                             }
  393.                             else if(num2/10<1000000)
  394.                             {
  395.                                 LCD_ShowString(128,20,200,18,24,"_");
  396.                             }
  397.                                 else if(num2/10<10000000)
  398.                             {
  399.                                 LCD_ShowString(117,20,200,18,24,"_");
  400.                             }
  401.                             else LCD_ShowString(103,20,200,18,24,"_");
  402.                         }
  403.                         else
  404.                         {
  405.                             LCD_ShowxNum(80,50,num1,12,24,1);   
  406.                             if(num1==0)
  407.                             {
  408.                                 ;
  409.                             }
  410.                             else if(num1/10<1)
  411.                             {
  412.                                 LCD_ShowString(195,40,200,18,24,"_");
  413.                             }
  414.                             else if(num1/10<10)
  415.                             {
  416.                                 LCD_ShowString(183,40,200,18,24,"_");
  417.                             }
  418.                             else if(num1/10<100)
  419.                             {
  420.                                 LCD_ShowString(172,40,200,18,24,"_");
  421.                             }
  422.                             else if(num1/10<1000)
  423.                             {
  424.                                 LCD_ShowString(161,40,200,18,24,"_");
  425.                             }
  426.                                 else if(num1/10<10000)
  427.                             {
  428.                                 LCD_ShowString(150,40,200,18,24,"_");
  429.                             }
  430.                                 else if(num1/10<100000)
  431.                             {
  432.                                 LCD_ShowString(139,40,200,18,24,"_");
  433.                             }
  434.                             else if(num1/10<1000000)
  435.                             {
  436.                                 LCD_ShowString(128,40,200,18,24,"_");
  437.                             }
  438.                                 else if(num1/10<10000000)
  439.                             {
  440.                                 LCD_ShowString(117,40,200,18,24,"_");
  441.                             }
  442.                             else LCD_ShowString(103,40,200,18,24,"_");
  443.                            
  444.                         }
  445.                     }
  446.                     else
  447.                     {
  448.                         if(flag)
  449.                         {
  450.                         LCD_ShowxNum(80,30,num2,12,24,1);   
  451.                         LCD_ShowxNum(80,50,num1,12,24,1);        
  452.                         }
  453.                         else
  454.                         LCD_ShowxNum(80,50,num1,12,24,1);   
  455.                     }
  456.                 }
  457.             }
  458.             tp_dev.scan(0);         
  459.             if(tp_dev.sta&TP_PRES_DOWN)            //触摸屏被按下
  460.             {   
  461.                 if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
  462.                 {   
  463.                     for(i=0;i<7;i++)
  464.                     {
  465.                         for(j=0;j<5;j++)
  466.                         {
  467.                                 if(tp_dev.x[0]>(j*48) && tp_dev.x[0]<(j*48+48) && tp_dev.y[0]>(320-(35*i+35)) && tp_dev.y[0]<(320-35*i))
  468.                                 {
  469.                                     key=j+i*5+1;
  470.                                     if(key == 1)
  471.                                         {aa=0;LCD_Clear(WHITE);delay_ms(100);}
  472.                                         delay_ms(100);
  473.                                         LCD_Fill(0,20,240,74,WHITE);   
  474.                                         GPIO_SetBits(GPIOB,GPIO_Pin_8);
  475.                                         delay_ms(100);
  476.                                         GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  477.                                        
  478.                                 }   
  479.                         }
  480.                     }
  481.                 }
  482.             }else delay_ms(50);

  483.             if(key == 2)  num=e;
  484.             else if(key == 3)  num =0;
  485.             else if(key == 4)  fuhao ="+/-";
  486.             else if(key == 5)  fuhao ="=";
  487.             else if(key == 6)  ;
  488.             else if(key == 7)  num=1;
  489.             else if(key == 8)  num=2;
  490.             else if(key == 9)  num=3;
  491.             else if(key == 10) fuhao="+";
  492.             else if(key == 11) fuhao="1/X";
  493.             else if(key == 12) num=4;
  494.             else if(key == 13) num=5;
  495.             else if(key == 14) num=6;
  496.             else if(key == 15) fuhao="-";
  497.             else if(key == 16) fuhao="X!";
  498.             else if(key == 17) num=7;
  499.             else if(key == 18) num=8;
  500.             else if(key == 19) num=9;
  501.             else if(key == 20) fuhao="*";   
  502.             else if(key == 21) fuhao="X^y";   
  503.             else if(key == 22) fuhao="C";   
  504.             else if(key == 23) fuhao="Del";   
  505.             else if(key == 24) fuhao=".";   
  506.             else if(key == 25) fuhao="/";   
  507.                     switch (key)
  508.             {
  509.                 case 22:num1=0;num2=0;F=0;break;
  510.                 case 23:num1=num1/10;break;
  511.                 case 10: num2=num1;num1=0;flag=1;and=1;qq=1;break;
  512.                 case 20:num2=num1;num1=0;flag=1;time=1;qq=2;break;
  513.                 case 15:num2=num1;num1=0;flag=1;minus=1;qq=3;break;
  514.                 case 25:num2=num1;num1=0;flag=1;division=1;qq=4;break;
  515.                 case 4:quyu=1;break;
  516.                 case 16:num2=1;num1=num1;jiecheng=1;qq=5;break;
  517.                 case 21:num2=num1;num3=1;num1=0;flag=1;cifang=1;qq=6;break;
  518.                 case 5:
  519.                             if(flag)
  520.                             {
  521.                                 qq=0;
  522.                                 if(and)
  523.                                 {
  524.                                     if(F==1)
  525.                                     {
  526.                                         if(num1>num2)
  527.                                         {
  528.                                             num1-=num2;
  529.                                             F=0;
  530.                                         }
  531.                                         else if(num1 == num2)
  532.                                         {
  533.                                             num1=0;
  534.                                             F=0;
  535.                                         }
  536.                                         else
  537.                                         {   
  538.                                                 num1=num2-num1;
  539.                                                 F=1;
  540.                                         }
  541.                                     }
  542.                                     else     
  543.                                         {
  544.                                         F=0;
  545.                                         num1+=num2;
  546.                                         }
  547.                                     flag=0;
  548.                                     and = 0;
  549.                                        
  550.                                 }
  551.                                 else if(time)
  552.                                 {
  553.                                     num1=num1*num2;flag=0;
  554.                                     time = 0;
  555.                                     
  556.                                 }
  557.                                 else if(division)
  558.                                 {
  559.                                     if(num1>num2)
  560.                                     {
  561.                                     num1=0;
  562.                                     }
  563.                                     else if(num1==num2)
  564.                                     {
  565.                                         num1=1;
  566.                                     }
  567.                                     else
  568.                                     {
  569.                                         num1=num2/num1;
  570.                                     }
  571.                                         flag=0;
  572.                                     division = 0;
  573.                                 }
  574.                                 else if(minus)
  575.                                 {
  576.                                     if(F==1)
  577.                                     {
  578.                                         num1=num1+num2;
  579.                                     }
  580.                                     
  581.                                     else
  582.                                     {
  583.                                         if(num2>num1)
  584.                                         {
  585.                                             num1=num2-num1;
  586.                                             F = 0;
  587.                                         }
  588.                                         else if(num2==num1)
  589.                                         {
  590.                                             num1=0;
  591.                                             F = 0;
  592.                                         }
  593.                                         else
  594.                                         {
  595.                                             if(num2<num1)
  596.                                             {
  597.                                                 num1=num1-num2;
  598.                                                 F = 1;   
  599.                                             }
  600.                                         }
  601.                                  }
  602.                                     flag=0;
  603.                                     minus = 0;
  604.                                 
  605.                                 }
  606.                                 else if(cifang)
  607.                                 {
  608.                                     if(F==1)
  609.                                     {
  610.                                                 if(num1==0)
  611.                                             {
  612.                                                 num3=1;
  613.                                                 F=0;
  614.                                             }
  615.                                             else if(num1%2==0)
  616.                                             {
  617.                                                 for(i=num1;i>0;i--)
  618.                                                 {
  619.                                                     num3=num3*num2;
  620.                                                 }
  621.                                                 F=0;
  622.                                             }
  623.                                             else
  624.                                             {
  625.                                                 for(i=num1;i>0;i--)
  626.                                                 {
  627.                                                     num3=num3*num2;
  628.                                                 }
  629.                                             }
  630.                                                 num1=num3;
  631.                                                 num3=0;
  632.                                                 num2=0;
  633.                                                 cifang=0;
  634.                                                 flag=0;
  635.                                     }
  636.                                     else
  637.                                 {
  638.                         
  639.                                     if(num1==0)
  640.                                     {
  641.                                         num3=1;
  642.                                     }
  643.                                     else
  644.                                     {
  645.                                         for(i=num1;i>0;i--)
  646.                                         {
  647.                                             num3=num3*num2;
  648.                                         }
  649.                                     }
  650.                                         num1=num3;
  651.                                         num3=0;
  652.                                         num2=0;
  653.                                         cifang=0;
  654.                                         flag=0;
  655.                                 }
  656.                                     
  657.                                 }
  658.                     
  659.                                 
  660.                             }
  661.                         break;
  662.             }
  663.                         if(jiecheng)
  664.                     {
  665.                         if(num1<24)
  666.                         {
  667.                             for(i=num1;i>0;i--)
  668.                             {
  669.                                 num2=num2*num1;
  670.                                 num1--;
  671.                             }
  672.                             num1=num2;
  673.                             num2=0;
  674.                       }
  675.                         jiecheng=0;
  676.                     }
  677.                          if(quyu)
  678.                 {
  679.                         F=!F;
  680.                         quyu=0;
  681.                 }
  682.                 if(num1>999999999)
  683.                     num1=0;
  684.             key = 0;
  685.             if(num1<100000000)
  686.             {
  687.                 if(num == 0)
  688.                 {
  689.                     num1 = num1*10;
  690.                     num = -1;
  691.                 }   
  692.                 if(num>0 && num<10)
  693.                 {
  694.                     num1 = num1*10+num;
  695.                     num = -1;
  696.                 }
  697.             }
  698.         }
  699.     else
  700.         {
  701.             jiemian1();
  702.             if(key==17)
  703.             {
  704.                 LCD_ShowxNum(80,90,num1,12,24,1);   
  705.                 F = 0;
  706.                 qq=0;
  707.             }
  708.             else
  709.             {
  710.                 if(num1==0 && num2==0)
  711.                 {
  712.                     LCD_ShowxNum(80,90,num1,12,24,1);
  713.                 }
  714.                 else
  715.                 {
  716.                     if(qq==1)
  717.                     {
  718.                         LCD_ShowString(40,90,200,18,24,"+");
  719.                     }
  720.                     if(qq==2)
  721.                     {
  722.                         LCD_ShowString(40,90,200,18,24,"*");
  723.                     }
  724.                     if(qq==3)
  725.                     {
  726.                         LCD_ShowString(40,80,200,18,24,"_");
  727.                     }
  728.                     if(qq==4)
  729.                     {
  730.                         LCD_ShowString(40,90,200,18,24,".");
  731.                         LCD_ShowString(38,80,200,18,24,"_");
  732.                         LCD_ShowString(40,78,200,18,24,".");
  733.                     }
  734.                     if(F==1)
  735.                     {
  736.                         //LCD_ShowString(40,80,200,18,24,"_");
  737.                         if(flag)
  738.                         {
  739.                         LCD_ShowxNum(80,70,num2,12,24,1);   
  740.                         LCD_ShowxNum(80,90,num1,12,24,1);        
  741.                                     if(num2/10<1)
  742.                             {
  743.                                 if(num2==0)LCD_ShowString(195,80,200,18,24,"_");
  744.                                 else
  745.                                 {
  746.                                 LCD_ShowString(195,60,200,18,24,"_");
  747.                                 }
  748.                             }
  749.                             else if(num2/10<10)
  750.                             {
  751.                                 LCD_ShowString(183,60,200,18,24,"_");
  752.                             }
  753.                             else if(num2/10<100)
  754.                             {
  755.                                 LCD_ShowString(172,60,200,18,24,"_");
  756.                             }
  757.                             else if(num2/10<1000)
  758.                             {
  759.                                 LCD_ShowString(161,60,200,18,24,"_");
  760.                             }
  761.                                 else if(num2/10<10000)
  762.                             {
  763.                                 LCD_ShowString(150,60,200,18,24,"_");
  764.                             }
  765.                                 else if(num2/10<100000)
  766.                             {
  767.                                 LCD_ShowString(139,60,200,18,24,"_");
  768.                             }
  769.                             else if(num2/10<1000000)
  770.                             {
  771.                                 LCD_ShowString(128,60,200,18,24,"_");
  772.                             }
  773.                                 else if(num2/10<10000000)
  774.                             {
  775.                                 LCD_ShowString(117,60,200,18,24,"_");
  776.                             }
  777.                             else LCD_ShowString(103,60,200,18,24,"_");
  778.                         }
  779.                         else
  780.                         {
  781.                             LCD_ShowxNum(80,90,num1,12,24,1);   
  782.                             if(num1==0)
  783.                             {
  784.                                 ;
  785.                             }
  786.                             else if(num1/10<1)
  787.                             {
  788.                                 LCD_ShowString(195,80,200,18,24,"_");
  789.                             }
  790.                             else if(num1/10<10)
  791.                             {
  792.                                 LCD_ShowString(183,80,200,18,24,"_");
  793.                             }
  794.                             else if(num1/10<100)
  795.                             {
  796.                                 LCD_ShowString(172,80,200,18,24,"_");
  797.                             }
  798.                             else if(num1/10<1000)
  799.                             {
  800.                                 LCD_ShowString(161,80,200,18,24,"_");
  801.                             }
  802.                                 else if(num1/10<10000)
  803.                             {
  804.                                 LCD_ShowString(150,80,200,18,24,"_");
  805.                             }
  806.                                 else if(num1/10<100000)
  807.                             {
  808.                                 LCD_ShowString(139,80,200,18,24,"_");
  809.                             }
  810.                             else if(num1/10<1000000)
  811.                             {
  812.                                 LCD_ShowString(128,80,200,18,24,"_");
  813.                             }
  814.                                 else if(num1/10<10000000)
  815.                             {
  816.                                 LCD_ShowString(117,80,200,18,24,"_");
  817.                             }
  818.                             else LCD_ShowString(103,80,200,18,24,"_");
  819.                            
  820.                         }
  821.                     }
  822.                     else
  823.                     {
  824.                         if(flag)
  825.                         {
  826.                         LCD_ShowxNum(80,70,num2,12,24,1);   
  827.                         LCD_ShowxNum(80,90,num1,12,24,1);        
  828.                         }
  829.                         else
  830.                         LCD_ShowxNum(80,90,num1,12,24,1);   
  831.                     }
  832.                 }
  833.             }
  834.             tp_dev.scan(0);         
  835.             if(tp_dev.sta&TP_PRES_DOWN)            //触摸屏被按下
  836.             {   
  837.                 if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
  838.                 {   
  839.                     for(i=0;i<5;i++)
  840.                     {
  841.                         for(j=0;j<4;j++)
  842.                         {
  843.                                 if(tp_dev.x[0]>(j*60) && tp_dev.x[0]<(j*60+60) && tp_dev.y[0]>(320-(40*i+40)) && tp_dev.y[0]<(320-40*i))
  844.                                 {
  845.                                     key=j+i*4+1;
  846.                                     if(key == 1)
  847.                                         {aa=1;LCD_Clear(WHITE);delay_ms(100);}
  848.                                         delay_ms(100);
  849.                                         LCD_Fill(0,60,240,119,WHITE);   
  850.                                         GPIO_SetBits(GPIOB,GPIO_Pin_8);
  851.                                         delay_ms(100);
  852.                                         GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  853.                                 }   
  854.                         }
  855.                     }
  856.                 }
  857.             }else delay_ms(50);

  858.             if(key == 2)  num=0;
  859.             else if(key == 3)  fuhao ="+/-";
  860.             else if(key == 4)  fuhao ="=";
  861.             else if(key == 5)  num=1;
  862.             else if(key == 6)  num=2;
  863.             else if(key == 7)  num=3;
  864.             else if(key == 8)  fuhao="+";
  865.             else if(key == 9)  num=4;
  866.             else if(key == 10) num=5;
  867.             else if(key == 11) num=6;
  868.             else if(key == 12) fuhao="-";
  869.             else if(key == 13) num=7;
  870.             else if(key == 14) num=8;
  871.             else if(key == 15) num=9;
  872.             else if(key == 16) fuhao="*";
  873.             else if(key == 17) fuhao="C";
  874.             else if(key == 18) fuhao="Delete";
  875.             else if(key == 19) fuhao=".";
  876.             else if(key == 20) fuhao="/";   
  877.                     switch (key)
  878.             {
  879.                 case 17:num1=0;num2=0;F=0;qq=0;break;
  880.                 case 18:num1=num1/10;break;
  881.                 case 8: num2=num1;num1=0;flag=1;and=1;qq=1;break;
  882.                 case 16:num2=num1;num1=0;flag=1;time=1;qq=2;break;
  883.                 case 12:num2=num1;num1=0;flag=1;minus=1;qq=3;break;
  884.                 case 20:num2=num1;num1=0;flag=1;division=1;qq=4;break;
  885.                 case 3:quyu=1;break;
  886.                 case 4:
  887.                             if(flag)
  888.                             {
  889.                                 qq=0;
  890.                                 if(and)
  891.                                 {
  892.                                     if(F==1)
  893.                                     {
  894.                                         if(num1>num2)
  895.                                         {
  896.                                             num1-=num2;
  897.                                             F=0;
  898.                                         }
  899.                                         else if(num1 == num2)
  900.                                         {
  901.                                             num1=0;
  902.                                             F=0;
  903.                                         }
  904.                                         else
  905.                                         {   
  906.                                                 num1=num2-num1;
  907.                                                 F=1;
  908.                                         }
  909.                                     }
  910.                                     else     
  911.                                         {
  912.                                         F=0;
  913.                                         num1+=num2;
  914.                                         }
  915.                                     flag=0;
  916.                                     and = 0;
  917.                                        
  918.                                 }
  919.                                 else if(time)
  920.                                 {
  921.                                     num1=num1*num2;flag=0;
  922.                                     time = 0;
  923.                                     
  924.                                 }
  925.                                 else if(division)
  926.                                 {
  927.                                     if(num1>num2)
  928.                                     {
  929.                                     num1=0;
  930.                                     }
  931.                                     else if(num1==num2)
  932.                                     {
  933.                                         num1=1;
  934.                                     }
  935.                                     else
  936.                                     {
  937.                                         num1=num2/num1;
  938.                                     }
  939.                                         flag=0;
  940.                                     division = 0;
  941.                                     
  942.                                 }
  943.                                 else if(minus)
  944.                                 {
  945.                                     if(F==1)
  946.                                     {
  947.                                         num1=num1+num2;
  948.                                     }
  949.                                     
  950.                                     else
  951.                                     {
  952.                                         if(num2>num1)
  953.                                         {
  954.                                             num1=num2-num1;
  955.                                             F = 0;
  956.                                         }
  957.                                         else if(num2==num1)
  958.                                         {
  959.                                             num1=0;
  960.                                             F = 0;
  961.                                         }
  962.                                         else
  963.                                         {
  964.                                             if(num2<num1)
  965.                                             {
  966.                                                 num1=num1-num2;
  967.                                                 F = 1;   
  968.                                             }
  969.                                         }
  970.                                  }
  971.                                     flag=0;
  972.                                     minus = 0;
  973.                                 
  974.                                 }
  975.                                 
  976.                             }
  977.                         break;
  978.             }
  979.              if(quyu)
  980.                 {
  981.                         F=!F;
  982.                         quyu=0;
  983.                 }
  984.             key = 0;
  985.             if(num1<100000000)
  986.             {
  987.                 if(num == 0)
  988.                 {
  989.                     num1 = num1*10;
  990.                     num = -1;
  991.                 }   
  992.                 if(num>0 && num<10)
  993.                 {
  994.                     num1 = num1*10+num;
  995.                     num = -1;
  996.                 }
  997.             }
  998.         }
  999.     }
  1000. }

复制代码
注释部分字体显示有点错误,不过没什么关系

复制到主界面即可用
51hei下载地址: jishuanji.7z (253.88 KB, 下载次数: 211)



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

使用道具 举报

沙发
ID:939031 发表于 2021-6-17 23:56 来自手机 | 只看该作者
为什么我下载下来,C和小数点不能用,还有重叠
回复

使用道具 举报

板凳
ID:278276 发表于 2021-6-18 07:44 | 只看该作者
算不了小数
回复

使用道具 举报

地板
ID:960680 发表于 2021-8-18 10:01 | 只看该作者

你好,请问的代码除了算不了小数,其他功能都可以实现吗?
回复

使用道具 举报

5#
ID:986495 发表于 2021-12-5 18:16 | 只看该作者
请问代码的and与minus是如何进行计算的,可以注释一下吗
回复

使用道具 举报

6#
ID:1075672 发表于 2024-4-24 17:37 | 只看该作者
三角函数也不可用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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