找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3836|回复: 14
收起左侧

单片机独立按键按下没任何反应,排除焊接问题,各位大佬能帮忙看看是怎么回事吗

[复制链接]
ID:926365 发表于 2021-5-24 14:00 | 显示全部楼层 |阅读模式
本帖最后由 头发保不住啦 于 2021-5-24 14:12 编辑


按键扫描程序如下:
void KeyScanf()
{
        if(KeySet_P==0)                // 判断设置按键是否被按下
        {
                EA=0;
               
                /*将液晶显示改为设置温度的页面****************************************************/
                LcdWriteCmd(0x01);                                          
                LcdGotoXY(0,0);
                LcdPrintStr("Temperature Set ");
                LcdGotoXY(1,0);
                LcdPrintStr("      -    C    ");
                LcdGotoXY(1,10);                                                
                LcdWriteData(0xdf);                        

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

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

                /*设置温度的下限值****************************************************************/
                while(KeySet_P)                                                // “设置键”没有被按下,则一直处于温度下限的设置
                {
                        if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下               
                        {
                                if(AlarmTL>0)                                        // 只有当温度下限值大于0时,才能减1
                                        AlarmTL--;
                                LcdGotoXY(1,4);                                 // 重新刷新显示更改后的温度下限值        
                                LcdPrintNum2(AlarmTL);                  
                                LcdGotoXY(1,5);                                // 重新定位闪烁的光标位置
                                DelayMs(350);                                        // 延时
                        }
                        if(KeyUp_P==0)                                  // 判断 “加按键“ 是否被按下
                        {
                                if(AlarmTL<99)                           // 只有当温度下限值小于99时,才能加1
                                        AlarmTL++;
                                LcdGotoXY(1,4);                                  // 重新刷新显示更改后的温度下限值
                                LcdPrintNum2(AlarmTL);
                                LcdGotoXY(1,5);                                // 重新定位闪烁的光标位置
                                DelayMs(350);                                        // 延时
                        }        
                }

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

                /*设置温度的上限值****************************************************************/        
                while(KeySet_P)                                          // “设置键”没有被按下,则一直处于温度上限的设置
                {
                        if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下
                        {
                                if(AlarmTH>0)                                  // 只有当温度上限值大于0时,才能减1                        
                                        AlarmTH--;
                                LcdGotoXY(1,7);                           // 重新刷新显示更改后的温度上限值
                                LcdPrintNum2(AlarmTH);
                                LcdGotoXY(1,8);                                // 重新定位闪烁的光标位置
                                DelayMs(350);                                        // 延时
                        }
                        if(KeyUp_P==0)                                   // 判断 “加按键“ 是否被按下
                        {
                                if(AlarmTH<99)                                 // 只有当温度上限值小于99时,才能加1
                                        AlarmTH++;
                                LcdGotoXY(1,7);                                // 重新刷新显示更改后的温度上限值         
                                LcdPrintNum2(AlarmTH);
                                LcdGotoXY(1,8);                                // 重新定位闪烁的光标位置
                                DelayMs(350);                                        // 延时
                        }                                                                 
                }

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

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

                LcdGotoXY(1,5);                                                 // 光标定位到第1行第5列
               
                DelayMs(10);                                                  // 去除按键按下的抖动
                while(!KeySet_P);                                         // 等待按键释放
                DelayMs(10);
               
                /*设置湿度的下限值****************************************************************/
                while(KeySet_P)                                                 // “设置键”没有被按下,则一直处于湿度下限的设置
                {
                        if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下
                        {
                                if(AlarmHL>0)                                         // 只有当湿度下限值大于0时,才能减1
                                        AlarmHL--;
                                LcdGotoXY(1,4);                                // 重新刷新显示更改后的湿度下限值         
                                LcdPrintNum2(AlarmHL);
                                LcdGotoXY(1,5);                                // 重新定位闪烁的光标位置
                                DelayMs(350);
                        }
                        if(KeyUp_P==0)                                  // 判断 “加按键“ 是否被按下
                        {
                                if(AlarmHL<99)                          // 只有当湿度下限值小于99时,才能加1
                                        AlarmHL++;
                                LcdGotoXY(1,4);                                  // 重新刷新显示更改后的湿度下限值
                                LcdPrintNum2(AlarmHL);
                                LcdGotoXY(1,5);                          // 重新定位闪烁的光标位置
                                DelayMs(350);                                        // 延时
                        }        
                }

                LcdGotoXY(1,8);
                DelayMs(10);                                                  // 去除按键按下的抖动
                while(!KeySet_P);                                         // 等待按键释放
                DelayMs(10);                                                  // 去除按键松开的抖动
               
                /*设置湿度的上限值****************************************************************/
                while(KeySet_P)                                           // “设置键”没有被按下,则一直处于湿度上限的设置
                {
                        if(KeyDown_P==0)                                 // 判断 “减按键“ 是否被按下
                        {
                                if(AlarmHH>0)                                  // 只有当湿度上限值大于0时,才能减1
                                        AlarmHH--;
                                LcdGotoXY(1,7);                                  // 重新刷新显示更改后的湿度上限值
                                LcdPrintNum2(AlarmHH);
                                LcdGotoXY(1,8);                           // 重新定位闪烁的光标位置
                                DelayMs(350);
                        }
                        if(KeyUp_P==0)                                         // 判断 “加按键“ 是否被按下
                        {
                                if(AlarmHH<99)                                // 只有当湿度上限值小于99时,才能加1
                                        AlarmHH++;
                                LcdGotoXY(1,7);                                 // 重新刷新显示更改后的湿度上限值        
                                LcdPrintNum2(AlarmHH);
                                LcdGotoXY(1,8);                                 // 重新定位闪烁的光标位置
                                DelayMs(350);                                        // 延时
                        }        
                }

                /*将液晶显示改为设置光照的页面****************************************************/
                LcdWriteCmd(0x01);                                          // 设置界面的显示框架
                LcdGotoXY(0,0);
                LcdPrintStr("   light Set    ");
                LcdGotoXY(1,0);
                LcdPrintStr("        %   ");
                LcdGotoXY(1,4);                                                                // 显示当前的报警值
                LcdPrintNum1(AlarmLG);                                

                LcdGotoXY(1,6);                                                                 // 光标定位到第1行第6列
                DelayMs(10);                                                                  // 去除按键按下的抖动
                while(!KeySet_P);                                                         // 等待按键释放
                DelayMs(10);
               
                while(KeySet_P)                                                                 // “设置键”没有被按下,则一直处于光强下限的设置
                {
                        if(KeyDown_P==0)                                                // 判断 “减按键“ 是否被按下
                        {
                                if(AlarmLG>1)                                                        // 只有gAlarmLG大于1才能减1                                                               
                                        AlarmLG--;                                
                                LcdGotoXY(1,4);                                                // 液晶光标定位
                                LcdPrintNum1(AlarmLG);                // 刷新改变后的报警值
                                LcdGotoXY(1,6);
                                DelayMs(200);                                                        // 延时一下
                        }
                        if(KeyUp_P==0)                                                  // 判断 “加按键“ 是否被按下
                        {
                        if(AlarmLG<99)                                                        // 只有gAlarmLG小于99才能加1
                                        AlarmLG++;                                
                                LcdGotoXY(1,4);                                                // 液晶光标定位
                                LcdPrintNum1(AlarmLG);                // 刷新改变后的报警值
                                LcdGotoXY(1,6);
                                DelayMs(200);                                                        // 延时一下
                        }        
                }

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

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

                Sector_Erase(0x2000);                                                         // 存储之前必须先擦除
                EEPROM_Write(0x2000,AlarmTL);                        // 把温度下限存入到EEPROM的0x2000这个地址
                EEPROM_Write(0x2001,AlarmTH);                        // 把温度上限存入到EEPROM的0x2001这个地址
                EEPROM_Write(0x2002,AlarmHL);                        // 把湿度下限存入到EEPROM的0x2002这个地址
                EEPROM_Write(0x2003,AlarmHH);                        // 把湿度上限存入到EEPROM的0x2003这个地址
                EEPROM_Write(0x2004,AlarmLG/10);        // 把光照报警值存入到EEPROM的0x2004和0x2005这两个地址
                EEPROM_Write(0x2005,AlarmLG%10);
               
                EA=1;
        }        
}

