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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7304|回復: 0
打印 上一主題 下一主題
收起左側

單片機可調直流電源仿真及程序 帶旋鈕和鍵盤調節功能

[復制鏈接]
跳轉到指定樓層
樓主



單片機可調直流電源鍵盤使用說明:
1:按下 MODE 鍵,在鍵盤和旋鈕之間切換
鍵盤模式
1:按下 SET 鍵
2:按下 0--9.99之間的電壓值
3:按下 ENTER 鍵
旋鈕模式
1:調節可調電阻,電壓隨之改變





單片機可調直流電源程序如下:

  1. #include "global.h"
  2. #include "key.h"
  3. #include "lcd.h"
  4. #include "adcdac.h"
  5. uchar Pre_KeyNO = 16,KeyNO = 16;  
  6. uchar keybuf[6];
  7. uchar keycnt;  
  8. bit pointflag;
  9. bit newvalueflag;
  10. bit updateflag;
  11. bit setenable;


  12. uchar Keys_Scan()
  13. {
  14.          uchar Tmp;
  15.         KEYPORT = 0x0f;
  16.         Delayms(10);
  17.         Tmp = KEYPORT ^ 0x0f;
  18.         switch(Tmp)
  19.         {
  20.                  case 1: KeyNO = 0; break;
  21.                 case 2: KeyNO = 1; break;
  22.                 case 4: KeyNO = 2; break;
  23.                 case 8: KeyNO = 3; break;
  24.                 default: ;
  25.         }
  26.         KEYPORT = 0xf0;
  27.         Delayms(1);
  28.         Tmp = KEYPORT >> 4 ^ 0x0f;
  29.         switch(Tmp)
  30.         {
  31.                  case 1: KeyNO += 0; break;
  32.                 case 2: KeyNO += 4; break;
  33.                 case 4: KeyNO += 8; break;
  34.                 case 8: KeyNO += 12;
  35.                 default: ;
  36.         }
  37.         while(KEYPORT != 0xf0);
  38.         return(KeyNO) ;
  39. }
  40. /*
  41. 刪除字符串中的小數點
  42. */
  43. /*
  44. void delchar(char *s, char c)
  45. {
  46. char *m=s;
  47. char *n=s;
  48.         while(*m)
  49.         {
  50.         if(*m!=c)
  51.         *n++=*m;
  52.         m++;
  53.         }
  54.         *n='\0';
  55. }
  56. */

  57. /*
  58. 字符串轉換成浮點數
  59. */
  60. double str2num(char *s)
  61. {
  62.         char    i,num[6];
  63.     double  b=1;
  64.     double  sum=0.0;
  65.         strcpy(num , s);
  66.     for(i=0;num[i] && num[i]!='.';i++)
  67.     {
  68.             sum*=10;
  69.             sum+=(num[i]-'0');
  70.     }
  71.     if(num[i]=='.')
  72.     {
  73.             for(i++;num[i];i++)
  74.             {
  75.                     b*=0.1;
  76.                     sum+=b*(num[i]-'0');
  77.             }
  78.     }
  79.         return(sum);
  80. }

  81. /*
  82. 鍵盤輸入處理
  83. 定義了0-9的數字鍵,小數點,刪除,設定,確認,模式切換鍵
  84. 1、按模式切換進入鍵盤模式
  85. 2、按設定鍵
  86. 3、輸入數字0.0 -9.9之內整數小數都可以
  87. 4、確認
  88. 5、要輸入新的值重復2-4,模式鍵可返回旋鈕模式
  89. */
  90. void keyhandle(uchar key)
  91. {
  92.     uchar i;
  93.         uint temp;
  94.         uchar buf[6];
  95.         double d;
  96.         Pre_KeyNO =key;
  97.         if(Pre_KeyNO == KEY_MODE)//鍵盤模式和旋鈕模式切換
  98.         {
  99.                 workmode = !workmode;
  100.                 if(workmode==MODE_B)
  101.                 {
  102.                         updateflag = 0;
  103.                         for(i=0;i<16;i++)
  104.                         {
  105.                                  Display_Buffer0[i]= ' ';
  106.                                 Display_Buffer1[i]= ' ';        
  107.                         }
  108.                         for(i=0;i<6;i++)
  109.                         {
  110.                                  keybuf[i]= '\0';        
  111.                         }
  112.                         strcpy(Display_Buffer0 , "Pls Press Set");
  113.                         DisplayUpdate();
  114.                 }
  115.                 else
  116.                 {
  117.                         Write_LCD_Command(0x0c);
  118.                 }
  119.                 return;
  120.         }
  121.         if(workmode==MODE_B)  //鍵盤模式處理
  122.         {
  123.                 if(Pre_KeyNO == KEY_SET)
  124.                 {
  125.                         keycnt = 0;
  126.                         pointflag = 0;
  127.                         newvalueflag = 0;
  128.                         updateflag = 0;
  129.                         setenable = 1;
  130.                         strcpy(Display_Buffer0 , "Pls Set Voltage:");
  131.                         for(i=0;i<16;i++)
  132.                         {
  133.                                  Display_Buffer1[i]= ' ';        
  134.                         }
  135.                         for(i=0;i<6;i++)
  136.                         {
  137.                                  keybuf[i]= '\0';        
  138.                         }
  139.                         DisplayUpdate();
  140.                         Write_LCD_Command(0xc0);
  141.                         Write_LCD_Command(0x0f);
  142.                         return;        
  143.                 }
  144.                 if((!updateflag)&&(setenable))
  145.                 {
  146.                         switch (Pre_KeyNO)
  147.                         {               
  148.                                 case KEY_POINT:   //小數點處理
  149.                                         if((!pointflag)&&(keycnt))
  150.                                         {
  151.                                                 if(keycnt<5)
  152.                                                 {
  153.                                                         pointflag = 1;
  154.                                                         keybuf[keycnt] = '.';
  155.                                                         keycnt++;
  156.                                                         keybuf[keycnt] =  '\0';   
  157.                                                 }
  158.                                         }                        
  159.                                         break;
  160.                                 case KEY_BACK:             //刪除剛輸入的鍵
  161.                                         if(keycnt)
  162.                                         {
  163.                                                 keybuf[keycnt] =  '\0';
  164.                                                 keycnt--;
  165.                                                 if(keybuf[keycnt] == '.')
  166.                                                 pointflag = 0;
  167.                                                 keybuf[keycnt] = ' ';                                
  168.                                         }
  169.                                         else
  170.                                         {
  171.                                                 keybuf[0] = ' ';
  172.                                         }                        
  173.                                         break;                                       
  174.                                 case KEY_ENTER:   //更新數據,退出
  175.                                         strcpy(buf , keybuf);                        
  176.                                         strcpy(Display_Buffer1 , "SetVoltage:");
  177.                                         strcat(Display_Buffer1 , keybuf);
  178.                                         ShowString(0,1,Display_Buffer1);
  179.                                         d = str2num(buf);
  180.                                         temp = d * 1000/10;
  181.                                         Set_DAC(temp);        
  182.                                         updateflag = 1;
  183.                                         setenable = 0;
  184.                                         strcpy(Display_Buffer0 , "OutVoltage:");
  185.                                         Write_LCD_Command(0x0c);
  186.                                         return;               
  187.                                         break;
  188.                                 case KEY_EXIT:           //不更新數據,退出
  189.                                        
  190.                                         break;
  191.                                 default:                 //數字按鍵處理
  192.                                         if((Pre_KeyNO>=0)&& (Pre_KeyNO<10))
  193.                                         {
  194.                                                 if(keycnt<5)
  195.                                                 {
  196.                                                         keybuf[keycnt] =  Pre_KeyNO + '0';
  197.                                                         keycnt++;
  198.                                                         keybuf[keycnt] =  '\0';
  199.                                                 }
  200.                                         }
  201.                                         break;
  202.                         }
  203.                         strcpy(Display_Buffer1,keybuf);
  204.                         DisplayUpdate();         
  205.                         Write_LCD_Command(0xc0+keycnt);                                 
  206.                         Write_LCD_Command(0x0f);
  207.                 }         
  208.                
  209.         }
  210. }
