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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15188|回復: 11
收起左側

開源,目前最發燒的邏輯筆 號稱最小萬用表

  [復制鏈接]
ID:85764 發表于 2015-7-18 15:04 | 顯示全部樓層 |閱讀模式
前段時間自制了一個邏輯筆自己玩.自我感覺良好.   后來在原有硬件電路上擴充軟件功能就有了現在的版本  

到目前為止先發布這一個版本吧,   

目前功能有:1 直流電壓測量,   2 通斷測量,  3 二極管測量,  4 方波輸出,

(邏輯判斷 能測量大多數流行VCC電壓電路. 如 : 5V, 4.5V, 3.3V, 2.5V,真正能作為調試工具使用)

供電電壓:  5V  可以使用USB.  也可以可以使用有手動開關的移動電源供電
測量是共地的, 有9個發光管顯示狀態

看圖:
152920jlr7m5c4nc7745pr.jpg



152924y13279ggloncgrr1.jpg



152927hwzscbe6czlb18cj.jpg



152928t9jyczxtxpre65yt.jpg



152930toby8obgke7zezyi.jpg




原理圖:
153037x6xtjsdzjxx9sbjg.jpg.thumb.jpg


說明書:

優酷地址:
http://i.youku.com/u/UNDU0OTU4MDUy
軟件,PCB, 文檔:  使用最自由的開源許可 MIT,  歡迎復制.改進....  轉帖需要站長同意!
邏輯筆.rar (1.13 MB, 下載次數: 128)
回復

使用道具 舉報

