久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5816|回復: 5
收起左側

STM8L低功耗芯片,開發一款智能手持血糖監測設備的源碼

[復制鏈接]
ID:128771 發表于 2016-7-7 05:00 | 顯示全部樓層 |閱讀模式
0.png

  1. #include "stm8l15x.h"
  2. #include "./Protocol/Protocol.h"
  3. #include "./LCD/Lcd_Driver.h"
  4. #include "./RTC_CLK/RTC_CLK.h"
  5. #include "./InPut/InPut_Driver.h"
  6. #include "./IIC/I2C_Driver.h"
  7. #include "./Flash/Flash_Driver.h"
  8. #include "./UsrData/UsrData.h"
  9. #include "stdio.h"
  10. #include "main.h"

  11. /*
  12. *****************************************************************/
  13. System_sContrl SystemCtr;
  14. Main_sMenu MainMenu;
  15. PassWdBrand_sContrl PassWordBrand;
  16. /*
  17. *****************************************************************/
  18. /*   測試程序    */
  19. void System_Delay(uint8_t nCount);

  20. void Read_RTCTimes();
  21. uint8_t System_AutoCheck();
  22. uint8_t Time_Setting(void);

  23. void ReadPasswdBrand();
  24. uint8_t ReadPassWDMode();


  25. uint8_t Recode_Header(uint32_t paddr,uint8_t *uData);
  26. uint8_t Read_RecodeData(uint32_t paddr,uint8_t *uData);
  27. uint8_t Verity_PassWord();

  28. static void TIM4_Config(void);
  29. static void USART_Config(void);
  30. static void LCD_RTCConfig(void);
  31. static void System_MainMenu();

  32.   void System_EventProcess();

  33. void SystemDeviceInit();
  34. void Halt_OffDevice();
  35. void TestBoolMode();

  36. void main(void)
  37. {     
  38.       CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  39.       while(1)
  40.       {
  41.         /*          判斷是否有輸入                  */
  42.         if(InputDevice.uType == NO_INPUT_DEV )
  43.         {
  44.           /*        判斷系統是否激活狀態            */
  45.           if( SystemCtr.uStatus != SYSTEM_ACTIVE )
  46.           {
  47.             /*進入halt模式關閉,外設
  48.             ******************************************/
  49.             Halt_OffDevice();
  50.            /*****************************************/
  51.             halt();   //進入休眠模式         
  52.            /*初始化系統外設init()
  53.             ****************************************/
  54.            SystemDeviceInit();
  55.            /****************************************/
  56.           }
  57.         }
  58.             
  59.           InPut_Process();
  60.          /* 系統處理過程
  61.          ****************************************/  
  62.           if(SystemCtr.uStatus == SYSTEM_ACTIVE)
  63.           {
  64.             System_MainMenu();
  65.         

  66.             System_EventProcess();
  67.       
  68.             Protocol_Process();

  69.           }
  70.          /****************************************/     
  71.       }
  72.       
  73.                                        
  74. }
  75. /***************************************************************
  76. * 函數名:System_MainMenu()
  77. * 輸入  :void
  78. * 輸出  :void
  79. * 功能  :系統處理菜單
  80. ****************************************************************/
  81. static void System_MainMenu()
  82. {
  83.   
  84.    if(SystemCtr.uStatus != SYSTEM_SLEEP)
  85.    {
  86.      if( ButtonClick.SystemVoiceKey == SET)
  87.      {
  88.        Display_Speeker(ENABLE);
  89.      }
  90.      else
  91.      {
  92.        Display_Speeker(DISABLE);
  93.      }
  94.       
  95.            
  96.       switch(MainMenu.uMenu)
  97.         {
  98.           case TESTING_BOOL_MENU:
  99.             {
  100.                  Write_RecodeTest();
  101.                  TestBoolMode();
  102.             }break;
  103.           case PASSWORD_BRAND_MENU:
  104.             {
  105.               if(ReadPassWDMode())
  106.                  DisplayOutSlaverEro();
  107.             }break;
  108.           case SETTING_TIME_MENU:
  109.             {
  110.               Set_Calendar();
  111.             }break;
  112.           case RECODE_BLEMPTY_MENU:
  113.             {
  114.               DisplayNoneEmptyBool();
  115.               //Read_Recode();
  116.             }break;
  117.           case RECODE_BLNOEMPTY_MENU:
  118.             {
  119.               DisplayNoneUnEmptyBool();
  120.              }break;
  121.           case RECODE_BLINDENTY_MENU:
  122.             {
  123.               DisplayNoneIndentBool();
  124.             }break;
  125.           case ALARM_CLOCK_MENU:
  126.             {
  127.               Display_Alarm(ENABLE);
  128.               
  129.              RTC_ITConfig(RTC_IT_ALRA, ENABLE);
  130.              RTC_AlarmCmd(ENABLE);
  131.             }break;
  132.           default :
  133.             {
  134.               SystemCtr.uStatus = SYSTEM_SLEEP;
  135.             }break;      
  136.          }
  137.      
  138.    }

  139. }
  140. /***************************************************************
  141. * 函數名:Halt_OffDevice
  142. * 輸入  :void
  143. * 輸出  :void
  144. * 功能  :進入halt模式前關閉外設
  145. ****************************************************************/
  146. void Halt_OffDevice()
  147. {
  148.   /* 關閉設備前,設置系統主時鐘,和中斷 */
  149.    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);   
  150.    InPut_Init();
  151.    enableInterrupts();
  152.    
  153.    
  154.    LCD_ClearScreen();
  155.    CalendarSetting_Quit();
  156.    LCD_Cmd(DISABLE); //關閉LCD
  157. }
  158. /***************************************************************
  159. * 函數名:SystemDeviceInit
  160. * 輸入  :void
  161. * 輸出  :void
  162. * 功能  :初始化外設
  163. ****************************************************************/
  164. void SystemDeviceInit()
  165. {   
  166.       CLK_SYSCLKSourceSwitchCmd(ENABLE);
  167.       /* System Clock is HSI/1 */
  168.       CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  169.      /*初始化I2C端口*/
  170.   
  171.       I2C_Init();
  172.       
  173.       TIM4_Config();
  174.       
  175.       USART_Config();
  176.       
  177.       LCD_RTCConfig();
  178.       
  179.       LCD_Init();
  180.       
  181.       Protocol_Init();

  182.         
  183. }
  184. /*******************************************************************
  185. * 函數名:ReadPasswdBrand
  186. * 輸  入:void8
  187. * 輸  出:void
  188. * 功  能:讀密碼牌操作
  189. ********************************************************************/
  190. void ReadPasswdBrand()
  191. {   
  192.      while(Verity_PassWord())//如果校驗碼與插入讀出的校驗碼不同回寫
  193.      {                    
  194.            FLASH_SetProgrammingTime( FLASH_ProgramTime_Standard); //設置Flash操作
  195.       
  196.            FLASH_unLock(MCU_EEPROM_DATA);                           //解鎖數據存儲區
  197.    
  198.            while (!(FLASH->IAPSR & (uint8_t)0x08));                   //等待解鎖操作
  199.       
  200.            /*      讀取密碼牌內容,數據搬移臨界區           */
  201.            System_Delay(200);
  202.         
  203.            IIC_SlaveRead_LongBuffer(PassWordBrand.DataBuffer,sizeof(PassWordBrand.DataBuffer));//讀出密碼牌數據
  204.         
  205.            System_Delay(10);     
  206.         
  207.            FLASH_WriteLongBuffer(MCU_EEPROM_DATA,PassWordBrand.DataBuffer,sizeof(PassWordBrand.DataBuffer));
  208.         
  209.            System_Delay(200);
  210.            /* ********************************************* */   
  211.           while (FLASH_GetFlagStatus( FLASH_FLAG_EOP) == SET);
  212.          
  213.           /* 讀取內容測試
  214.           FLASH_ReadLongBuffer(MCU_EEPROM_DATA,ReadBuffer,sizeof(ReadBuffer));
  215.           while (FLASH_GetFlagStatus( FLASH_FLAG_EOP) == SET);*/
  216.                         
  217.         
  218.        }
  219.                                     
  220. }
  221. /*******************************************************************
  222. * 函數名:ReadPassWDMode
  223. * 輸  入:void
  224. * 輸  出:void
  225. * 功  能:讀密碼牌操作
  226. ********************************************************************/
  227. uint8_t Verity_PassWord()
  228. {  

  229.   uint8_t uPassWord = 0;
  230.   uint8_t uFlash = 0;
  231.   
  232.   if(PassWordBrand.uStatus != VERIFY_SUCESS)
  233.   {
  234.      LCD_Cmd(DISABLE); //關閉LCD  
  235.      
  236.      FLASH_SetProgrammingTime( FLASH_ProgramTime_Standard); //設置Flash操作
  237.       
  238.      FLASH_unLock(MCU_EEPROM_DATA);                           //解鎖數據存儲區
  239.    
  240.      while (!(FLASH->IAPSR & (uint8_t)0x08));                   //等待解鎖操作
  241.      
  242.      System_Delay(200);
  243.      
  244.      uPassWord =(uint8_t)I2C_ReadByte(SLAVE_BLOCK_START_ADDRESS,SLAVE_START_ADDRESS);
  245.    
  246.       System_Delay(10);
  247.      
  248.      uFlash = (uint8_t)FLASH_ReadByte(MCU_EEPROM_START);
  249.      
  250.       System_Delay(200);
  251.      while (FLASH_GetFlagStatus( FLASH_FLAG_EOP) == SET);
  252.   }
  253.   
  254.    if((uFlash^uPassWord) == 0)
  255.     {
  256.         LCD_Cmd(ENABLE);
  257.         PassWordBrand.uStatus = VERIFY_SUCESS;
  258.         return 0;
  259.     }

  260.   return 1;
  261. }
  262. /*******************************************************************
  263. * 函數名:ReadPassWDMode
  264. * 輸  入:void
  265. * 輸  出:void
  266. * 功  能:讀密碼牌操作
  267. ********************************************************************/
  268. uint8_t ReadPassWDMode()
  269. {
  270.    if(BUTTON_DOWN(GPIOC,PASSWORD_BRAND))
  271.      {
  272.         ReadPasswdBrand();
  273.         if(PassWordBrand.uStatus != VERIFY_FAILD)
  274.         {
  275.           PassWordBrand.Start_Flick = SET;
  276.          if(System_AutoCheck())
  277.          {
  278.            MainMenu.uMenu = NO_OPERATION_MENU;
  279.            PassWordBrand.uStatus = VERIFY_FAILD;
  280.            PassWordBrand.Start_Flick = RESET;
  281.            InputDevice.uProcType = NONE_PROCESS;   //
  282.          }
  283.        }
  284.      }
  285.     else
  286.     {
  287.            /* 密碼牌插入不穩  */

  288.        Frame.uEvent = SYSTEM_TESTING_ERROR;     //提示密碼牌出錯
  289.        Frame.uValuer.uError = ERROR_E4;

  290.        LCD_ClearScreen();
  291.        InputDevice.uProcType = NONE_PROCESS;   //
  292.        return 1;
  293.     }

  294. return 0;
  295. }
  296. /*******************************************************************
  297. * 函數名:TestBoolMode
  298. * 輸  入:void
  299. * 輸  出:void
  300. * 功  能:讀密碼牌操作
  301. ********************************************************************/
  302. void TestBoolMode()
  303. {
  304.   if(BUTTON_DOWN(GPIOG,TESTING_BOTTLET))
  305.     {
  306.       my_test();
  307.       if(BottlerOpt.BottlerPriority == SET)
  308.         {
  309.           BottlerOpt.BottlerPriority = RESET;
  310.           LCD_ClearScreen();
  311.         }
  312.                
  313.     }
  314.   else
  315.     {

  316.       Frame.uEvent = SYSTEM_BLOTTER_OUT;

  317.       InputDevice.uPriority = NO_PRIORITY;
  318.       MainMenu.uMenu = NO_OPERATION_MENU;
  319.     }      
  320. }
  321. /*******************************************************************
  322. * 函數名:void System_AutoCheck()
  323. * 輸  入:void
  324. * 輸  出:void
  325. * 功  能:所有血糖值記錄為空
  326. ********************************************************************/
  327. uint8_t System_AutoCheck()
  328. {
  329.   static  uint8_t Calc = 0;
  330.      Display_DataValuer(DISPLAY_BIT_NUM_1,(uint8_t)Calc);
  331.      Display_DataValuer(DISPLAY_BIT_NUM_2,(uint8_t)Calc);
  332.      Display_DataValuer(DISPLAY_BIT_NUM_3,(uint8_t)Calc);
  333.      Display_DataValuer(DISPLAY_BIT_NUM_4,(uint8_t)Calc);
  334.      Display_DataValuer(DISPLAY_BIT_NUM_5,(uint8_t)Calc);
  335.      Display_DataValuer(DISPLAY_BIT_NUM_6,(uint8_t)Calc);
  336.      Display_DataValuer(DISPLAY_BIT_NUM_7,(uint8_t)Calc);
  337.      Display_DataValuer(DISPLAY_BIT_NUM_8,(uint8_t)Calc);
  338.      Display_DataValuer(DISPLAY_BIT_NUM_9,(uint8_t)Calc);
  339.      Display_DataValuer(DISPLAY_BIT_NUM_10,(uint8_t)Calc);
  340.      Display_DataValuer(DISPLAY_BIT_NUM_11,(uint8_t)Calc);
  341.      Display_DataValuer(DISPLAY_BIT_NUM_12,(uint8_t)Calc);
  342.      Display_DataValuer(DISPLAY_BIT_NUM_13,(uint8_t)Calc);
  343.      Display_DataValuer(DISPLAY_BIT_NUM_14,(uint8_t)Calc);
  344.      Display_DataValuer(DISPLAY_BIT_NUM_15,(uint8_t)Calc);
  345.      Display_DataValuer(DISPLAY_BIT_NUM_16,(uint8_t)Calc);  
  346.    
  347.   if(PassWordBrand.Flick_Calc == SET)
  348.   {
  349.      PassWordBrand.Flick_Calc = RESET;     
  350.      Calc++;  
  351.      
  352.    if(Calc == 0x0A)
  353.    {
  354.      Calc = 0x00;
  355.      PassWordBrand.DspCalc =0;
  356.      PassWordBrand.Start_Flick = RESET;
  357.      
  358.      return 1;
  359.    }
  360.       
  361.    
  362.    Screen_ClearPostion(DISPLAY_BIT_NUM_1);
  363.    Screen_ClearPostion(DISPLAY_BIT_NUM_2);
  364.    Screen_ClearPostion(DISPLAY_BIT_NUM_3);
  365.    Screen_ClearPostion(DISPLAY_BIT_NUM_4);
  366.    Screen_ClearPostion(DISPLAY_BIT_NUM_5);
  367.    Screen_ClearPostion(DISPLAY_BIT_NUM_6);
  368.    Screen_ClearPostion(DISPLAY_BIT_NUM_7);
  369.    Screen_ClearPostion(DISPLAY_BIT_NUM_8);
  370.    Screen_ClearPostion(DISPLAY_BIT_NUM_9);
  371.    Screen_ClearPostion(DISPLAY_BIT_NUM_10);
  372.    Screen_ClearPostion(DISPLAY_BIT_NUM_11);
  373.    Screen_ClearPostion(DISPLAY_BIT_NUM_12);
  374.    Screen_ClearPostion(DISPLAY_BIT_NUM_13);
  375.    Screen_ClearPostion(DISPLAY_BIT_NUM_14);
  376.    Screen_ClearPostion(DISPLAY_BIT_NUM_15);
  377.    Screen_ClearPostion(DISPLAY_BIT_NUM_16);
  378.   
  379.   }     
  380.      return 0;
  381. }
  382. /***************************************************************
  383. * 函數名:USART_Config()
  384. * 輸入  :void
  385. * 輸出  :void
  386. * 功能  :初始化串口
  387. ****************************************************************/
  388. static void USART_Config(void)
  389. {
  390.   /*             配置USART3外圍時鐘源                   */
  391.   CLK_PeripheralClockConfig(CLK_Peripheral_USART3, ENABLE);
  392.   /*             配置RX,TX引腳為上拉                    */
  393.   GPIO_ExternalPullUpConfig(GPIOG, GPIO_Pin_0|GPIO_Pin_1, ENABLE);
  394.   /*             初始化USART2,波特率,控制和校驗       */
  395.   USART_Init(USART3,(uint32_t)9600, USART_WordLength_8b, USART_StopBits_1,
  396.                    USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));

  397.   /*            采用中斷方式接收        */
  398. // enableInterrupts();
  399.   USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  400.   
  401.   /*             啟動USART3                            */
  402.   USART_Cmd(USART3, ENABLE);
  403. }
  404. /***************************************************************
  405. * 函數名:TIM4_Config
  406. * 輸入  :void
  407. * 輸出  :void
  408. * 功能  :初始化定時器
  409. ****************************************************************/
  410. static void TIM4_Config(void)
  411. {
  412.   CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE);
  413.   
  414.    TIM4_TimeBaseInit(TIM4_Prescaler_16384, 1);  //定時1S

  415.      /* Enable TIM4_IT clock */
  416.    TIM4_ITConfig(TIM4_IT_Update,ENABLE);
  417.      
  418.    TIM4_Cmd(ENABLE);
  419. }
  420. /***************************************************************
  421. * 函數名:LCD_Config
  422. * 輸入  :void
  423. * 輸出  :void
  424. * 功能  :初始化LCD顯示器
  425. ****************************************************************/
  426. static void LCD_RTCConfig(void)
  427. {
  428.   /* Enable LSE */
  429.   CLK_LSEConfig(CLK_LSE_ON);
  430.   /* Enable LCD clock */
  431.   CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);
  432.   CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);
  433.    /* Enable RTC clock */
  434.   CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
  435.   
  436. }
  437. /**************************************************************************************
  438. * 函數原型:void Read_RTCTimes()
  439. * 輸  入:void
  440. * 輸  出:void                    
  441. * 功  能:讀取時鐘
  442. * 描  述:
  443. ***************************************************************************************/
  444. void Read_RTCTimes()
  445. {
  446.   do{
  447.         while (RTC_WaitForSynchro() != SUCCESS);
  448.       
  449.         RTC_GetTime(RTC_Format_BIN, &RTC_TimeStr);
  450.         RTC_GetDate(RTC_Format_BIN, &RTC_DateStr);
  451.       
  452.         Frame.uValuer.uTimes.uFrame_Year = RTC_DateStr.RTC_Year;
  453.         Frame.uValuer.uTimes.uFrame_Month = (((uint8_t)RTC_DateStr.RTC_Month & 0xF0)>>4)*10+((uint8_t)RTC_DateStr.RTC_Month &0x0F);
  454.         Frame.uValuer.uTimes.uFrame_Date = RTC_DateStr.RTC_Date;
  455.           Frame.uValuer.uTimes.uFrame_Hours= RTC_TimeStr.RTC_Hours;
  456.         Frame.uValuer.uTimes.uFrame_Minutes = RTC_TimeStr.RTC_Minutes;

  457.      }
  458.     while(0);
  459.    
  460. }

  461. /****************************************************
  462. * 函數名:Time_Setting
  463. * 輸  入:void
  464. * 輸  出:uint8_t
  465. * 功  能:時間校驗檢查
  466. * 描  述:
  467. *****************************************************/
  468. uint8_t Time_Setting(void)
  469. {

  470.   RTC_DateStr.RTC_Year          = Frame.uValuer.uTimes.uFrame_Year;
  471.   RTC_DateStr.RTC_Month   = (RTC_Month_TypeDef)Frame.uValuer.uTimes.uFrame_Month;
  472.   RTC_DateStr.RTC_Date          =  Frame.uValuer.uTimes.uFrame_Date;
  473.   RTC_TimeStr.RTC_Hours    = Frame.uValuer.uTimes.uFrame_Hours;
  474.   RTC_TimeStr.RTC_Minutes  = Frame.uValuer.uTimes.uFrame_Minutes;
  475.   RTC_TimeStr.RTC_Seconds  = (uint8_t)DATA_EMPTY;

  476.   
  477.   RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);
  478.   RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);
  479.   
  480.    while (RTC_WaitForSynchro() != SUCCESS);
  481.       
  482.    RTC_GetTime(RTC_Format_BIN, &RTC_TimeStr);
  483.    RTC_GetDate(RTC_Format_BIN, &RTC_DateStr);
  484.    
  485.     if(RTC_DateStr.RTC_Year > 100)
  486.            return 0;
  487.           
  488.         if((((uint8_t)RTC_DateStr.RTC_Month>>4)&0x0F)*10 + ((uint8_t)RTC_DateStr.RTC_Month & 0x0F) > 12)
  489.             return 0;  

  490.         if(RTC_DateStr.RTC_Date > 31)
  491.            return 0;

  492.         if(RTC_TimeStr.RTC_Hours > 24)
  493.            return 0;

  494.         if( RTC_TimeStr.RTC_Minutes > 60)
  495.            return 0;
  496.           
  497. return 1;  
  498. }

  499. /******************************************************************************************
  500. * 函數原型:uint8_t Read_RecodeData(uint32_t paddr,uint8_t *uData)
  501. * 輸  入:uint8_t paddr               - 數據記錄首地址
  502.           uint8_t *uData              - 讀出數據緩存
  503. * 輸  出:uint8_t                     - 讀出數據情況,如果成功返回讀出數據記錄長度、
  504.                                         否則為0
  505. * 功  能:  實現一次數據記錄的讀取操作
  506. * 描  述:
  507. ******************************************************************************************/

  508. uint8_t Read_RecodeData(uint32_t paddr,uint8_t *uData)
  509. {
  510.   static uint8_t  upackge_index = 0x00;
  511.   static uint32_t pStart_addr;
  512.   uint8_t Empty_Calc = 0x00;
  513.   uint8_t uindex = 0x00;
  514.   uint8_t Package_Mum = PACKAGE_SEND_MAX;
  515.   
  516.   
  517.    if(upackge_index == DATA_EMPTY)
  518.      pStart_addr = paddr;
  519.    
  520.    if((uData[DATA_START]-upackge_index) == 0x01)                             //最后一次數據讀取判斷
  521.    {
  522.      if(Frame.uContrl.uFrame_LastLen !=DATA_EMPTY)                                                  //如果是不完整的發送包個數
  523.       Package_Mum = Frame.uContrl.uFrame_LastLen;
  524.      
  525.       Frame.uContrl.uFrame_Next = RESET;                                                           //清除后續包標志
  526.    }
  527.       
  528.   for(;uindex < Package_Mum*RECODE_SIGEN_LEN;uindex++)
  529.   {
  530.       if(DATA_EMPTY == *((PointerAttr uint8_t*)(uint16_t)pStart_addr+uindex))        //判斷數據記錄是否為空
  531.          Empty_Calc++;
  532.          
  533.        if(RECODE_SIGEN_LEN <= Empty_Calc )                                           //如果有一條記錄為空
  534.          return 0;
  535.       
  536.        if((uindex != 0) &&(uindex % RECODE_SIGEN_LEN ==0))
  537.          Empty_Calc = 0x00;        
  538.       
  539.       uData[FRAME_START+uindex] = *((PointerAttr uint8_t *)(uint16_t)pStart_addr+ uindex); // 讀取數據到緩沖buffer  
  540.   }  
  541.    upackge_index++;  
  542.   
  543.   uData[DATA_START+0x01] = upackge_index;                         //當前讀取次數
  544.   
  545.   uData[FRAME_START-0x01] = uindex / RECODE_SIGEN_LEN ;      //當前讀取包個數
  546.   
  547.   pStart_addr += (uint32_t)READ_BUFF_MAX;                    //保存讀取地址
  548.   
  549.   
  550.   if(Frame.uContrl.uFrame_Next == RESET)
  551.       upackge_index = 0x00;
  552.   
  553.   Frame.uContrl.uFrame_DataLen = uindex;
  554.   
  555.   return 1;
  556. }

  557. /********************************************************************************************
  558. * 函數原型:uint8_t Recode_Header(uint32_t paddr,uint8_t *uData)
  559. * 輸  入:uint8_t paddr                       - 記錄頭首地址  (數據包個數地址)
  560.           uint8_t *uData                      - 讀出數據緩存
  561. * 輸  出:uint8_t                             - 讀取情況,如果為空返回1 ,如果為0表示記錄不為空
  562. * 功  能:讀取數據記錄頭信息
  563. * 描  述:
  564. ********************************************************************************************/

  565. uint8_t Recode_Header(uint32_t paddr,uint8_t *uData)
  566. {
  567.   uint8_t Send_index = (uint8_t)(*((PointerAttr uint8_t*)((uint16_t)paddr))/PACKAGE_SEND_MAX);
  568.   
  569.   if(*((PointerAttr uint8_t *)((uint16_t)paddr)) == 0x00)
  570.       return 0;
  571.   
  572.   if((*((PointerAttr uint8_t*)((uint16_t)paddr))%PACKAGE_SEND_MAX))
  573.   {
  574.      Send_index++;
  575.      Frame.uContrl.uFrame_LastLen = (uint8_t)*((PointerAttr uint8_t*)((uint16_t)paddr))%PACKAGE_SEND_MAX;
  576.   }
  577.    
  578.    uData[DATA_START] = Send_index;
  579.    
  580.    if(uData[DATA_START] > 0x01)
  581.       Frame.uContrl.uFrame_Next = SET;
  582.       
  583.   return 1;
  584. }

  585. /********************************************************************************************
  586. * 函數原型:uint8_t Recode_Header(uint32_t paddr,uint8_t *uData)
  587. * 輸  入:uint8_t paddr                       - 記錄頭首地址  (數據包個數地址)
  588.           uint8_t *uData                      - 讀出數據緩存
  589. * 輸  出:uint8_t                             - 讀取情況,如果為空返回1 ,如果為0表示記錄不為空
  590. * 功  能:讀取數據記錄頭信息
  591. * 描  述:
  592. ********************************************************************************************/

  593. void System_EventProcess()
  594. {
  595.         
  596.      /*    被動發送測試
  597.       *****************************************************************
  598.       */  
  599.          /* 測試連接與讀取ID信息 !*/
  600.          if(Frame.uAction.uEvent == READ_STATE)
  601.          {
  602.            Frame.uAction.uEvent = INVALID_ACTION;
  603.            /* 讀取時間 */
  604.            Read_RTCTimes();
  605.            Frame.uAction.uResult = ACTION_SUCCESS;
  606.            Frame.uEvent = READSYS_STATE_FINSHED;
  607.          }
  608.          /* 測試清除數據 ! */
  609.          if(Frame.uAction.uEvent == ERASE_RECODE)
  610.          {
  611.            Frame.uAction.uEvent = INVALID_ACTION;
  612.            
  613.            /* .........進行清除操作........... */
  614.            
  615.            Frame.uAction.uResult = ACTION_SUCCESS;
  616.            Frame.uEvent = ERASE_RECODE_FINSHED;
  617.          }
  618.          /* 測試設置時間 ! */
  619.          if(Frame.uAction.uEvent == SETING_TIME)
  620.          {
  621.            Frame.uAction.uEvent = INVALID_ACTION;
  622.            
  623.            if(Time_Setting())   
  624.            Frame.uAction.uResult = ACTION_SUCCESS;
  625.            
  626.            Frame.uEvent = SETING_TIME_FINSHED;
  627.          }     
  628.           /* 讀取血糖測試結果 !*/
  629.          if(Frame.uAction.uEvent == READ_SESULT)
  630.          {
  631.            Frame.uAction.uEvent = INVALID_ACTION;
  632.            
  633.            /* 測試模式讀取血糖測試結果 */
  634.            Frame.uValuer.uTestMode =TESTING_MODE;
  635.            Frame.uValuer.uBool_Result = 0x12;
  636.             /* 測試模式讀取時間 */
  637.            Read_RTCTimes();
  638.            
  639.            Frame.uAction.uResult = ACTION_SUCCESS;
  640.            
  641.            Frame.uEvent = TESTING_RESULT_FINSHED;
  642.          }
  643.         
  644.         
  645.          /* 讀取血糖記錄結果 !*/
  646.          if(Frame.uAction.uEvent == READ_RECODE)
  647.          {
  648.            Frame.uAction.uEvent = INVALID_ACTION;
  649.            
  650.          if(Recode_Header((uint32_t)0x101F,Frame.DataBuffer))           //讀取數據存儲信息頭,并填充到幀緩存數據buffer的首字節
  651.          {
  652.             switch(Frame.uAction.uValuer.uRecodeTyple)
  653.             {
  654.             case RECODE_RECENT_VALUER:
  655.               {

  656.                  if(Read_RecodeData((uint32_t)0x1001,Frame.DataBuffer)) //讀取數據存儲信息,并從幀緩存數據buffer的第4個字節開始填充buffer
  657.                  {
  658.                    Frame.uContrl.uFrame_PackageState = FREE;      
  659.                    Frame.uAction.uResult = ACTION_SUCCESS;
  660.                    Frame.uEvent = READ_RECODE_FINSHED;
  661.                  }
  662.               }
  663.               break;
  664.             case RECODE_EMPTY_VALUER:
  665.               {
  666.   
  667.                 if(Read_RecodeData((uint32_t)0x1136,Frame.DataBuffer))
  668.                 {
  669.                   Frame.uContrl.uFrame_PackageState = FREE;
  670.                   Frame.uAction.uResult = ACTION_SUCCESS;
  671.                   Frame.uEvent = READ_RECODE_FINSHED;
  672.                 }
  673.               }
  674.               break;
  675.             case RECODE_NOEMPTY_VALUER :
  676.               {
  677.                
  678.                  if(Read_RecodeData((uint32_t)0x1262,Frame.DataBuffer))
  679.                  {
  680.                    Frame.uContrl.uFrame_PackageState = FREE;
  681.                    Frame.uAction.uResult = ACTION_SUCCESS;
  682.                    Frame.uEvent = READ_RECODE_FINSHED;
  683.                  }
  684.               }
  685.               break;
  686.             default:      
  687.               break;
  688.             }
  689.            
  690.            }           
  691.          
  692.          }
  693.      /*  
  694.       ********************************************************************
  695.       */  
  696. }

  697. /********************************************************************************************
  698. * 函數原型:uint8_t Recode_Header(uint32_t paddr,uint8_t *uData)
  699. * 輸  入:uint8_t paddr                       - 記錄頭首地址  (數據包個數地址)
  700.           uint8_t *uData                      - 讀出數據緩存
  701. * 輸  出:uint8_t                             - 讀取情況,如果為空返回1 ,如果為0表示記錄不為空
  702. * 功  能:讀取數據記錄頭信息
  703. * 描  述:
  704. ********************************************************************************************/
  705. void System_Delay(uint8_t nCount)
  706. {
  707.    uint8_t base = 0xff;
  708.   while (nCount --)
  709.      while(base--);
  710. }