復制代碼



可調直流電源鍵盤輸入.zip

141.99 KB, 下載次數: 59, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本免费网 | 国产精品美女久久久久久免费 | 中文字幕国产精品视频 | 天堂av中文在线 | 91国自产 | 玖玖免费 | 亚州精品天堂中文字幕 | 欧美片网站免费 | 五月激情综合网 | 免费在线观看一区二区 | 久久久久国产一区二区三区 | eeuss国产一区二区三区四区 | 国产.com| 毛片免费看的 | 精品国产青草久久久久福利 | 99久9| 精品二区| 午夜一级黄色片 | 久久综合一区二区 | 久久久久久精 | 精品网| 国产精品黄视频 | 婷婷二区 | 91欧美精品成人综合在线观看 | 91.xxx.高清在线 | 一呦二呦三呦国产精品 | www.狠狠干 | 国产区精品视频 | 国产精品久久久久久高潮 | 网站黄色在线免费观看 | 日日射夜夜骑 | 好姑娘影视在线观看高清 | 一级毛毛片 | 97国产在线视频 | 国产亚洲精品成人av久久ww | 天天看逼 | 国内精品久久影院 | 国产丝袜一区二区三区免费视频 | 日日干日日操 | 韩日精品一区 | 欧美日韩在线视频一区 |