ID:85764 發表于 2015-7-18 15:04 | 顯示全部樓層
  1. /*---------------------------------------------------------------------------------------------
  2. Projest:  電壓邏輯筆
  3. Author: Wang Jiati [王家體]
  4. Note:

  5. 編譯器版本: HOLTEK C V3.31.  09/05/2014發布

  6. Product    Name : ____________
  7. MCU        Name : HT66F04
  8. File       Name : D:\WANGJIATI\DESKTOP\邏輯筆\電壓邏輯筆\電壓邏輯筆.MTP
  9. HT-IDE     Ver. : V7.85
  10. Compiler   Ver. : HGASM 020
  11. Linker     Ver. : V8.6
  12. CFG        Ver. : V4.3
  13. ------------------------------------------------------------------------------------------------
  14. MTP File Checksum:[ DA00H ]
  15. Program Checksum:[ 76BEH ]
  16. Program+Option Checksum:[ 7771H ]
  17. Program+Option+Data Checksum:[ B731H ]
  18. ------------------------------------------------------------------------------------------------
  19. LVR Function                                                     Enable
  20. LVR Voltage Selection                                            2.55V
  21. High Speed/Low Speed System Oscillator Selection - fosc          HIRC+LIRC
  22. fsub clock source                                                LIRC
  23. HIRC frequency selection                                         8MHz @ Vdd=5V
  24. PTC clock source fptc                                            LIRC
  25. XTAL OSC(1~24MHZ) build-in R enable                              enable
  26. WDT clock Selection -fs                                          fsub
  27. Watchdog Timer Function                                          Enable
  28. CLRWDT Instructions Selection                                    1 instruction
  29. PA7/RES Pin Options                                              I/O pin
  30. ------------------------------------------------------------------------------------------------

  31. ------------------------------------------------------------------------------------------------*/

  32. /*--------------------------------------------------------------------------------------*/
  33. /*History   2014-9-22  V1.1  
  34. ----------------------------------------------------------------------------------------*/

  35. #include "HT66F04.h"
  36. /*----------------------------------------------------------------------------------------
  37.    宏定義
  38. ----------------------------------------------------------------------------------------*/
  39. #define  FREQ  8000000           //時鐘速度

  40. #define  LED_9_PIN_H    _pa6
  41. #define  LED_9_PIN_CON  _pac6
  42. #define  LED_8_PIN_L    _pa6
  43. #define  LED_8_PIN_CON  _pac6
  44. #define  LED_7_PIN_H    _pa5
  45. #define  LED_7_PIN_CON  _pac5
  46. #define  LED_6_PIN_L    _pa5
  47. #define  LED_6_PIN_CON  _pac5
  48. #define  LED_5_PIN_H    _pa4
  49. #define  LED_5_PIN_CON  _pac4
  50. #define  LED_4_PIN_L    _pa4
  51. #define  LED_4_PIN_CON  _pac4
  52. #define  LED_3_PIN_H    _pa3
  53. #define  LED_3_PIN_CON  _pac3
  54. #define  LED_2_PIN_L    _pa3
  55. #define  LED_2_PIN_CON  _pac3
  56. #define  LED_1_PIN_H    _pa1
  57. #define  LED_1_PIN_CON  _pac1

  58. #define  Constant_PIN   _pa2

  59. #define  ADC_COUNTER    8          //中位值采樣次數.ADC緩沖去長度
  60. #define  KEY_R_T0       40         //按鍵長按識別常熟

  61. #define  EE_first   0x01           //第一次上電識別,初始化
  62. #define  EE_vdd     0x08           //量程設置存儲位置
  63. #define  EE_offset  EE_vdd+1       //偏置存儲位置
  64. #define  EE_Gain    EE_offset+2    //增益系數存儲位置

  65. /* BIT/BYTE MANIPULATION ---*/
  66. #define  FALSE 0
  67. #define  TRUE 1
  68. #define  MAKE8(var, offset)        (((var >> (offset*8)) & 0xff)
  69. #define  MAKE16(varhigh,varlow)    (unsigned int)((varhigh&0xff)*0x100 + (varlow&0xff))
  70. #define  WORD_LO(xxx)  ((unsigned char) ((unsigned int)(xxx) & 255))
  71. #define  WORD_HI(xxx)  ((unsigned char) ((unsigned int)(xxx) >> 8))
  72. /*----------------------------------------------------------------------------------------
  73.    全局變量
  74. ----------------------------------------------------------------------------------------*/

  75. static volatile unsigned char work_mode;                               //工作模式
  76. static volatile unsigned char KeyTime;                  //記錄按鍵按下時長
  77. static volatile unsigned char power_time;               //上電時長
  78. static volatile unsigned int cycle_h_now;               //當前輸出頻率信號,高位
  79. static volatile unsigned int cycle_l;                   //設置頻率輸出信號
  80. static volatile unsigned int cycle_h;
  81. static volatile unsigned int vdd;                       //量程電壓, 5V*8192 =40960
  82. static volatile unsigned int adc;                       //
  83. static volatile float voltage;                                           //采集來的電壓

  84. static unsigned int ADC_buffer[ADC_COUNTER];                           //ADC緩沖
  85. static unsigned char vdd_step;                 //

  86. union {
  87.         unsigned char  data[2];
  88.         volatile unsigned int  O;                           //零點偏置
  89. } Offset;

  90. union {
  91.         unsigned char  data[3];
  92.         volatile float G;                                  //float 24bit
  93. } Gain;    //增益系數

  94. typedef struct {
  95.         unsigned  int  * volatile buffer;                   //緩沖區指針
  96.         unsigned  char counter;                   //隊列計數器
  97. } queue;
  98. volatile queue Queue_adc;
  99. typedef struct {
  100.         unsigned char  _LED1:1;
  101.         unsigned char  _LED2:1;
  102.         unsigned char  _LED3:1;
  103.         unsigned char  _LED4:1;
  104.         unsigned char  _LED5:1;
  105.         unsigned char  _LED6:1;
  106.         unsigned char  _LED7:1;
  107.         unsigned char  _LED8:1;
  108.         unsigned char  _LED9:1;
  109.         unsigned char  :6;
  110.         unsigned char  _flag:1;
  111. } _display_bits;
  112. union {
  113.         _display_bits bits;
  114.         volatile unsigned int  data;
  115. } display_data;
  116. #define  LED9  display_data.bits._LED9
  117. #define  LED8  display_data.bits._LED8
  118. #define  LED7  display_data.bits._LED7
  119. #define  LED6  display_data.bits._LED6
  120. #define  LED5  display_data.bits._LED5
  121. #define  LED4  display_data.bits._LED4
  122. #define  LED3  display_data.bits._LED3
  123. #define  LED2  display_data.bits._LED2
  124. #define  LED1  display_data.bits._LED1
  125. #define  update_display_flag  display_data.bits._flag

  126. typedef struct {
  127.         unsigned char  _State0:3;
  128.         unsigned char  _State1:3;
  129.         unsigned char  _key:1;
  130.         unsigned char  _disp:1;
  131.         unsigned char  _time:4;
  132.         unsigned char  _scan:1;
  133.         unsigned char  _pow:1;
  134.         unsigned char  _flag:1;
  135.         unsigned char  _out:1;
  136. } _step_bits;

  137. union {
  138.         _step_bits bits;
  139.         volatile unsigned int  data;
  140. } step_data;

  141. #define  display_flag  step_data.bits._disp
  142. #define  pwoer_flag    step_data.bits._pow
  143. #define  output_flag   step_data.bits._out
  144. #define  KeyState      step_data.bits._State1
  145. #define  KeySave       step_data.bits._flag
  146. #define  key_input     step_data.bits._key
  147. #define  ferq_step     step_data.bits._State0
  148. #define  update_time   step_data.bits._time
  149. #define  key_scan      step_data.bits._scan  


  150. const unsigned int vdd_date[6] = {20480,24576,27033,29491,36044,40960};   //5V*8192 =40960
  151. //                                  2.5,  3,   3.3,  3.6,  4.4,  5

  152. const unsigned int freq_date[5] = {31250,3125,1250,2500,1250};
  153. //                                   2,   20,  50,  100, 200};

  154. /*----------------------------------------------------------------------------------------
  155.    原型聲明
  156. ----------------------------------------------------------------------------------------*/
  157. unsigned int filter(unsigned char size, unsigned int buff[] );
  158. unsigned char queue_in(unsigned int* new_data, volatile queue* me);

  159. void setup_freq(unsigned char step);
  160. void DataEE_Read(unsigned char addr, unsigned char * _ram, unsigned char bytes);
  161. void DataEE_Write(unsigned char addr, unsigned char * _ram, unsigned char bytes);

  162. /*----------------------------------------------------------------------------------------
  163. Purpose:  time_0  ISR
  164. ----------------------------------------------------------------------------------------*/
  165. DEFINE_ISR(MF_0F, 0x0C){              //頻率信號中斷服務
  166.         if(_t0af == 1){
  167.                 _t0af = 0;

  168.                 if (output_flag ==1){
  169.                     output_flag = 0;
  170.                 Constant_PIN ^= 0x01;
  171.             }
  172.                  if (cycle_h_now >0){
  173.                          cycle_h_now--;
  174.                          _tm0al =255;
  175.                     _tm0ah = 3;
  176.                 }else{
  177.                     output_flag = 1;
  178.                     cycle_h_now = cycle_h;
  179.                     _tm0al = WORD_LO(cycle_l);
  180.                     _tm0ah = WORD_HI(cycle_l);               
  181.                 }
  182.         }
  183.         _mf0f = 0;
  184. }
  185. /*----------------------------------------------------------------------------------------
  186. Purpose:  time_base_1  ISR
  187. ----------------------------------------------------------------------------------------*/
  188. DEFINE_ISR(time_base_1_ISR, 0x20){      //時基中斷TB1,每0.004096 秒中斷
  189.         unsigned int temp;
  190.         /*--讀ADC----*/
  191.         _adoff = 0;
  192.         _start = 0;
  193.         _start = 1;
  194.         _start = 0;
  195.         while(_eocb == 1){
  196.                 GCC_CLRWDT();
  197.         }
  198.     temp = MAKE16(_adrh,_adrl);       
  199.         _adoff = 1;
  200.        
  201.         /*--存入ADC緩存,中位值濾波,折算電壓----*/
  202.         if(queue_in( &temp, &Queue_adc) == 1 )
  203.         {
  204.                 adc = filter( ADC_COUNTER, Queue_adc.buffer);
  205.                 if(adc > Offset.O){
  206.                         temp = adc - Offset.O;
  207.                 }else{
  208.                         temp = 0;
  209.                 }               
  210.                 voltage =  Gain.G * (float)(temp);
  211.         }       
  212. }
  213. /*----------------------------------------------------------------------------------------
  214. Purpose:  time_base_0  ISR
  215. ----------------------------------------------------------------------------------------*/
  216. DEFINE_ISR(time_base_0_ISR, 0x1c){     //時基中斷TB0,每0.008192 秒中斷
  217.         unsigned char temp;
  218.         unsigned int temp_int;       
  219.         float  temp_float2;
  220.        
  221.         //if(work_mode ==3){
  222.         //        _pac = 0xFA;
  223.         //}else{
  224.                 _pac = 0xFB;
  225.         //}
  226.         if(display_flag == 1){      //屏服務
  227.                 display_flag = 0;
  228.                 if(LED9 == 1){
  229.                         LED_9_PIN_CON = 0;
  230.                         LED_9_PIN_H = 1;
  231.                 }
  232.                 if(LED7 == 1){
  233.                         LED_7_PIN_CON = 0;
  234.                         LED_7_PIN_H = 1;
  235.                 }       
  236.                 if(LED5 == 1){
  237.                         LED_5_PIN_CON = 0;
  238.                         LED_5_PIN_H = 1;
  239.                 }
  240.                 if(LED3 == 1){
  241.                         LED_3_PIN_CON = 0;
  242.                         LED_3_PIN_H = 1;
  243.                 }               
  244.                 if(LED1 == 1){
  245.                         LED_1_PIN_CON = 0;
  246.                         LED_1_PIN_H = 1;
  247.                 }                               
  248.         }else{
  249.                 display_flag = 1;
  250.                 if(LED8 == 1){
  251.                         LED_8_PIN_CON = 0;
  252.                         LED_8_PIN_L = 0;               
  253.                 }
  254.                 if(LED6 == 1){
  255.                         LED_6_PIN_CON = 0;
  256.                         LED_6_PIN_L = 0;
  257.                 }
  258.                 if(LED4 == 1){
  259.                         LED_4_PIN_CON = 0;
  260.                         LED_4_PIN_L = 0;
  261.                 }       
  262.                 if(LED2 == 1){
  263.                         LED_2_PIN_CON = 0;
  264.                         LED_2_PIN_L = 0;
  265.                 }       
  266.         }
  267.        
  268.         if(++update_time == 6){          //6*8.192 = 49.152mS

  269.                 if(pwoer_flag == 1){         //上電計時,用于檢測上電按鍵
  270.                         if(++power_time >=43){
  271.                                 pwoer_flag = 0;
  272.                         }
  273.                 }
  274.                 update_time = 0;
  275.                 key_scan = 1;
  276.                
  277.                 /*--刷顯存----*/
  278.                 if(update_display_flag != 1){       
  279.                         switch(work_mode){
  280.                                 case 0:{   //電壓測量
  281.                                                 display_data.data &= 0XFE00;
  282.                                                 temp_int = 0x0001;
  283.                                                 for(temp=11; temp>=3; temp--){
  284.                                                        
  285.                                                         temp_float2 = ((float)(vdd)/8192)*((float)(temp)/10);
  286.                                                        
  287.                                                         if(voltage >= temp_float2){
  288.                                                                 temp_int <<=  (temp-3);
  289.                                                                 display_data.data |= temp_int;
  290.                                                                 break;
  291.                                                         }else{
  292.                                                                 display_data.data |= 0;
  293.                                                         }
  294.                                                 }
  295.                             }break;
  296.                                 case 1:{   //通斷
  297.                                                 display_data.data &=0xFE07;
  298.                                                 if(_cout ==1){
  299.                                                         display_data.data |= 0x01F0;
  300.                                                 }
  301.                             }break;         
  302.                                 case 2:{   //二極管
  303.                                                 display_data.data &=0xFE07;               
  304.                                                 temp_int = 0x0008;
  305.        
  306.                                                 for(temp=10; temp>=3; temp--){
  307.                                                         temp_float2 = (float)(temp)/10;
  308.                                                         if(temp==3){
  309.                                                                 display_data.data |= 0x01F0;
  310.                                                                 break;
  311.                                                         }
  312.                                                         else if(voltage >= temp_float2){
  313.                                                                 temp_int <<=  (temp-4);
  314.                                                                 display_data.data |= temp_int;
  315.                                                                 break;
  316.                                                         }else{
  317.                                                                 display_data.data |= 0;
  318.                                                         }
  319.                                                 }
  320.        
  321.        
  322.                             }break;
  323.                                 case 5:{   //校準偏置
  324.                                                 display_data.data &= 0XFE0A;
  325.                                                 if(adc > 40){
  326.                                                         LED9 = 1;
  327.                                                 }else if(adc > 20){
  328.                                                         LED8 = 1;
  329.                                                 }else if(adc > 10){
  330.                                                         LED7 = 1;
  331.                                                 }
  332.                                     }break;
  333.                                 case 6:{   //校準增益
  334.                                                 display_data.data &= 0XFE1A;
  335.                                                 if(adc > 3400){
  336.                                                         LED9 = 1;
  337.                                                 }else if(adc > 3000){
  338.                                                         LED8 = 1;
  339.                                                 }else if(adc > 2700){
  340.                                                         LED7 = 1;
  341.                                                 }
  342.                                     }break;                                                                                                                     
  343.                                 default: break;
  344.                         }               
  345.                 }                       
  346.         }       
  347. }

  348. void DataEE_Read(unsigned char addr, unsigned char * _ram, unsigned char bytes) {
  349.         unsigned char i;
  350.        
  351.         for (i = 0; i < bytes; i++, _ram++, addr++){
  352.             _eea = addr;  //讀地址
  353.             _rden = 1;    //讀使能
  354.             _rd = 1;      //開始讀
  355.             //GCC_NOP();
  356.             while(_rd){   //等待完成
  357.                         GCC_CLRWDT();                   
  358.             }
  359.         *_ram =        _eed;
  360.         _rden = 0;    //清理
  361.         }
  362. }

  363. void DataEE_Write(unsigned char addr, unsigned char * _ram, unsigned char bytes) {
  364.         unsigned char i;
  365.                
  366.         for (i = 0; i < bytes; i++, _ram++, addr++){
  367.             _eea = addr;
  368.             _eed = *_ram;
  369.             _wren = 1;
  370.             _wr = 1;
  371.             //GCC_NOP();
  372.             while(_wr){
  373.                         GCC_CLRWDT();                            
  374.             }
  375.         _wren = 0;       
  376.         }
  377. }
  378. /*----------------------------------------------------------------------------------------
  379. Purpose: 頻率轉換 0.964HZ-250KHZ  @ 8M時鐘
  380. ----------------------------------------------------------------------------------------*/
  381. void setup_freq(unsigned char step){
  382.     unsigned int temp;
  383.   
  384.           if (step <= 2)
  385.     {
  386.                 //temp = (FREQ/64/2) / freq_temp;
  387.                 _tm0c0 = 0b00111000;  //fH/16
  388.     }else{
  389.                 //temp = (FREQ/16/2) / freq_temp;
  390.                 _tm0c0 = 0b00101000;  //fH/16   
  391.     }
  392.     temp = freq_date[step];
  393.     _tm0c1 = 0b11000001;  //TM0比較器A匹配
  394.         cycle_l = temp & 1023;
  395.         cycle_h = temp >> 10;
  396.     _tm0al =255;
  397.     _tm0ah = 3;
  398.     cycle_h_now = cycle_h;
  399.     _t0on = 0;                                               
  400.         _t0on = 1;
  401.     output_flag = 0;
  402. }

  403. /*----------------------------------------------------------------------------------------
  404. Purpose:        無符號int型數組 中位值濾波 排序采用選擇排序
  405. ----------------------------------------------------------------------------------------*/
  406. unsigned int filter(unsigned char size, unsigned int buff[] ){  //, unsigned char sensitive)
  407.     unsigned int temp;
  408.         unsigned char i,j,min;
  409.        
  410.     for( i=0;i<size;i++)
  411.     {
  412.       min=i;//先假設最小下標為i
  413.       
  414.       for(j=i+1;j<size;j++)
  415.          if(buff[j]<buff[min])  //對i之后的數進行掃描將最小的數賦予min
  416.             min=j;
  417.       if(min!=i)                //判斷min與i是否相等,若=則說明原假設正確反之交換數值
  418.       {
  419.         temp=buff[i];
  420.         buff[i]= buff[min];
  421.         buff[min]=temp;
  422.       }
  423.     }       
  424.        
  425.         return  buff[size/2];
  426.        
  427. }

  428. /*----------------------------------------------------------------------------------------
  429. Purpose:        存入線性隊列
  430. ----------------------------------------------------------------------------------------*/
  431. unsigned char queue_in(unsigned int* new_data, volatile queue* me){
  432.         me->buffer[me->counter] = *new_data;
  433.         me->counter ++;
  434.         if( me->counter >=  ADC_COUNTER)//me->size)
  435.         {
  436.                 me->counter = 0;
  437.                 return 1;
  438.         }
  439.         else
  440.         {
  441.                 return 0;
  442.         }
  443. }



  444. /*----------------------------------------------------------------------------------------
  445. Purpose: main
  446. ----------------------------------------------------------------------------------------*/
  447. void main(){
  448.         unsigned char temp;
  449.         unsigned int temp_int;       

  450.         //adc
  451.         _adcr0 = 0b00010000;
  452.         _adcr1 = 0b00000100;
  453.         _acerl = 0b00000001;

  454.         //TB
  455.         _tbc = 0b11000110;
  456.         _pac = 0xFB;   //pa2 輸出模式
  457.         _cpc = 0b00101001;  //比較器設置       

  458.         _pac2 = 0;     
  459.         Constant_PIN = 1;     //禁止恒流輸出

  460.         Queue_adc.counter = 0;
  461.            Queue_adc.buffer = ADC_buffer;

  462.            DataEE_Read(EE_first, &temp, sizeof(temp));
  463.            if(temp != 0xA5){   //第一次上電?
  464.                    vdd_step = 5;
  465.                    Offset.O = 0;
  466.                    Gain.G = 0.0016118633139910;
  467.                    temp = 0xA5;
  468.                    DataEE_Write(EE_first, &temp, sizeof(temp));
  469.                    DataEE_Write(EE_vdd, &vdd_step, sizeof(vdd_step));
  470.             DataEE_Write(EE_offset, &Offset.data[0], sizeof(Offset.O));
  471.             DataEE_Write(EE_Gain, &Gain.data[0], sizeof(Gain.G));                           

  472.            }else{
  473.                    DataEE_Read(EE_vdd, &vdd_step, sizeof(vdd_step));
  474.             DataEE_Read(EE_offset, &Offset.data[0], sizeof(Offset.O));
  475.             DataEE_Read(EE_Gain, &Gain.data[0], sizeof(Gain.G));          
  476.            }
  477.         vdd = vdd_date[vdd_step];
  478.         pwoer_flag = 1;
  479.        
  480.         _wdtc = 0b11110000;  //放狗,看門
  481.         _tb1e = TRUE;        //開TB1中斷,測量電壓
  482.         _tb0e = TRUE;        //開TB0中斷,顯示,按鍵,刷數
  483.         _emi = TRUE;
  484.        
  485.         while(1){
  486.                 if(key_scan ==1){
  487.                         key_scan = 0;
  488.                         /*--按鍵掃描----*/
  489.                         temp = 0;
  490.                     key_input = _pa7;       //讀取按鍵
  491.                         switch(KeyState){
  492.                                 case 0:{
  493.                                                  if( key_input == 0 ){                            //判斷是否有按鍵操作
  494.                                              KeySave = key_input;                                                //有,暫存當前按鍵
  495.                                              KeyState =1;
  496.                                      }
  497.                                 }break;
  498.                                 case 1:{
  499.                                                 if( key_input == KeySave  ){                                //按鍵抖動,
  500.                                             KeyState = 2;
  501.                                             KeyTime = KEY_R_T0 ;                                                //第一次按鍵長按反應時間
  502.                                     }else
  503.                                             KeyState = 0;                                                                
  504.                                 }break;  
  505.                                 case 2:{
  506.                                                 if( key_input == 0  ){
  507.                                                         if(--KeyTime <= 1 ){                                        //長按?
  508.                                                                 temp = 2;
  509.                                                                 KeyState = 3;       
  510.                                                         }                                               
  511.                                     }else{                                                                                               
  512.                                         temp =1;
  513.                                         KeyState = 0;
  514.                                     }
  515.                                 }break;
  516.                                 case 3:{
  517.                                                 if( key_input == 1  ){                                        //檢查按鍵彈起       
  518.                                                         KeyState = 0;
  519.                                     }
  520.                                 }break;                        
  521.        
  522.                                 default: break;
  523.                         }
  524.                         if(temp !=0){
  525.                                 update_display_flag = 1;
  526.                
  527.                                 /*--短按操作----*/
  528.                                 if(        temp ==1){         
  529.                                         if(work_mode ==3){
  530.                                                 ++ferq_step;
  531.                                                 if( ferq_step>4){
  532.                                                         _mf0e = FALSE;
  533.                                                         _mf0f = FALSE;
  534.                                                         _t0ae = FALSE;  //禁止頻率輸出
  535.                                                         _t0af = FALSE;
  536.                                                         ferq_step = 0;
  537.                                                         work_mode = 0;
  538.                                                         Constant_PIN = 1;
  539.                                                 }                               
  540.                                         }else if(work_mode ==4){
  541.                                                 ++vdd_step;
  542.                                                 if( vdd_step>5){
  543.                                                         vdd_step = 0;
  544.                                                 }                       
  545.                                         }else if(work_mode ==7){
  546.                                                         work_mode = 0;
  547.        
  548.                                                         DataEE_Write(EE_offset, &Offset.data[0], sizeof(Offset.O));
  549.                                                     DataEE_Write(EE_Gain, &Gain.data[0], sizeof(Gain.G));
  550.                
  551.                                         }else{       
  552.                                                 ++work_mode;
  553.                                         }
  554.                                        
  555.                                 }
  556.                                 /*--長按操作----*/
  557.                                 else if(temp ==2) {
  558.                
  559.                                         if(pwoer_flag == 1){
  560.                                                 work_mode = 5;
  561.                                                 pwoer_flag = 0;
  562.                                         }else if(work_mode == 0){
  563.                                                 _tb1e = FALSE;
  564.                                                 work_mode = 4;
  565.                                         }else if(work_mode == 4){
  566.                                                 vdd = vdd_date[vdd_step];
  567.                                                 work_mode = 0;
  568.                                                 DataEE_Write(EE_vdd, &vdd_step, sizeof(vdd_step));
  569.                                         }       
  570.                                 }                       
  571.                                 /*--更新工作模式----*/
  572.                                 switch(work_mode){     
  573.                                         case 0:{   //電壓測量
  574.                                                         display_data.data = 0;
  575.                                                         _acerl = 1;
  576.                                                         Queue_adc.counter = 0;
  577.                                                         voltage = 0;
  578.                                                         _tb1f = FALSE;
  579.                                                         _tb1e = TRUE;  //開TB0中斷
  580.                                     }break;
  581.                                         case 1:{   //通斷
  582.                                                         LED1 = 0;
  583.                                                         LED2 = 1;
  584.                                                         LED3 = 1;                                       
  585.                                                         _tb1e = FALSE;
  586.                                                         _tb1f = FALSE;
  587.                                                        
  588.                                                         _cpc = 0b11101001;
  589.                                                         Constant_PIN = 0;
  590.                                     }break;         
  591.                                         case 2:{   //二極管
  592.                                                         LED1 = 1;
  593.                                                         LED2 = 0;
  594.                                                         LED3 = 1;
  595.                                        
  596.                                                         _cpc = 0b00101001;  //比較器設置
  597.                                                         Constant_PIN = 0;
  598.                                                        
  599.                                                         _acerl = 1;
  600.                                                         Queue_adc.counter = 0;
  601.                                                         voltage = 0;                                                       
  602.                                                         _tb1f = FALSE;
  603.                                                         _tb1e = TRUE;           //開TB0中斷                                                                               
  604.                                     }break;
  605.                                        
  606.                                         case 3:{   //頻率輸出(HZ)
  607.                                                         _tb1e = FALSE;
  608.                                                         _tb1f = FALSE;
  609.                                                         _acerl = 0;
  610.                                                         _pa0 = 0;
  611.                        
  612.                                                         display_data.data &= 0XFE00;
  613.                                                         LED1 = 1;
  614.                                                         LED2 = 1;
  615.                                                         LED3 = 1;               
  616.                                                         temp_int = 0x0010;
  617.                                                         temp_int <<=  ferq_step;
  618.                                                         display_data.data |= temp_int;
  619.                                                        
  620.                                                         setup_freq(ferq_step);
  621.                                                         _t0ae = TRUE;
  622.                                                         _mf0e = TRUE;
  623.                                     }break;
  624.                                 case 4:{   //設置量程
  625.                                         display_data.data &= 0XFE00;
  626.                                                 LED1 = 1;
  627.                                                 LED2 = 1;
  628.                                                 LED3 = 0;
  629.                                                 temp_int = 0x0008;
  630.                                                 temp_int <<=  vdd_step;
  631.                                                 display_data.data |= temp_int;
  632.                        
  633.                                 }break;
  634.                                         case 5:{   //校準偏置
  635.                                                         display_data.data &= 0XFE00;
  636.                                                         display_data.data |= 0x000A;
  637.                                     }break;
  638.                                 
  639.                                         case 6:{   //校準增益
  640.                                                         Offset.O = adc;
  641.                                                         display_data.data &= 0XFE00;
  642.                                                         display_data.data |= 0x001A;
  643.                                                 }break;
  644.                                        
  645.                                         case 7:{   //保存校準
  646.                                                         Gain.G = (float)(5.0/(adc-Offset.O));
  647.                                                         display_data.data &= 0XFE00;
  648.                                                         display_data.data |= 0x003A;                              
  649.                                     }break;                        
  650.                                         default: break;
  651.                                 }
  652.                                 update_display_flag = 0;

  653.                         }else {
  654.                                 update_display_flag = 0;
  655.                         }
  656.                 }
  657.                 GCC_CLRWDT();       //逗狗狗
  658.         }
  659. }

  660. /*END-------------------------------------------------------------------------*/