復制代碼



STM8L的智能手持血糖監測設備的源碼.rar

382.96 KB, 下載次數: 50, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:130030 發表于 2016-7-11 15:56 來自手機 | 顯示全部樓層
學習學習,謝謝了
回復

使用道具 舉報

ID:414973 發表于 2018-10-24 22:59 | 顯示全部樓層
求做血糖儀的傳感器是型號的,有購買的渠道嗎
回復

使用道具 舉報

ID:414973 發表于 2018-10-24 23:00 | 顯示全部樓層
求血糖儀的傳感器型號,有購買的渠道嗎
回復

使用道具 舉報

ID:414973 發表于 2018-10-24 23:01 | 顯示全部樓層
求血糖儀的傳感器型號,有購買的渠道嗎
回復

使用道具 舉報

ID:47634 發表于 2018-10-25 08:40 | 顯示全部樓層
很好的應用實例,感謝樓主的好資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一二三 | 人人做人人澡人人爽欧美 | 欧美综合久久久 | 97精品超碰一区二区三区 | 国产精品久久久久久久岛一牛影视 | 国产在线不卡 | 91porn成人精品 | 免费一区二区三区 | 日韩三级 | 91xxx在线观看 | 超碰超碰 | 日韩网站在线观看 | 精品国产一区二区三区观看不卡 | 午夜日韩| 欧美三级电影在线播放 | 九九热精品视频在线观看 | 日韩精品视频一区二区三区 | 久久夜视频 | 一区二区三区高清 | 日韩一区二区在线播放 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | www操操| 五月婷婷色 | 天堂视频一区 | 91视频免费黄 | 中文字幕 国产 | 亚洲精品国产第一综合99久久 | a网站在线观看 | www.蜜桃av | 中文字幕高清 | a毛片视频网站 | 成人在线观看免费 | 久久精品一区二区三区四区 | 欧美手机在线 | 小h片免费观看久久久久 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 欧美日韩一区二区在线播放 | 久草久草久草 | 成人一区二 | 天堂亚洲网| 国产91视频播放 |