找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3597|回复: 3
打印 上一主题 下一主题
收起左侧

单片机按键按不动,没反应是咋回事谁能帮我看一下?

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. // 按键扫描
  2. /*********************************************************/
  3. void KeyScanf()
  4. {
  5.         if(KeySet_P==0)                // 判断设置按键是否被按下
  6.         {
  7.                 EA=0;
  8.                
  9.                 /*将液晶显示改为设置温度的页面****************************************************/
  10.                 LcdWriteCmd(0x01);                                         
  11.                 LcdGotoXY(0,0);
  12.                 LcdPrintStr("Temperature Set ");
  13.                 LcdGotoXY(1,0);
  14.                 LcdPrintStr("      -    C    ");
  15.                 LcdGotoXY(1,10);                                                
  16.                 LcdWriteData(0xdf);                       


  17.                 LcdGotoXY(1,4);                                                 // 在液晶上填充温度的下限值      
  18.                 LcdPrintNum2(AlarmTL);      
  19.                 LcdGotoXY(1,7);                                                 // 在液晶上填充温度的上限值
  20.                 LcdPrintNum2(AlarmTH);


  21.                 LcdGotoXY(1,5);                                                 // 光标定位到第1行第5列
  22.                 LcdWriteCmd(0x0f);                                // 光标闪烁
  23.                
  24.                 DelayMs(10);                                                  // 去除按键按下的抖动
  25.                 while(!KeySet_P);                                         // 等待按键释放
  26.                 DelayMs(10);                                                  // 去除按键松开的抖动


  27.                 /*设置温度的下限值****************************************************************/
  28.                 while(KeySet_P)                                                // “设置键”没有被按下,则一直处于温度下限的设置
  29.                 {
  30.                         if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下               
  31.                         {
  32.                                 if(AlarmTL>0)                                        // 只有当温度下限值大于0时,才能减1
  33.                                         AlarmTL--;
  34.                                 LcdGotoXY(1,4);                                 // 重新刷新显示更改后的温度下限值      
  35.                                 LcdPrintNum2(AlarmTL);                 
  36.                                 LcdGotoXY(1,5);                                // 重新定位闪烁的光标位置
  37.                                 DelayMs(350);                                        // 延时
  38.                         }
  39.                         if(KeyUp_P==0)                                  // 判断 “加按键“ 是否被按下
  40.                         {
  41.                                 if(AlarmTL<99)                           // 只有当温度下限值小于99时,才能加1
  42.                                         AlarmTL++;
  43.                                 LcdGotoXY(1,4);                                  // 重新刷新显示更改后的温度下限值
  44.                                 LcdPrintNum2(AlarmTL);
  45.                                 LcdGotoXY(1,5);                                // 重新定位闪烁的光标位置
  46.                                 DelayMs(350);                                        // 延时
  47.                         }      
  48.                 }


  49.                 LcdGotoXY(1,8);
  50.                 DelayMs(10);                                                  // 去除按键按下的抖动
  51.                 while(!KeySet_P);                                         // 等待按键释放
  52.                 DelayMs(10);                                                  // 去除按键松开的抖动


  53.                 /*设置温度的上限值****************************************************************/      
  54.                 while(KeySet_P)                                          // “设置键”没有被按下,则一直处于温度上限的设置
  55.                 {
  56.                         if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下
  57.                         {
  58.                                 if(AlarmTH>0)                                  // 只有当温度上限值大于0时,才能减1                       
  59.                                         AlarmTH--;
  60.                                 LcdGotoXY(1,7);                           // 重新刷新显示更改后的温度上限值
  61.                                 LcdPrintNum2(AlarmTH);
  62.                                 LcdGotoXY(1,8);                                // 重新定位闪烁的光标位置
  63.                                 DelayMs(350);                                        // 延时
  64.                         }
  65.                         if(KeyUp_P==0)                                   // 判断 “加按键“ 是否被按下
  66.                         {
  67.                                 if(AlarmTH<99)                                 // 只有当温度上限值小于99时,才能加1
  68.                                         AlarmTH++;
  69.                                 LcdGotoXY(1,7);                                // 重新刷新显示更改后的温度上限值        
  70.                                 LcdPrintNum2(AlarmTH);
  71.                                 LcdGotoXY(1,8);                                // 重新定位闪烁的光标位置
  72.                                 DelayMs(350);                                        // 延时
  73.                         }                                                                 
  74.                 }


  75.                 /*将液晶显示改为设置湿度的页面****************************************************/
  76.                 LcdWriteCmd(0x01);                                         
  77.                 LcdGotoXY(0,0);
  78.                 LcdPrintStr("  Humidity Set  ");
  79.                 LcdGotoXY(1,0);
  80.                 LcdPrintStr("      -   %RH   ");               


  81.                 LcdGotoXY(1,4);                                                 // 在液晶上填充湿度的下限值      
  82.                 LcdPrintNum2(AlarmHL);      
  83.                 LcdGotoXY(1,7);                                                 // 在液晶上填充湿度的上限值
  84.                 LcdPrintNum2(AlarmHH);


  85.                 LcdGotoXY(1,5);                                                 // 光标定位到第1行第5列
  86.                
  87.                 DelayMs(10);                                                  // 去除按键按下的抖动
  88.                 while(!KeySet_P);                                         // 等待按键释放
  89.                 DelayMs(10);
  90.                
  91.                 /*设置湿度的下限值****************************************************************/
  92.                 while(KeySet_P)                                                 // “设置键”没有被按下,则一直处于湿度下限的设置
  93.                 {
  94.                         if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下
  95.                         {
  96.                                 if(AlarmHL>0)                                         // 只有当湿度下限值大于0时,才能减1
  97.                                         AlarmHL--;
  98.                                 LcdGotoXY(1,4);                                // 重新刷新显示更改后的湿度下限值        
  99.                                 LcdPrintNum2(AlarmHL);
  100.                                 LcdGotoXY(1,5);                                // 重新定位闪烁的光标位置
  101.                                 DelayMs(350);
  102.                         }
  103.                         if(KeyUp_P==0)                                  // 判断 “加按键“ 是否被按下
  104.                         {
  105.                                 if(AlarmHL<99)                          // 只有当湿度下限值小于99时,才能加1
  106.                                         AlarmHL++;
  107.                                 LcdGotoXY(1,4);                                  // 重新刷新显示更改后的湿度下限值
  108.                                 LcdPrintNum2(AlarmHL);
  109.                                 LcdGotoXY(1,5);                          // 重新定位闪烁的光标位置
  110.                                 DelayMs(350);                                        // 延时
  111.                         }      
  112.                 }


  113.                 LcdGotoXY(1,8);
  114.                 DelayMs(10);                                                  // 去除按键按下的抖动
  115.                 while(!KeySet_P);                                         // 等待按键释放
  116.                 DelayMs(10);                                                  // 去除按键松开的抖动
  117.                
  118.                 /*设置湿度的上限值****************************************************************/
  119.                 while(KeySet_P)                                           // “设置键”没有被按下,则一直处于湿度上限的设置
  120.                 {
  121.                         if(KeyDown_P==0)                                 // 判断 “减按键“ 是否被按下
  122.                         {
  123.                                 if(AlarmHH>0)                                  // 只有当湿度上限值大于0时,才能减1
  124.                                         AlarmHH--;
  125.                                 LcdGotoXY(1,7);                                  // 重新刷新显示更改后的湿度上限值
  126.                                 LcdPrintNum2(AlarmHH);
  127.                                 LcdGotoXY(1,8);                           // 重新定位闪烁的光标位置
  128.                                 DelayMs(350);
  129.                         }
  130.                         if(KeyUp_P==0)                                         // 判断 “加按键“ 是否被按下
  131.                         {
  132.                                 if(AlarmHH<99)                                // 只有当湿度上限值小于99时,才能加1
  133.                                         AlarmHH++;
  134.                                 LcdGotoXY(1,7);                                 // 重新刷新显示更改后的湿度上限值      
  135.                                 LcdPrintNum2(AlarmHH);
  136.                                 LcdGotoXY(1,8);                                 // 重新定位闪烁的光标位置
  137.                                 DelayMs(350);                                        // 延时
  138.                         }      
  139.                 }


  140.                 /*将液晶显示改为设置烟雾的页面****************************************************/
  141.                 LcdWriteCmd(0x01);                                          // 设置界面的显示框架
  142.                 LcdGotoXY(0,0);
  143.                 LcdPrintStr("   YanWu Set    ");
  144.                 LcdGotoXY(1,0);
  145.                 LcdPrintStr("        %   ");
  146.                 LcdGotoXY(1,4);                                                                // 显示当前的报警值
  147.                 LcdPrintNum1(AlarmLG);                              


  148.                 LcdGotoXY(1,6);                                                                 // 光标定位到第1行第6列
  149.                 DelayMs(10);                                                                  // 去除按键按下的抖动
  150.                 while(!KeySet_P);                                                         // 等待按键释放
  151.                 DelayMs(10);
  152.                
  153.                 while(KeySet_P)                                                                 // “设置键”没有被按下,则一直处于光强下限的设置
  154.                 {
  155.                         if(KeyDown_P==0)                                                // 判断 “减按键“ 是否被按下
  156.                         {
  157.                                 if(AlarmLG>1)                                                        // 只有gAlarmLG大于1才能减1                                                               
  158.                                         AlarmLG--;                              
  159.                                 LcdGotoXY(1,4);                                                // 液晶光标定位
  160.                                 LcdPrintNum1(AlarmLG);                // 刷新改变后的报警值
  161.                                 LcdGotoXY(1,6);
  162.                                 DelayMs(200);                                                        // 延时一下
  163.                         }
  164.                         if(KeyUp_P==0)                                                  // 判断 “加按键“ 是否被按下
  165.                         {
  166.                         if(AlarmLG<99)                                                        // 只有gAlarmLG小于99才能加1
  167.                                         AlarmLG++;                              
  168.                                 LcdGotoXY(1,4);                                                // 液晶光标定位
  169.                                 LcdPrintNum1(AlarmLG);                // 刷新改变后的报警值
  170.                                 LcdGotoXY(1,6);
  171.                                 DelayMs(200);                                                        // 延时一下
  172.                         }      
  173.                 }


  174.                 /*完成设置,退出前的处理**********************************************************/
  175.                 LcdWriteCmd(0x0C);                                                          // 取消光标闪烁
  176.                 LcdShowInit();                                                                                // 液晶显示为检测界面的


  177.                 DelayMs(10);                                                                                  // 去除按键按下的抖动
  178.                 while(!KeySet_P);                                                                         // 等待按键释放
  179.                 DelayMs(10);                                                                                  // 去除按键松开的抖动


  180.                 Sector_Erase(0x2000);                                                         // 存储之前必须先擦除
  181.                 EEPROM_Write(0x2000,AlarmTL);                        // 把温度下限存入到EEPROM的0x2000这个地址
  182.                 EEPROM_Write(0x2001,AlarmTH);                        // 把温度上限存入到EEPROM的0x2001这个地址
  183.                 EEPROM_Write(0x2002,AlarmHL);                        // 把湿度下限存入到EEPROM的0x2002这个地址
  184.                 EEPROM_Write(0x2003,AlarmHH);                        // 把湿度上限存入到EEPROM的0x2003这个地址
  185.                 EEPROM_Write(0x2004,AlarmLG/10);        // 把烟雾报警值存入到EEPROM的0x2004和0x2005这两个地址
  186.                 EEPROM_Write(0x2005,AlarmLG%10);
  187.                
  188.                 EA=1;
  189.         }      
  190. }




  191. /*********************************************************/
  192. // 报警判断
  193. /*********************************************************/
  194. void AlarmJudge(void)
  195. {
  196.         /*温度*/
  197.         if(temp>AlarmTH)                                // 温度是否过高
  198.         {
  199.                 LedTH_P=0;
  200.                 LedTL_P=1;
  201.         }
  202.         else if(temp<AlarmTL)                // 温度是否过低
  203.         {
  204.                 LedTL_P=0;
  205.                 LedTH_P=1;
  206.         }
  207.         else                                                                                // 温度正常
  208.         {
  209.                 LedTH_P=1;
  210.                 LedTL_P=1;
  211.         }


  212.         /*湿度*/
  213.         if(humi>AlarmHH)                           // 湿度是否过高
  214.         {
  215.                 LedHH_P=0;
  216.           LedHL_P=1;
  217.         }
  218.         else if(humi<AlarmHL)                // 湿度是否过低
  219.         {
  220.                 LedHL_P=0;
  221.                 LedHH_P=1;
  222.         }
  223.         else                                                                           // 湿度正常
  224.         {
  225.                 LedHH_P=1;
  226.                 LedHL_P=1;
  227.         }
  228.       
  229.         /*烟雾*/
  230.         if(light>AlarmLG)
  231.         {
  232.                 LedLG_P=0;
  233.         }
  234.         else
  235.         {
  236.                 LedLG_P=1;
  237.         }


  238.         /*蜂鸣器*/
  239.         if((LedHH_P==0)||(LedHL_P==0)||(LedTH_P==0)||(LedTL_P==0)||(LedLG_P==0))         // 蜂鸣器判断,只要至少1个报警灯亮,蜂鸣器就报警
  240.                 Buzzer_P=0;
  241.         else      
  242.                 Buzzer_P=1;
  243. }




  244. /*********************************************************/
  245. // 报警值初始化
  246. /*********************************************************/
  247. void AlarmInit(void)
  248. {
  249.         AlarmTL=EEPROM_Read(0x2000);        // 从EEPROM的0x2000这个地址读取温度的报警下限
  250.         AlarmTH=EEPROM_Read(0x2001);        // 从EEPROM的0x2001这个地址读取温度的报警上限
  251.         AlarmHL=EEPROM_Read(0x2002);        // 从EEPROM的0x2002这个地址读取湿度的报警下限      
  252.         AlarmHH=EEPROM_Read(0x2003);        // 从EEPROM的0x2003这个地址读取湿度的报警上限
  253.         AlarmLG=EEPROM_Read(0x2004)*100+EEPROM_Read(0x2005);                // 读取烟雾报警值
  254.       
  255.         if((AlarmTL==0)||(AlarmTL>100))        // 如果温度下限报警值读出来异常(等于0或大于100),则重新赋值
  256.                 AlarmTL=20;
  257.         if((AlarmTH==0)||(AlarmTH>100))        // 如果温度上限报警值读出来异常(等于0或大于100),则重新赋值
  258.                 AlarmTH=35;
  259.         if((AlarmHL==0)||(AlarmHL>100))        // 如果温度下限报警值读出来异常(等于0或大于100),则重新赋值
  260.                 AlarmHL=40;
  261.         if((AlarmHH==0)||(AlarmHH>100))        // 如果温度上限报警值读出来异常(等于0或大于100),则重新赋值
  262.                 AlarmHH=85;
  263.         if((AlarmLG==0)||(AlarmLG>100))        // 如果读取到的报警值异常,则重新赋值
  264.                 AlarmLG=60;
  265. }




  266. /*********************************************************/
  267. // 主函数
  268. /*********************************************************/
  269. void main(void)
  270. {
  271.         uchar i;                                // 循环变量


  272.         LcdInit();                                            // 液晶功能初始化
  273.         LcdShowInit();                                        // 液晶显示初始化
  274.         AlarmInit();                                                // 报警值初始化


  275.         while(1)
  276.         {
  277.                 light=Get_ADC0832();                        // 读取烟雾强度
  278.                 light=light/2.5;                                        // 缩小烟雾检测结果(在0-99)
  279.                 if(light>99)                                                        // 如果大于99
  280.                         light=99;                                                                // 则依然保持99
  281.                 LcdGotoXY(0,9);                                                        // 液晶定位到第0行第6列
  282.                 LcdPrintNum1(light);                                                // 显示测量结果
  283.                
  284.                 /*温湿度读取*/
  285.                 EA=0;
  286.                 ReadDhtData();                                                         // 检测温湿度数据;
  287.                 EA=1;
  288.                 LcdGotoXY(1,2);                                                         // 定位到要显示温度的地方
  289.                 LcdPrintNum2(temp);                                        // 显示温度值
  290.                 LcdGotoXY(1,11);                                                // 定位到要显示湿度的地方
  291.                 LcdPrintNum2(humi);                                        // 显示湿度值
  292.                
  293.                 // 报警判断
  294.                 AlarmJudge();                                               
  295.                
  296.                 /*按键扫描和延时*/
  297.                 for(i=0;i<30;i++)
  298.                 {
  299.                         KeyScanf();                                                                // 按键判断
  300.                         DelayMs(10);
  301.                 }
  302.         }
  303. }




  304. /*********************************************************/
  305. // 串口中断服务程序
  306. /*********************************************************/
  307. void UartInt(void) interrupt 4
  308. {
  309.         uchar VoutH,VoutL;
  310.       
  311.         if(RI==1)
  312.         {
  313.         ES=0;
  314.                 RI=0;
  315.                 if(SBUF==0xAA)                // 起始位
  316.                 {
  317.                         while(!RI);
  318.                         VoutH=SBUF;                        // Vout(H)
  319.                         RI=0;
  320.                         while(!RI);
  321.                         VoutL=SBUF;                        // Vout(L)
  322.                         RI=0;
  323.                         while(!RI);                        // Vref(H)
  324.                         RI=0;
  325.                         while(!RI);                        // Vref(L)
  326.                         RI=0;
  327.                         while(!RI);                        // 校验位
  328.                         RI=0;
  329.                         while(!RI);                        // 停止位
  330.                         RI=0;
  331.                        
  332.                         Value[gIndex]=VoutH*256+VoutL;
  333.                        
  334.                         gIndex++;
  335.                         if(gIndex==20)
  336.                                 gIndex=0;
  337.                 }
  338.                 EA=1;
  339.         }
  340. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2021-11-29 19:40 | 只看该作者
新手不要试图一下子就能完成多项功能。应当循序渐进逐项的实现,再逐项组合。就算有大佬闲得dan疼帮你改好代码你也看不懂,也就没有多少实际意义。
回复

使用道具 举报

板凳
ID:311846 发表于 2021-11-30 16:53 | 只看该作者
上拉IO电平,不知道你什么单片机,内部上拉或者外部上拉,限流,主循环屏蔽其他功能,单独调试按键,调好后加入程序中,不想看你程序,仅提供方法
回复

使用道具 举报

地板
ID:976767 发表于 2021-11-30 19:55 | 只看该作者
先单独调试按键程序试试,然后再加其他
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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