找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求这个单片机计算器代码的注释

[复制链接]
跳转到指定楼层
楼主
ID:907740 发表于 2021-4-18 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*--------------------------------------
  2. Calculator progarm V1.1
  3. MCU STC12C5A16S2  XAL 12MHz
  4. Build by Gavin Hu, 2021.4.13
  5. Key arrangement:
  6.         C  7  8  9  /
  7.            4  5  6  *
  8.            1  2  3  -
  9.            0  .  +  =
  10. --------------------------------------*/
  11. #include <STC_NEW_8051.H>
  12. #include "typedef.h"

  13. #define LED7SEG_CA          true
  14. #define LED7SEG_LSB_LEFT    true
  15. #define DISP_OFF_CODE       26
  16. #define DISP_MINUS_CODE     25
  17. #define DISP_DIG_CODE       0X80

  18. #define KEY_PORT            P1
  19. #define NO_KEY_PRESS        255

  20. #define MAX_NUMBER          99999992.0
  21. #define MIN_NUMBER          -9999992.0

  22. void delay_ms(unsigned int dt);
  23. void Led7segDisplay(const uint8_t c_a_u8DispRam[]);
  24. uint8_t u8KeyScan(void);
  25. bool bAddNumber(uint8_t a_u8String[], uint8_t u8Number);
  26. bool bString2Float(float32_t* p_f32Data, const uint8_t c_a_u8String[]);
  27. bool bFloat2String(uint8_t a_u8String[], float32_t f32Value);
  28. bool bCalculate(float32_t* p_f32Data, float32_t f32Data, uint8_t u8Operater);

  29. sbit BUZZ=P1^7;

  30. static bit l_bInputNewNumber=true;
  31. /*--------------------------------------
  32.   main function
  33. --------------------------------------*/
  34. void main(void)
  35. {
  36.     code uint8_t c_a_u8KeyTable[]={7,8,9,'/',4,5,6,'*',1,2,3,'-',0,'.','+','='};
  37.     idata uint8_t a_u8DispRam[]={DISP_OFF_CODE,DISP_OFF_CODE,DISP_OFF_CODE,DISP_OFF_CODE,DISP_OFF_CODE,DISP_OFF_CODE,DISP_OFF_CODE,0};
  38.     uint8_t u8KeyRecord, u8Key, u8Operater;
  39.     float32_t f32DataOld, f32DataNew;
  40.     bit bDataReady=false;

  41.     #if LED7SEG_CA
  42.     P2M0=0xFF;
  43.     #else
  44.     P0M0=0xFF;
  45.     #endif
  46.     u8KeyRecord = NO_KEY_PRESS;
  47.     while(1)
  48.     {
  49.         u8Key = u8KeyScan();
  50.         if ((u8KeyRecord != u8Key) && (u8Key != NO_KEY_PRESS))
  51.         {
  52.             switch (u8Key)
  53.             {
  54.                 case 0:
  55.                 case 1:
  56.                 case 2:
  57.                 case 4:
  58.                 case 5:
  59.                 case 6:
  60.                 case 8:
  61.                 case 9:
  62.                 case 10:
  63.                 case 12:
  64.                 case 13:
  65.                 bAddNumber(a_u8DispRam, c_a_u8KeyTable[u8Key]);
  66.                 break;
  67.                 case 3:
  68.                 case 7:
  69.                 case 11:
  70.                 case 14:
  71.                 if (bDataReady)
  72.                 {
  73.                     if (!l_bInputNewNumber)
  74.                     {
  75.                         bString2Float(&f32DataNew, a_u8DispRam);
  76.                         bCalculate(&f32DataOld, f32DataNew, u8Operater);
  77.                         bFloat2String(a_u8DispRam, f32DataOld);
  78.                     }
  79.                 }
  80.                 else
  81.                 {
  82.                     bString2Float(&f32DataOld, a_u8DispRam);
  83.                     bDataReady = true;
  84.                 }
  85.                 u8Operater = c_a_u8KeyTable[u8Key];
  86.                 l_bInputNewNumber = true;
  87.                 break;
  88.                 case 15:
  89.                 if (bDataReady)
  90.                 {
  91.                     if (!l_bInputNewNumber)
  92.                     {
  93.                         bString2Float(&f32DataNew, a_u8DispRam);
  94.                     }
  95.                     bCalculate(&f32DataOld, f32DataNew, u8Operater);
  96.                     bFloat2String(a_u8DispRam, f32DataOld);
  97.                 }
  98.                 l_bInputNewNumber = true;
  99.                 break;
  100.             }
  101.         }
  102.         u8KeyRecord = u8Key;
  103.         Led7segDisplay(a_u8DispRam);
  104.     }
  105. }

  106. /*--------------------------------------
  107.   Calculate data
  108.   Parameter: data pointer, data, operater
  109.   Return: true=secced
  110. --------------------------------------*/
  111. bool bCalculate(float32_t* p_f32Data, float32_t f32Data, uint8_t u8Operater)
  112. {
  113.     switch (u8Operater)
  114.     {
  115.         case '+':
  116.         *p_f32Data += f32Data;
  117.         break;
  118.         case '-':
  119.         *p_f32Data -= f32Data;
  120.         break;
  121.         case '*':
  122.         *p_f32Data *= f32Data;
  123.         break;
  124.         case '/':
  125.         *p_f32Data /= f32Data;
  126.         break;
  127.     }
  128.     if ((*p_f32Data > MAX_NUMBER)||(*p_f32Data < MIN_NUMBER))
  129.     {
  130.         return false;
  131.     }
  132.     else
  133.     {
  134.         return true;
  135.     }
  136. }

  137. /*--------------------------------------
  138.   Add number to string
  139.   Parameter: string,number
  140.   Return: true=secced
  141. --------------------------------------*/
  142. bool bAddNumber(uint8_t a_u8String[], uint8_t u8Number)
  143. {
  144.     static bit s_bDecFlag;
  145.     uint8_t i;
  146.     bit bRetFlag=false;
  147.     if (l_bInputNewNumber)
  148.     {
  149.         s_bDecFlag = false;
  150.         for (i=0;i<7;i++)
  151.         {
  152.             a_u8String[i] = DISP_OFF_CODE;
  153.         }
  154.         a_u8String[7] = 0;
  155.         l_bInputNewNumber = false;
  156.     }
  157.     if (DISP_OFF_CODE == a_u8String[0])
  158.     {
  159.         if ('.'==u8Number)
  160.         {
  161.             if (!s_bDecFlag)
  162.             {
  163.                 s_bDecFlag = true;
  164.                 a_u8String[7] |= DISP_DIG_CODE;
  165.                 bRetFlag = true;
  166.             }
  167.         }
  168.         else
  169.         {
  170.             if ((0==a_u8String[7])&&(DISP_OFF_CODE==a_u8String[6]))
  171.             {
  172.                 a_u8String[7]=u8Number;
  173.             }
  174.             else
  175.             {
  176.                 for (i=0;i<7;i++)
  177.                 {
  178.                     a_u8String[i] = a_u8String[i+1];
  179.                 }
  180.                 a_u8String[7] = u8Number;
  181.             }
  182.             bRetFlag = true;
  183.         }
  184.     }
  185.     return bRetFlag;
  186. }

  187. /*--------------------------------------
  188.   Convert string to float function
  189.   Parameter: return data point, string
  190.   Return: true=secuceed
  191. --------------------------------------*/
  192. bool bString2Float(float32_t* p_f32Data, const uint8_t c_a_u8String[])
  193. {
  194.     bit bNegativeSign=false;
  195.     uint8_t i=0;
  196.     float32_t f32Coefficient=0.1;
  197.     while (DISP_OFF_CODE == c_a_u8String[i])
  198.     {
  199.         i++;
  200.     }
  201.     if (DISP_MINUS_CODE == c_a_u8String[i])
  202.     {
  203.         bNegativeSign = true;
  204.         i++;
  205.     }
  206.     *p_f32Data = 0.0;
  207.     for (;i<8;i++)
  208.     {
  209.         *p_f32Data *= 10.0;
  210.         *p_f32Data += (c_a_u8String[i] & 0x7F);
  211.         if ((c_a_u8String[i] & DISP_DIG_CODE) != 0)
  212.         {
  213.             i++;
  214.             break;
  215.         }
  216.     }
  217.     for (;i<8;i++)
  218.     {
  219.         *p_f32Data += (c_a_u8String[i] * f32Coefficient);
  220.         f32Coefficient *= 0.1;
  221.     }
  222.     if (bNegativeSign)
  223.     {
  224.         *p_f32Data = 0.0 - *p_f32Data;
  225.     }
  226.     if ((*p_f32Data > MAX_NUMBER)||(*p_f32Data < MIN_NUMBER))
  227.     {
  228.         return false;
  229.     }
  230.     else
  231.     {
  232.         return true;
  233.     }
  234. }

  235. /*--------------------------------------
  236.   Convert float to string function
  237.   Parameter: return string,float data
  238.   Return: true=secced
  239. --------------------------------------*/
  240. bool bFloat2String(uint8_t a_u8String[], float32_t f32Value)
  241. {
  242.     bit bNegativeSign=false;
  243.     uint8_t i;
  244.     float32_t f32Coefficient = 10000000.0;
  245.     if ((f32Value < MAX_NUMBER) && (f32Value > MIN_NUMBER))
  246.     {
  247.         if (f32Value < 0.0)
  248.         {
  249.             bNegativeSign = true;
  250.             f32Value = 0.0 - f32Value;
  251.         }
  252.         for (i=0;i<7;i++)
  253.         {
  254.             if ((f32Value / f32Coefficient) < 1.0)
  255.             {
  256.                 f32Coefficient /= 10.0;
  257.             }
  258.             else
  259.             {
  260.                 break;
  261.             }
  262.         }
  263.         for (i=0;i<8;i++)
  264.         {
  265.             a_u8String[i] = (uint8_t)(f32Value / f32Coefficient);
  266.             f32Value -= f32Coefficient * a_u8String[i];
  267.             if (1 == (uint8_t)f32Coefficient)
  268.             {
  269.                 a_u8String[i] |= DISP_DIG_CODE;
  270.             }
  271.             f32Coefficient /= 10.0;
  272.         }
  273.         if (bNegativeSign)
  274.         {
  275.             for (i=7;i!=0;i--)
  276.             {
  277.                 a_u8String[i] = a_u8String[i-1];
  278.             }
  279.             a_u8String[0] = DISP_MINUS_CODE;
  280.         }
  281.         while (0 == a_u8String[7])
  282.         {
  283.             for (i=7;i!=0;i--)
  284.             {
  285.                 a_u8String[i] = a_u8String[i-1];
  286.             }
  287.             a_u8String[0] = DISP_OFF_CODE;
  288.         }
  289.         return true;
  290.     }
  291.     else
  292.     {
  293.         return false;
  294.     }
  295. }

  296. /*--------------------------------------
  297.   Delay function
  298.   STC 1T MCU @ 12MHz
  299.   Parameter: unsigned int dt
  300.   Delay time=dt(ms)
  301. --------------------------------------*/
  302. void delay_ms(uint16_t u16Time)
  303. {
  304.     register uint8_t i,j;
  305.     for (; u16Time; u16Time--)
  306.     {
  307.         for (i=12;i!=0;i--)
  308.         {
  309.             for (j=248;j!=0;j--)
  310.             {
  311.             }
  312.         }
  313.     }
  314. }

  315. /*--------------------------------------
  316.   8 LED digital tubes display function
  317.   Parameter: sting pointer to display
  318. --------------------------------------*/
  319. void Led7segDisplay(const uint8_t c_a_u8DispRam[])
  320. {
  321.     static uint8_t s_u8Index=0;
  322.   #if LED7SEG_CA
  323.     code uint8_t c_a_u8Led7segCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xC2,0x89,0xF1,0xC7,0xAB,0x8C,0xAF,0x87,0xC1,0xBF,0xFF};
  324.     P2=0;
  325.     P0=c_a_u8Led7segCode[c_a_u8DispRam[s_u8Index] & 0x7F] & ~(c_a_u8DispRam[s_u8Index]&0x80);
  326.     #if LED7SEG_LSB_LEFT
  327.     P2=1<<s_u8Index;
  328.     #else
  329.     P2=0x80>>s_u8Index;
  330.     #endif
  331.   #else
  332.     code uint8_t c_a_u8Led7segCode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x3D,0x76,0x0E,0x38,0x54,0x73,0x50,0x78,0x3E,0x40,0x00};
  333.     P2=0xFF;
  334.     P0=c_a_u8Led7segCode[c_a_u8DispRam[s_u8Index] & 0x7F] | (c_a_u8DispRam[s_u8Index]&0x80);
  335.     #if LED7SEG_LSB_LEFT
  336.     P2=~(1<<s_u8Index);
  337.     #else
  338.     P2=~(0x80>>s_u8Index);
  339.     #endif
  340.   #endif
  341.     delay_ms(1);
  342.     s_u8Index++;
  343.     if (s_u8Index>=8)
  344.     {
  345.         s_u8Index=0;
  346.     }
  347. }
  348. /*--------------------------------------
  349.   Key scan function
  350.   Return key number,255 no key press
  351. --------------------------------------*/
  352. uint8_t u8KeyScan(void)
  353. {
  354.     uint8_t u8Key=255;
  355.     uint8_t u8Value=0xEF,i;
  356.     for (i=0;i<4;i++)
  357.     {
  358.         KEY_PORT=u8Value;
  359.         switch (KEY_PORT & 0x0F)
  360.         {
  361.             case 0x0E: u8Key=i*4;
  362.             break;
  363.             case 0x0D: u8Key=i*4+1;
  364.             break;
  365.             case 0x0B: u8Key=i*4+2;
  366.             break;
  367.             case 0x07: u8Key=i*4+3;
  368.             break;
  369.         }
  370.         u8Value=u8Value<<1|1;
  371.     }
  372.     return u8Key;
  373. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:871393 发表于 2021-4-19 12:53 | 只看该作者
我想不出为什么要给你注释这三百多行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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