[C语言] 初学者请教程序问题

[复制链接]
1007|2
 楼主| zjut_zone 发表于 2015-4-3 11:18 | 显示全部楼层 |阅读模式
LED, pd, pc, dc, se
本帖最后由 zjut_zone 于 2015-4-3 12:00 编辑
  1. 这个程序是采集电压并用三位数码管显示的,程序方面没有系统的学习,请教程序架构改如何优化。
  1. <div class="blockcode"><blockquote>/* MAIN.C file
  2. * 电压采样并用三位数码管显示,单片机直接驱动
  3. */
  4. #include<stm8s003f3.h>
  5. #define N 10
  6. const unsigned char LED1[]={0xA8,0x28,0x98,0xB8,0x38,0xB0,0xB0,0x28,0XBF,0XBF};
  7. const unsigned char LED2[]={0x34,0x00,0x14,0x10,0x20,0x30,0x34,0x10,0XFF,0XFB};
  8. unsigned int i,k,j,value;
  9. unsigned int a;
  10. unsigned char d=0;
  11. unsigned int sum=0;
  12. unsigned char adcbuf[9];
  13. _Bool dot @PC_ODR:6;

  14. //*三位数码管显示函数*//

  15. void Display(unsigned char x)
  16. {
  17.     for(i=0;i<200;i++);
  18.     PC_ODR = 0X00;
  19.     PD_ODR = 0X00;        
  20.    if(++d>2)
  21.        {
  22.           d=0;
  23.        }
  24.   //*三位数码管十位显示范围1-2*//
  25.    if(d==0)
  26.        {
  27.              if(x/100==2)
  28.                  {
  29.                       PA_ODR = 0X0c;       //共阴极数码管,显示第一位
  30.                       PC_ODR = LED1[2];    //显示数字2,PC和PD共同控制
  31.                       PD_ODR = LED2[2];
  32.                  }
  33.              else if(x/100==1)
  34.                 {
  35.                      PA_ODR = 0X0c;
  36.                      PC_ODR = LED1[1];
  37.                      PD_ODR = LED2[1];
  38.                 }
  39.              else
  40.                {
  41.                    PA_ODR = 0X00;
  42.                 }
  43.          }        
  44.   //*三位数码管个位显示范围0-9和小数点*//
  45.       else if(d==1)
  46.        {
  47.              if(x/10%10==0)
  48.                   {
  49.                        PA_ODR = 0X0a;        //共阴极数码管,显示第二位
  50.                        PC_ODR = LED1[0];
  51.                        PD_ODR = LED2[0];
  52.                         dot=1;               //显示小数点
  53.                    }
  54.                else if(x/10%10==1)
  55.                    {
  56.                           PA_ODR = 0X0a;
  57.                           PC_ODR = LED1[1];
  58.                           PD_ODR = LED2[1];
  59.                           dot=1;
  60.                    }
  61.                  else if(x/10%10==2)
  62.                       {
  63.                             PA_ODR = 0X0a;
  64.                             PC_ODR = LED1[2];
  65.                             PD_ODR = LED2[2];
  66.                             dot=1;
  67.                        }
  68.                   else if(x/10%10==3)
  69.                          {
  70.                             PA_ODR = 0X0a;
  71.                             PC_ODR = LED1[3];
  72.                             PD_ODR = LED2[3];
  73.                             dot=1;
  74.                         }
  75.                    else if(x/10%10==4)
  76.                        {
  77.                             PA_ODR = 0X0a;
  78.                             PC_ODR = LED1[4];
  79.                             PD_ODR = LED2[4];
  80.                             dot=1;
  81.                        }
  82.                      else if(x/10%10==5)
  83.                       {
  84.                             PA_ODR = 0X0a;
  85.                             PC_ODR = LED1[5];
  86.                             PD_ODR = LED2[5];
  87.                             dot=1;
  88.                       }
  89.                       else if(x/10%10==6)
  90.                        {
  91.                             PA_ODR = 0X0a;
  92.                             PC_ODR = LED1[6];
  93.                             PD_ODR = LED2[6];
  94.                             dot=1;
  95.                        }
  96.                      else if(x/10%10==7)
  97.                        {
  98.                            PA_ODR = 0X0a;
  99.                            PC_ODR = LED1[7];
  100.                            PD_ODR = LED2[7];
  101.                            dot=1;
  102.                        }
  103.                       else if(x/10%10==8)
  104.                      {
  105.                            PA_ODR = 0X0a;
  106.                            PC_ODR = LED1[8];
  107.                            PD_ODR = LED2[8];
  108.                            dot=1;
  109.                      }
  110.                     else if(x/10%10==9)
  111.                      {
  112.                            PA_ODR = 0X0a;
  113.                            PC_ODR = LED1[9];
  114.                            PD_ODR = LED2[9];
  115.                           dot=1;
  116.                      }
  117.                                  
  118.                }        
  119.                          //*小数点后面显示范围0-9*//
  120.             else
  121.                  {
  122.                      if(x%10==0)
  123.                        {
  124.                             PA_ODR = 0X06;
  125.                             PC_ODR = LED1[0];
  126.                             PD_ODR = LED2[0];
  127.                        }
  128.                      if(x%10==1)
  129.                         {
  130.                             PA_ODR = 0X06;
  131.                             PC_ODR = LED1[1];
  132.                             PD_ODR = LED2[1];
  133.                          }
  134.                     if(x%10==2)
  135.                       {
  136.                             PA_ODR = 0X06;
  137.                             PC_ODR = LED1[2];
  138.                             PD_ODR = LED2[2];
  139.                       }
  140.                     if(x%10==3)
  141.                       {
  142.                           PA_ODR = 0X06;
  143.                           PC_ODR = LED1[3];
  144.                           PD_ODR = LED2[3];
  145.                        }
  146.                      if(x%10==4)
  147.                           {
  148.                                PA_ODR = 0X06;
  149.                                PC_ODR = LED1[4];
  150.                                PD_ODR = LED2[4];
  151.                           }
  152.                    if(x%10==5)
  153.                      {
  154.                             PA_ODR = 0X06;
  155.                             PC_ODR = LED1[5];
  156.                             PD_ODR = LED2[5];
  157.                      }
  158.                    if(x%10==6)
  159.                      {
  160.                             PA_ODR = 0X06;
  161.                             PC_ODR = LED1[6];
  162.                             PD_ODR = LED2[6];
  163.                        }
  164.                    if(x%10==7)
  165.                        {
  166.                             PA_ODR = 0X06;
  167.                             PC_ODR = LED1[7];
  168.                             PD_ODR = LED2[7];
  169.                         }
  170.                       if(x%10==8)
  171.                          {
  172.                             PA_ODR = 0X06;
  173.                             PC_ODR = LED1[8];
  174.                             PD_ODR = LED2[8];
  175.                           }
  176.                       if(x%10==9)
  177.                          {
  178.                             PA_ODR = 0X06;
  179.                             PC_ODR = LED1[9];
  180.                             PD_ODR = LED2[9];
  181.                         }
  182.                 }        
  183. }
  184. //*初始化ADC模块*//
  185. void ADC_init(void)
  186. {
  187.          ADC_CSR = 0x06;          // 选择AD转换通道AN6
  188.          ADC_CR1 = 0X00;          // 设置AD转换时钟1/2,1MHz;单次转换
  189.          ADC_CR2 = 0x08;          // 设置数据为右对齐
  190.          ADC_CR3 = 0x00;          // 不使用数据缓冲
  191.          ADC_TDRL = 0X01;         // 禁止施密特触发
  192. }
  193. //*初始化IO口*//
  194. void GPIO_init(void)
  195. {
  196.          CLK_ICKR = 0X01;         // 系统时钟默认内部RC16MHz;
  197.          CLK_CKDIVR = 0X18;       //系统默认8分频;
  198.          PD_DDR = 0X34;           //PD6--AN6.
  199.          PD_CR1 = 0X3F;           
  200.          PD_CR2 = 0X00;
  201.          PD_ODR = 0Xff;
  202.          PC_DDR = 0XF8;           
  203.          PC_CR1 = 0XFF;
  204.          PC_CR2 = 0X00;
  205.          PC_ODR = 0X00;
  206.          PA_DDR = 0X0E;           
  207.          PA_CR1 = 0XFF;
  208.          PA_CR2 = 0X00;
  209.          PA_ODR = 0X00;
  210. }
  211. //*采集电压多组取平均值*//
  212. unsigned int GetADC(void)
  213. {   
  214.          for(i=0;i<N;i++)
  215.             {
  216.                ADC_CSR &= 0x7F;             //EOC位清零
  217.                while(!(ADC_CSR & 0x86));    // 等待AD转换完成,EOC自动置1
  218.                adcbuf[i] = ADC_DRH * 256 + ADC_DRL;                                      
  219.                }                                                               
  220.          for(i=0;i<N;i++)
  221.                {
  222.                     sum+=adcbuf[i];
  223.                }
  224.           sum=sum/N;
  225.           return sum;        

  226.      
  227. }
  228. void main(void)
  229. {
  230.            GPIO_init();
  231.            ADC_init();
  232.            while (1)
  233.        {
  234.                  
  235.           ADC_CR1 = 0x01;                 // 打开AD模块电源
  236.           for (i = 0;i < 100;i++);        // 延时
  237.           value=GetADC();
  238.           a =(int)(((float)value / 1023) * 5000);
  239.           a=(int)(((float)a / 30) * 1006);
  240.           a/=100;
  241.           Display(a);
  242.     }
  243.         
  244. }


yiwang1011 发表于 2015-4-3 12:11 | 显示全部楼层
按模块封装

评分

参与人数 1威望 +3 收起 理由
zjut_zone + 3

查看全部评分

xyz549040622 发表于 2015-4-3 16:23 | 显示全部楼层
这个多if,完全可以用case了,尽量减少全局变量,改为参数的返回值传递。

评分

参与人数 1威望 +3 收起 理由
zjut_zone + 3

查看全部评分

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

本版积分规则

16

主题

129

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部