%XW@2052S6H`PMPIR1}M2]H.png
回复

使用道具 举报

ID:451718 发表于 2021-5-24 16:47 | 显示全部楼层
按键响应运用不当
回复

使用道具 举报

ID:213173 发表于 2021-5-24 19:31 | 显示全部楼层
给你一个示例参考
DS18B20温度上下限报警1602显示.zip (219.92 KB, 下载次数: 10)

回复

使用道具 举报

ID:926365 发表于 2021-5-25 08:17 | 显示全部楼层
robinsonlin 发表于 2021-5-24 16:47
按键响应运用不当

具体是哪快不当可以说一下吗?
回复

使用道具 举报

ID:926365 发表于 2021-5-25 08:18 | 显示全部楼层
wulin 发表于 2021-5-24 19:31
给你一个示例参考

谢谢谢谢!!我先看看
回复

使用道具 举报

ID:844772 发表于 2021-5-25 09:15 | 显示全部楼层
这个键盘扫描程序不应该没反应啊,你是怎么调用的呢?不会是以中断的方式吧?
回复

使用道具 举报

ID:926365 发表于 2021-5-25 09:22 | 显示全部楼层
glinfei 发表于 2021-5-25 09:15
这个键盘扫描程序不应该没反应啊,你是怎么调用的呢?不会是以中断的方式吧?

仿真里面可以用,但是实物按下没任何反应,应该不是焊接的问题,下面是主函数,能帮我看看嘛
  1. void main(void)
  2. {
  3.         uchar i;                                // 循环变量

  4.         LcdInit();                                            // 液晶功能初始化
  5.         LcdShowInit();                                        // 液晶显示初始化
  6.         AlarmInit();                                                // 报警值初始化

  7.         while(1)
  8.         {
  9.                 light=Get_ADC0832();                        // 读取光照强度
  10.                 light=light/2.5;                                        // 缩小光照检测结果(在0-99)
  11.                 if(light>99)                                                        // 如果大于99
  12.                         light=99;                                                                // 则依然保持99
  13.                 LcdGotoXY(0,9);                                                        // 液晶定位到第0行第6列
  14.                 LcdPrintNum1(light);                                                // 显示测量结果
  15.                
  16.                 /*温湿度读取*/
  17.                 EA=0;
  18.                 ReadDhtData();                                                         // 检测温湿度数据;
  19.                 EA=1;
  20.                 LcdGotoXY(1,2);                                                         // 定位到要显示温度的地方
  21.                 LcdPrintNum2(temp);                                        // 显示温度值
  22.                 LcdGotoXY(1,11);                                                // 定位到要显示湿度的地方
  23.                 LcdPrintNum2(humi);                                        // 显示湿度值
  24.                
  25.                 // 报警判断
  26.                 AlarmJudge();                                                
  27.                
  28.                 /*按键扫描和延时*/
  29.                 for(i=0;i<30;i++)
  30.                 {
  31.                         KeyScanf();                                                                // 按键判断
  32.                         DelayMs(10);
  33.                 }
  34.         }
  35. }


  36. /*********************************************************/
  37. // 串口中断服务程序
  38. /*********************************************************/
  39. void UartInt(void) interrupt 4
  40. {
  41.         uchar VoutH,VoutL;
  42.         
  43.         if(RI==1)
  44.         {
  45.                 RI=0;
  46.                 if(SBUF==0xAA)                // 起始位
  47.                 {
  48.                         while(!RI);
  49.                         VoutH=SBUF;                        // Vout(H)
  50.                         RI=0;
  51.                         while(!RI);
  52.                         VoutL=SBUF;                        // Vout(L)
  53.                         RI=0;
  54.                         while(!RI);                        // Vref(H)
  55.                         RI=0;
  56.                         while(!RI);                        // Vref(L)
  57.                         RI=0;
  58.                         while(!RI);                        // 校验位
  59.                         RI=0;
  60.                         while(!RI);                        // 停止位
  61.                         RI=0;
  62.                         
  63.                         Value[gIndex]=VoutH*256+VoutL;
  64.                         
  65.                         gIndex++;
  66.                         if(gIndex==20)
  67.                                 gIndex=0;
  68.                 }
  69.         }
  70. }
复制代码
回复

使用道具 举报

ID:844772 发表于 2021-5-25 15:28 | 显示全部楼层
头发保不住啦 发表于 2021-5-25 09:22
仿真里面可以用,但是实物按下没任何反应,应该不是焊接的问题,下面是主函数,能帮我看看嘛

我觉得是卡在你的串口中断里了,中断是一帧一帧的接收,你把RI = 0的意思就是清除标志位,以便当接收到下一帧数据进入中断。你要在学一下串口中断怎么写了,估计模拟时就没模拟中断。
回复

使用道具 举报

ID:926365 发表于 2021-5-25 15:53 | 显示全部楼层
glinfei 发表于 2021-5-25 15:28
我觉得是卡在你的串口中断里了,中断是一帧一帧的接收,你把RI = 0的意思就是清除标志位,以便当接收到下 ...

谢谢大佬!但是这个程序是别人给我的,能说说具体该怎么改吗
回复

使用道具 举报

ID:844772 发表于 2021-5-25 16:08 | 显示全部楼层
头发保不住啦 发表于 2021-5-25 15:53
谢谢大佬!但是这个程序是别人给我的,能说说具体该怎么改吗

我不太清楚你什么时候用串口,有两种改法,如果你确切知道什么时候去查串口,就用串口轮询的方式使用它,那就很简单,把 interrupt 4 删除,然后把UartInt()作为函数在程序中直接调用;如果非要使用中断方式,那有点麻烦,你就注意函数中RI=0;只能用一次啊。可以设static 变量,记录是否收够了。
回复

使用道具 举报

ID:883031 发表于 2021-5-25 16:16 | 显示全部楼层
你这里是在中断中进行的查询接收,所以,在第一次进入中断时,应该先把ES=0,关掉串口中断,接收完后,再打开串口中断,ES=1,应该就行了。
回复

使用道具 举报

ID:883031 发表于 2021-5-25 16:18 | 显示全部楼层
/*********************************************************/
// 串口中断服务程序
/*********************************************************/
void UartInt(void) interrupt 4
{
        uchar VoutH,VoutL;
        
        if(RI==1)
        {
               ES = 0;
                RI=0;
                if(SBUF==0xAA)                // 起始位
                {
                        while(!RI);
                        VoutH=SBUF;                        // Vout(H)
                        RI=0;
                        while(!RI);
                        VoutL=SBUF;                        // Vout(L)
                        RI=0;
                        while(!RI);                        // Vref(H)
                        RI=0;
                        while(!RI);                        // Vref(L)
                        RI=0;
                        while(!RI);                        // 校验位
                        RI=0;
                        while(!RI);                        // 停止位
                        RI=0;
                        
                        Value[gIndex]=VoutH*256+VoutL;
                        
                        gIndex++;
                        if(gIndex==20)
                                gIndex=0;
                }
               EA = 1;
        }
}
回复

使用道具 举报

ID:926365 发表于 2021-5-25 16:20 | 显示全部楼层
cn_zhx 发表于 2021-5-25 16:18
/*********************************************************/
// 串口中断服务程序
/***************** ...

很感谢!!!我试试
回复

使用道具 举报

ID:926365 发表于 2021-5-25 18:55 | 显示全部楼层

刚刚调试成功了,再次感谢您!!!!!!!!!!
回复

使用道具 举报

ID:942830 发表于 2021-11-28 19:44 | 显示全部楼层
博主你们怎么设置按键最后成功的我们也是一样的程序,问题也一样,你们最后怎么解决的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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