找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6267|回复: 0
收起左侧

单片机可调直流电源仿真及程序 带旋钮和键盘调节功能

[复制链接]
ID:262 发表于 2016-8-15 18:44 | 显示全部楼层 |阅读模式

0.png

单片机可调直流电源键盘使用说明:
1:按下 MODE 键,在键盘和旋钮之间切换
键盘模式
1:按下 SET 键
2:按下 0--9.99之间的电压值
3:按下 ENTER 键
旋钮模式
1:调节可调电阻,电压随之改变


0.png


单片机可调直流电源程序如下:

  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, 下载次数: 56, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表