上传一个用STM8S003做的一个电子秤程序 调试通过

2019-12-11 18:37发布

  1. #include "stm8s.h"
  2. #include "stm8s_gpio.h"
  3. #include "stm8s_exti.h"
  4. #include "stm8s.h"
  5. #include "stm8s_type.h"
  6. #include "stm8s.h"
  7. #include "stm8s_tim1.h"
  8. #include "stm8s_clk.h"
  9. #include "stm8s_conf.h"

  10. #define HC595_PORT (GPIOC)
  11. #define HC595_DIO  (GPIO_PIN_3)
  12. #define HC595_SCK  (GPIO_PIN_4)
  13. #define HC595_RCK (GPIO_PIN_5)

  14. void LS595_out(void);
  15. void LS595_in(u8 Data);

  16. /*
  17. #define BUTTON_PORT (GPIOC)
  18. #define BUTTOButtonStateN_PIN  (GPIO_PIN_0)
  19. */
  20. #define AD_Conver (GPIOA)
  21. #define AD_DA  (GPIO_PIN_1)
  22. #define AD_CK  (GPIO_PIN_2)


  23. u8 table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0xfe,0x9c,0xfc,0x9e,0x8e};  //段选
  24. u8 Wtable[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};    //位选


  25. void shumaguan_595(u8 wei,u8 duan)        ;
  26. void display(void);
  27. u32 Sampling(void);

  28. u32 readconver(void);


  29. /* Private macro -------------------------------------------------------------*/

  30. /* Private function prototypes -----------------------------------------------*/
  31. void Delay (u16 nCount);

  32. /* Private functions ---------------------------------------------------------*/
  33. /* Public variables ---------------------------------------------------------*/
  34. //u8 ButtonState = 0x00;
  35. //u8 A1, A2, A3, A4,A5,A6,A7,A8;
  36. u32 Lheight,AD;

  37. unsigned char A1, A2, A3, A4,A5,A6,A7,A8;

  38. void main(void)
  39. {

  40.   u8 Leds; /* Contains which LEDs to operate */

  41.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

  42.   /* Initialize I/Os in Output Mode */
  43. GPIO_Init(GPIOC,GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_FAST); //推挽输出模式
  44.         GPIO_Init(AD_Conver,    AD_DA | AD_CK ,  GPIO_MODE_OUT_PP_LOW_FAST);                //推挽输出模式

  45.   /* Initialize I/O in Input Mode with Interrupt */
  46. // GPIO_Init(BUTTON_PORT, BUTTON_PIN, GPIO_MODE_IN_FL_IT);

  47.   /* Initialize the Interrupt sensitivity */
  48. // EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);

  49. // enableInterrupts();

  50.   /* Toggles LEDs */

  51.   while (1)
  52.   {
  53.                          
  54.                    u32 c;
  55.                          // Lheight = ((Sampling()));
  56.                                 Lheight=(Sampling()/1000-92)*75;
  57.                           //Lheight=1;
  58.                                 //c=(readconver());
  59.                 //        c=         readconver();
  60.                 //Lheight = readconver()-93048;
  61.                 if(Lheight>0)
  62.                
  63.                 //Lheight=Lheight;
  64.                                 //Lheight = Sampling();
  65.                          {
  66.                          A8=Lheight%10;
  67.                           A7=(Lheight%100)/10;
  68.                           A6=(Lheight%1000)/100;
  69.                           A5=(Lheight%10000)/1000;                                                                                                         
  70.                           A4=(Lheight%100000)/10000;       
  71.         A3=(Lheight%1000000)/100000;       
  72.         A2=(Lheight%10000000)/1000000;
  73.         A1=Lheight/10000000;
  74.                         display();
  75.                         }
  76.                         else
  77.                         Lheight=0;
  78.                         A8=Lheight%10;
  79.                         A7=(Lheight%100)/10;
  80.                         A6=(Lheight%1000)/100;
  81.                         A5=(Lheight%10000)/1000;                                                                                                         
  82.                         A4=(Lheight%100000)/10000;       
  83.                         A3=(Lheight%1000000)/100000;       
  84.                         A2=(Lheight%10000000)/1000000;
  85.                         A1=Lheight/10000000;
  86.                         display();
  87.                        
  88.        
  89.                        
  90.   }

  91. }
  92. void display(void)
  93.   {   
  94.            u8 a;
  95.              for(a=2000;a>0;a--);
  96.                          {
  97.                          shumaguan_595(Wtable[0],table[A1]);
  98.                          shumaguan_595(Wtable[1],table[A2]);
  99.                          shumaguan_595(Wtable[2],table[A3]);
  100.                          shumaguan_595(Wtable[3],table[A4]);
  101.                          shumaguan_595(Wtable[4],table[A5]);
  102.                          shumaguan_595(Wtable[5],table[A6]);
  103.                          shumaguan_595(Wtable[6],table[A7]);
  104.                          shumaguan_595(Wtable[7],table[A8]);
  105.                          shumaguan_595(0xff,table[0]);
  106.                  Delay(100);
  107.                  }
  108.   }

  109. u32 readconver(void)
  110. {   

  111.         u8 i;
  112.         u32 dat=0;
  113.         //GPIO_WriteHigh(AD_Conver,AD_DA);
  114.         //Delay(5);
  115.         GPIO_WriteLow(AD_Conver,AD_CK);   //当 AD_CK 为低电平时,芯片处于正常工作状态,使能AD
  116.         while(GPIO_ReadInputPin(AD_Conver,AD_DA)!=0);   //AD转换未结束则等待,否则开始读取
  117.         GPIO_Init(AD_Conver,   AD_DA ,  GPIO_MODE_IN_FL_NO_IT); //重新配置为输入模式
  118.        
  119.                  for(i=0;i<24;i++)   //读24个bit
  120.         {
  121.                 GPIO_WriteHigh(AD_Conver,AD_CK);
  122.                 dat=dat<<1;//count=count<<1;   //向左移一位
  123.     GPIO_WriteLow(AD_Conver,AD_CK);               
  124.         //        if(GPIO_ReadInputPin(AD_Conver,AD_DA))  高电平返回非0,低返回0
  125.         if(GPIO_ReadInputPin(AD_Conver,AD_DA)!=0)
  126.    
  127.                 dat++;                  //if(AD_DA)count++; //当AD_DA为1时  count+1
  128.         }
  129.        
  130.          GPIO_WriteHigh(AD_Conver,AD_CK);
  131.           //dat=dat^0x800000;  // 第25个脉冲下降沿来时,转换数据
  132.          GPIO_WriteLow(AD_Conver,AD_CK);
  133.          return(dat);
  134. }



  135. u32 Sampling(void)
  136. {
  137.         u32 Sam[12],tmpmax,tmpmin,sum=0,Average;                                               
  138.         u8 i;
  139.                                                                                                                                                    
  140.         for(i=0;i<12;i++)
  141.         {                                                                                                                                                                                         
  142.                 Sam[i]=readconver();
  143.                 if(i==0)
  144.                 {
  145.                         tmpmax=Sam[0];
  146.                         tmpmin=Sam[0];
  147.                 }
  148.                 if(i>0)
  149.                 {
  150.                         if(Sam[i]>tmpmax)tmpmax=Sam[i];
  151.                         if(Sam[i]<tmpmin)tmpmin=Sam[i];
  152.                 }
  153.         }                                                                       

  154.         for(i=0;i<12;i++)
  155.         {
  156.                 if(!(Sam[i]==tmpmax||Sam[i]==tmpmin))
  157.                 {
  158.                         sum=sum+Sam[i];       
  159.                 }                                                                                                                               
  160.         }
  161.         Average=sum/10;

  162.         return(Average);
  163. }

  164. void shumaguan_595(u8 wei,u8 duan)                       
  165. {
  166.          u8 i;
  167.          for(i=0;i<8;i++)
  168.         {
  169.   LS595_in (wei);
  170.   LS595_in(duan);
  171.         LS595_out();
  172.         //TMR0_Delay1ms(1);
  173. }

  174. }                 
  175.    
  176. void LS595_in(u8 Data)
  177. {
  178.   u8 i;
  179.        
  180.         for(i=0;i<8;i++)            
  181.   {
  182.       GPIO_WriteLow(HC595_PORT, HC595_SCK);
  183.        
  184.                  if(Data&0x01)
  185.          {
  186.             GPIO_WriteHigh(HC595_PORT,HC595_DIO);
  187.          }
  188.      else
  189.    {
  190.            GPIO_WriteLow(HC595_PORT,HC595_DIO);
  191.    }                                  
  192.                 Data>>=1;                    
  193.     GPIO_WriteHigh(HC595_PORT, HC595_SCK);
  194.    }
  195. }
  196. /*写入数据函数*/

  197. void LS595_out(void)
  198. {
  199.   GPIO_WriteLow(HC595_PORT, HC595_RCK);
  200.                            
  201.   //RCK=1;                    //当RCK为上升沿时将数据并行输出
  202.         Delay(1);
  203.         GPIO_WriteHigh(HC595_PORT, HC595_RCK);
  204.   //TMR0_Delay1ms(1);
  205.         Delay(1);
  206.   GPIO_WriteLow(HC595_PORT, HC595_RCK);
  207.        
  208. }

  209. void Delay(u16 nCount)
  210. {
  211.   /* Decrement nCount value */
  212.   while (nCount != 0)
  213.   {
  214.     nCount--;
  215.   }
  216. }






  217. #ifdef FULL_ASSERT
  218. void assert_failed(u8 *file, u16 line)
  219. #else
  220. void assert_failed(void)
  221. #endif
  222. {
  223.   /* Add your own code to manage an assert error */
  224.   /* Infinite loop */
  225.   while (1)
  226.   {
  227.   }
  228. }
复制代码

使用HC595串行输入,并行输出
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。