復制代碼
回復

使用道具 舉報

ID:96881 發表于 2015-12-31 14:42 | 顯示全部樓層
這個做得好精致啊,好漂亮,非常喜歡
回復

使用道具 舉報

ID:97704 發表于 2016-1-4 11:21 | 顯示全部樓層
漂亮,學習一下。
回復

使用道具 舉報

ID:147215 發表于 2016-12-29 08:36 | 顯示全部樓層
謝謝分享!,,51黑有你更精彩!!!
回復

使用道具 舉報

ID:166138 發表于 2017-2-28 12:38 | 顯示全部樓層
好是好,但是這個數值讀認要查表,誰能記得那么多呀?太困難了。建議修改顯示方式,如3.5V 顯示 3顆燈亮,然后顯示一個其他顏色的燈做小數點,然后再亮5顆燈。   如此循環顯示,比較好讀。如是30.5 則亮3顆燈時,在前面空一格,從第二位開始,用來區別。或者干脆再用顆其他顏色的LED來表示10位還是個位。個人想法,僅做拋磚引玉,還望樓主產品更實用和完善。
回復

使用道具 舉報

ID:151348 發表于 2017-3-13 21:43 | 顯示全部樓層
這估計是最苗條的萬用表
回復

使用道具 舉報

ID:162757 發表于 2018-12-18 16:51 | 顯示全部樓層
這個哪里有賣的
回復

