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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3733|回復(fù): 14
收起左側(cè)

單片機(jī)獨(dú)立按鍵按下沒任何反應(yīng),排除焊接問題,各位大佬能幫忙看看是怎么回事嗎

[復(fù)制鏈接]
ID:926365 發(fā)表于 2021-5-24 14:00 | 顯示全部樓層 |閱讀模式
本帖最后由 頭發(fā)保不住啦 于 2021-5-24 14:12 編輯


按鍵掃描程序如下:
void KeyScanf()
{
        if(KeySet_P==0)                // 判斷設(shè)置按鍵是否被按下
        {
                EA=0;
               
                /*將液晶顯示改為設(shè)置溫度的頁面****************************************************/
                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);                                                 // 光標(biāo)定位到第1行第5列
                LcdWriteCmd(0x0f);                                // 光標(biāo)閃爍
               
                DelayMs(10);                                                  // 去除按鍵按下的抖動
                while(!KeySet_P);                                         // 等待按鍵釋放
                DelayMs(10);                                                  // 去除按鍵松開的抖動

                /*設(shè)置溫度的下限值****************************************************************/
                while(KeySet_P)                                                // “設(shè)置鍵”沒有被按下,則一直處于溫度下限的設(shè)置
                {
                        if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下               
                        {
                                if(AlarmTL>0)                                        // 只有當(dāng)溫度下限值大于0時(shí),才能減1
                                        AlarmTL--;
                                LcdGotoXY(1,4);                                 // 重新刷新顯示更改后的溫度下限值        
                                LcdPrintNum2(AlarmTL);                  
                                LcdGotoXY(1,5);                                // 重新定位閃爍的光標(biāo)位置
                                DelayMs(350);                                        // 延時(shí)
                        }
                        if(KeyUp_P==0)                                  // 判斷 “加按鍵“ 是否被按下
                        {
                                if(AlarmTL<99)                           // 只有當(dāng)溫度下限值小于99時(shí),才能加1
                                        AlarmTL++;
                                LcdGotoXY(1,4);                                  // 重新刷新顯示更改后的溫度下限值
                                LcdPrintNum2(AlarmTL);
                                LcdGotoXY(1,5);                                // 重新定位閃爍的光標(biāo)位置
                                DelayMs(350);                                        // 延時(shí)
                        }        
                }

                LcdGotoXY(1,8);
                DelayMs(10);                                                  // 去除按鍵按下的抖動
                while(!KeySet_P);                                         // 等待按鍵釋放
                DelayMs(10);                                                  // 去除按鍵松開的抖動

                /*設(shè)置溫度的上限值****************************************************************/        
                while(KeySet_P)                                          // “設(shè)置鍵”沒有被按下,則一直處于溫度上限的設(shè)置
                {
                        if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下
                        {
                                if(AlarmTH>0)                                  // 只有當(dāng)溫度上限值大于0時(shí),才能減1                        
                                        AlarmTH--;
                                LcdGotoXY(1,7);                           // 重新刷新顯示更改后的溫度上限值
                                LcdPrintNum2(AlarmTH);
                                LcdGotoXY(1,8);                                // 重新定位閃爍的光標(biāo)位置
                                DelayMs(350);                                        // 延時(shí)
                        }
                        if(KeyUp_P==0)                                   // 判斷 “加按鍵“ 是否被按下
                        {
                                if(AlarmTH<99)                                 // 只有當(dāng)溫度上限值小于99時(shí),才能加1
                                        AlarmTH++;
                                LcdGotoXY(1,7);                                // 重新刷新顯示更改后的溫度上限值         
                                LcdPrintNum2(AlarmTH);
                                LcdGotoXY(1,8);                                // 重新定位閃爍的光標(biāo)位置
                                DelayMs(350);                                        // 延時(shí)
                        }                                                                 
                }

                /*將液晶顯示改為設(shè)置濕度的頁面****************************************************/
                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);                                                 // 光標(biāo)定位到第1行第5列
               
                DelayMs(10);                                                  // 去除按鍵按下的抖動
                while(!KeySet_P);                                         // 等待按鍵釋放
                DelayMs(10);
               
                /*設(shè)置濕度的下限值****************************************************************/
                while(KeySet_P)                                                 // “設(shè)置鍵”沒有被按下,則一直處于濕度下限的設(shè)置
                {
                        if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下
                        {
                                if(AlarmHL>0)                                         // 只有當(dāng)濕度下限值大于0時(shí),才能減1
                                        AlarmHL--;
                                LcdGotoXY(1,4);                                // 重新刷新顯示更改后的濕度下限值         
                                LcdPrintNum2(AlarmHL);
                                LcdGotoXY(1,5);                                // 重新定位閃爍的光標(biāo)位置
                                DelayMs(350);
                        }
                        if(KeyUp_P==0)                                  // 判斷 “加按鍵“ 是否被按下
                        {
                                if(AlarmHL<99)                          // 只有當(dāng)濕度下限值小于99時(shí),才能加1
                                        AlarmHL++;
                                LcdGotoXY(1,4);                                  // 重新刷新顯示更改后的濕度下限值
                                LcdPrintNum2(AlarmHL);
                                LcdGotoXY(1,5);                          // 重新定位閃爍的光標(biāo)位置
                                DelayMs(350);                                        // 延時(shí)
                        }        
                }

                LcdGotoXY(1,8);
                DelayMs(10);                                                  // 去除按鍵按下的抖動
                while(!KeySet_P);                                         // 等待按鍵釋放
                DelayMs(10);                                                  // 去除按鍵松開的抖動
               
                /*設(shè)置濕度的上限值****************************************************************/
                while(KeySet_P)                                           // “設(shè)置鍵”沒有被按下,則一直處于濕度上限的設(shè)置
                {
                        if(KeyDown_P==0)                                 // 判斷 “減按鍵“ 是否被按下
                        {
                                if(AlarmHH>0)                                  // 只有當(dāng)濕度上限值大于0時(shí),才能減1
                                        AlarmHH--;
                                LcdGotoXY(1,7);                                  // 重新刷新顯示更改后的濕度上限值
                                LcdPrintNum2(AlarmHH);
                                LcdGotoXY(1,8);                           // 重新定位閃爍的光標(biāo)位置
                                DelayMs(350);
                        }
                        if(KeyUp_P==0)                                         // 判斷 “加按鍵“ 是否被按下
                        {
                                if(AlarmHH<99)                                // 只有當(dāng)濕度上限值小于99時(shí),才能加1
                                        AlarmHH++;
                                LcdGotoXY(1,7);                                 // 重新刷新顯示更改后的濕度上限值        
                                LcdPrintNum2(AlarmHH);
                                LcdGotoXY(1,8);                                 // 重新定位閃爍的光標(biāo)位置
                                DelayMs(350);                                        // 延時(shí)
                        }        
                }

                /*將液晶顯示改為設(shè)置光照的頁面****************************************************/
                LcdWriteCmd(0x01);                                          // 設(shè)置界面的顯示框架
                LcdGotoXY(0,0);
                LcdPrintStr("   light Set    ");
                LcdGotoXY(1,0);
                LcdPrintStr("        %   ");
                LcdGotoXY(1,4);                                                                // 顯示當(dāng)前的報(bào)警值
                LcdPrintNum1(AlarmLG);                                

                LcdGotoXY(1,6);                                                                 // 光標(biāo)定位到第1行第6列
                DelayMs(10);                                                                  // 去除按鍵按下的抖動
                while(!KeySet_P);                                                         // 等待按鍵釋放
                DelayMs(10);
               
                while(KeySet_P)                                                                 // “設(shè)置鍵”沒有被按下,則一直處于光強(qiáng)下限的設(shè)置
                {
                        if(KeyDown_P==0)                                                // 判斷 “減按鍵“ 是否被按下
                        {
                                if(AlarmLG>1)                                                        // 只有g(shù)AlarmLG大于1才能減1                                                               
                                        AlarmLG--;                                
                                LcdGotoXY(1,4);                                                // 液晶光標(biāo)定位
                                LcdPrintNum1(AlarmLG);                // 刷新改變后的報(bào)警值
                                LcdGotoXY(1,6);
                                DelayMs(200);                                                        // 延時(shí)一下
                        }
                        if(KeyUp_P==0)                                                  // 判斷 “加按鍵“ 是否被按下
                        {
                        if(AlarmLG<99)                                                        // 只有g(shù)AlarmLG小于99才能加1
                                        AlarmLG++;                                
                                LcdGotoXY(1,4);                                                // 液晶光標(biāo)定位
                                LcdPrintNum1(AlarmLG);                // 刷新改變后的報(bào)警值
                                LcdGotoXY(1,6);
                                DelayMs(200);                                                        // 延時(shí)一下
                        }        
                }

                /*完成設(shè)置,退出前的處理**********************************************************/
                LcdWriteCmd(0x0C);                                                          // 取消光標(biāo)閃爍
                LcdShowInit();                                                                                // 液晶顯示為檢測界面的

                DelayMs(10);                                                                                  // 去除按鍵按下的抖動
                while(!KeySet_P);                                                                         // 等待按鍵釋放
                DelayMs(10);                                                                                  // 去除按鍵松開的抖動

                Sector_Erase(0x2000);                                                         // 存儲之前必須先擦除
                EEPROM_Write(0x2000,AlarmTL);                        // 把溫度下限存入到EEPROM的0x2000這個(gè)地址
                EEPROM_Write(0x2001,AlarmTH);                        // 把溫度上限存入到EEPROM的0x2001這個(gè)地址
                EEPROM_Write(0x2002,AlarmHL);                        // 把濕度下限存入到EEPROM的0x2002這個(gè)地址
                EEPROM_Write(0x2003,AlarmHH);                        // 把濕度上限存入到EEPROM的0x2003這個(gè)地址
                EEPROM_Write(0x2004,AlarmLG/10);        // 把光照報(bào)警值存入到EEPROM的0x2004和0x2005這兩個(gè)地址
                EEPROM_Write(0x2005,AlarmLG%10);
               
                EA=1;
        }        
}