使用道具 舉報

ID:33806 發表于 2019-1-4 12:02 | 顯示全部樓層
原購買鏈接失效,有現成的電路板比較漂亮!樓主能不能重新發布一下!
回復

使用道具 舉報

ID:491340 發表于 2019-5-15 16:48 | 顯示全部樓層
這個做的很纖細啊
回復

使用道具 舉報

ID:300101 發表于 2019-10-7 18:45 | 顯示全部樓層
好精致啊,這么可愛的一定要仿制一枚
回復

使用道具 舉報

ID:493097 發表于 2020-1-4 13:40 | 顯示全部樓層
好精致啊,一定要仿制一個玩玩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 超碰导航 | 欧美不卡一区二区三区 | 四虎永久| 欧美99| 97伦理 | 日韩中文字幕一区 | 日本三级在线 | 九九九久久国产免费 | 国产精品一区二区三区四区 | 日韩精品 电影一区 亚洲 | 国产高清免费视频 | 干出白浆视频 | 欧美亚洲国产一区二区三区 | 久久久成人精品 | 欧美激情精品久久久久久 | 蜜臀av日日欢夜夜爽一区 | 欧美女优在线观看 | 国产欧美精品 | 国产精品久久久久av | 操视频网站| 精品久久久久久久久久久久久久久久久 | 国产东北一级毛片 | 国产精品入口麻豆www | 精品国产一区二区三区观看不卡 | ww 255hh 在线观看 | 国产乱码久久久久久 | 日本成人中文字幕在线观看 | 欧美极品在线观看 | 四虎在线播放 | 黑人巨大精品欧美一区二区免费 | 欧美一二三| 在线观看视频91 | 国产一级片免费看 | 99pao成人国产永久免费视频 | 欧美8一10sex性hd | 亚洲国产一 | 激情网站在线观看 | 99精品视频在线观看 | 一区二区亚洲 | 精品久久久久久久久久 | av看片网站 |