%XW@2052S6H`PMPIR1}M2]H.png
回復(fù)

使用道具 舉報(bào)

ID:451718 發(fā)表于 2021-5-24 16:47 | 顯示全部樓層
按鍵響應(yīng)運(yùn)用不當(dāng)
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-5-24 19:31 | 顯示全部樓層
給你一個(gè)示例參考
DS18B20溫度上下限報(bào)警1602顯示.zip (219.92 KB, 下載次數(shù): 10)
回復(fù)

使用道具 舉報(bào)

ID:926365 發(fā)表于 2021-5-25 08:17 | 顯示全部樓層
robinsonlin 發(fā)表于 2021-5-24 16:47
按鍵響應(yīng)運(yùn)用不當(dāng)

具體是哪快不當(dāng)可以說一下嗎?
回復(fù)

使用道具 舉報(bào)

ID:926365 發(fā)表于 2021-5-25 08:18 | 顯示全部樓層
wulin 發(fā)表于 2021-5-24 19:31
給你一個(gè)示例參考

謝謝謝謝!!我先看看
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2021-5-25 09:15 | 顯示全部樓層
這個(gè)鍵盤掃描程序不應(yīng)該沒反應(yīng)啊,你是怎么調(diào)用的呢?不會是以中斷的方式吧?
回復(fù)

使用道具 舉報(bào)

ID:926365 發(fā)表于 2021-5-25 09:22 | 顯示全部樓層
glinfei 發(fā)表于 2021-5-25 09:15
這個(gè)鍵盤掃描程序不應(yīng)該沒反應(yīng)啊,你是怎么調(diào)用的呢?不會是以中斷的方式吧?

仿真里面可以用,但是實(shí)物按下沒任何反應(yīng),應(yīng)該不是焊接的問題,下面是主函數(shù),能幫我看看嘛
  1. void main(void)
  2. {
  3.         uchar i;                                // 循環(huán)變量

  4.         LcdInit();                                            // 液晶功能初始化
  5.         LcdShowInit();                                        // 液晶顯示初始化
  6.         AlarmInit();                                                // 報(bào)警值初始化

  7.         while(1)
  8.         {
  9.                 light=Get_ADC0832();                        // 讀取光照強(qiáng)度
  10.                 light=light/2.5;                                        // 縮小光照檢測結(jié)果(在0-99)
  11.                 if(light>99)                                                        // 如果大于99
  12.                         light=99;                                                                // 則依然保持99
  13.                 LcdGotoXY(0,9);                                                        // 液晶定位到第0行第6列
  14.                 LcdPrintNum1(light);                                                // 顯示測量結(jié)果
  15.                
  16.                 /*溫濕度讀取*/
  17.                 EA=0;
  18.                 ReadDhtData();                                                         // 檢測溫濕度數(shù)據(jù);
  19.                 EA=1;
  20.                 LcdGotoXY(1,2);                                                         // 定位到要顯示溫度的地方
  21.                 LcdPrintNum2(temp);                                        // 顯示溫度值
  22.                 LcdGotoXY(1,11);                                                // 定位到要顯示濕度的地方
  23.                 LcdPrintNum2(humi);                                        // 顯示濕度值
  24.                
  25.                 // 報(bào)警判斷
  26.                 AlarmJudge();                                                
  27.                
  28.                 /*按鍵掃描和延時(shí)*/
  29.                 for(i=0;i<30;i++)
  30.                 {
  31.                         KeyScanf();                                                                // 按鍵判斷
  32.                         DelayMs(10);
  33.                 }
  34.         }
  35. }


  36. /*********************************************************/
  37. // 串口中斷服務(wù)程序
  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);                        // 校驗(yàn)位
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2021-5-25 15:28 | 顯示全部樓層
頭發(fā)保不住啦 發(fā)表于 2021-5-25 09:22
仿真里面可以用,但是實(shí)物按下沒任何反應(yīng),應(yīng)該不是焊接的問題,下面是主函數(shù),能幫我看看嘛

我覺得是卡在你的串口中斷里了,中斷是一幀一幀的接收,你把RI = 0的意思就是清除標(biāo)志位,以便當(dāng)接收到下一幀數(shù)據(jù)進(jìn)入中斷。你要在學(xué)一下串口中斷怎么寫了,估計(jì)模擬時(shí)就沒模擬中斷。
回復(fù)

使用道具 舉報(bào)

ID:926365 發(fā)表于 2021-5-25 15:53 | 顯示全部樓層
glinfei 發(fā)表于 2021-5-25 15:28
我覺得是卡在你的串口中斷里了,中斷是一幀一幀的接收,你把RI = 0的意思就是清除標(biāo)志位,以便當(dāng)接收到下 ...

謝謝大佬!但是這個(gè)程序是別人給我的,能說說具體該怎么改嗎
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2021-5-25 16:08 | 顯示全部樓層
頭發(fā)保不住啦 發(fā)表于 2021-5-25 15:53
謝謝大佬!但是這個(gè)程序是別人給我的,能說說具體該怎么改嗎

我不太清楚你什么時(shí)候用串口,有兩種改法,如果你確切知道什么時(shí)候去查串口,就用串口輪詢的方式使用它,那就很簡單,把 interrupt 4 刪除,然后把UartInt()作為函數(shù)在程序中直接調(diào)用;如果非要使用中斷方式,那有點(diǎn)麻煩,你就注意函數(shù)中RI=0;只能用一次啊。可以設(shè)static 變量,記錄是否收夠了。
回復(fù)

使用道具 舉報(bào)

ID:883031 發(fā)表于 2021-5-25 16:16 | 顯示全部樓層
你這里是在中斷中進(jìn)行的查詢接收,所以,在第一次進(jìn)入中斷時(shí),應(yīng)該先把ES=0,關(guān)掉串口中斷,接收完后,再打開串口中斷,ES=1,應(yīng)該就行了。
回復(fù)

使用道具 舉報(bào)

ID:883031 發(fā)表于 2021-5-25 16:18 | 顯示全部樓層
/*********************************************************/
// 串口中斷服務(wù)程序
/*********************************************************/
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);                        // 校驗(yàn)位
                        RI=0;
                        while(!RI);                        // 停止位
                        RI=0;
                        
                        Value[gIndex]=VoutH*256+VoutL;
                        
                        gIndex++;
                        if(gIndex==20)
                                gIndex=0;
                }
               EA = 1;
        }
}
回復(fù)

使用道具 舉報(bào)

ID:926365 發(fā)表于 2021-5-25 16:20 | 顯示全部樓層
cn_zhx 發(fā)表于 2021-5-25 16:18
/*********************************************************/
// 串口中斷服務(wù)程序
/***************** ...

很感謝!!!我試試
回復(fù)

使用道具 舉報(bào)

ID:926365 發(fā)表于 2021-5-25 18:55 | 顯示全部樓層

剛剛調(diào)試成功了,再次感謝您!!!!!!!!!!
回復(fù)

使用道具 舉報(bào)

ID:942830 發(fā)表于 2021-11-28 19:44 | 顯示全部樓層
博主你們怎么設(shè)置按鍵最后成功的我們也是一樣的程序,問題也一樣,你們最后怎么解決的
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 九九久久久 | 日韩亚洲视频 | 成人欧美一区二区三区黑人孕妇 | 国产成人精品视频在线观看 | 一区二区不卡 | 成人免费网视频 | 天天干人人 | 九九久久免费视频 | 中文字幕专区 | 国产高清视频在线 | 亚洲精品高清视频在线观看 | 激情网站| 亚洲精品日韩在线 | 欧美日韩综合视频 | 夜夜骑首页| 成人久久久 | 国产麻豆一区二区三区 | 亚洲免费在线播放 | 精品亚洲国产成av人片传媒 | 亚洲电影中文字幕 | 成人午夜免费在线视频 | 中国美女一级黄色片 | 国产福利在线 | 成人在线不卡 | 亚洲成人久久久 | 美女久久久久久久 | 91视频入口 | av第一页 | 久久av一区二区三区 | 久久艹免费视频 | 天天插天天操 | 精品国产精品一区二区夜夜嗨 | 日韩中文字幕 | 国产精品福利视频 | 日韩美女一区二区三区在线观看 | 久久久精品视频免费 | 一级片视频免费观看 | 欧美亚洲在线视频 | 欧美精品一区二区三区一线天视频 | 一区二区不卡 | 狠狠操狠狠操 |