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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C51單片機問題請教,通過按鍵操作控制LCD1602的顯示循環顯示兩個頁面[已解決]

[復制鏈接]
跳轉到指定樓層
樓主
這個問題困擾了我很久,十幾天都沒有解決,希望有站內大佬幫我一下。
1.問題描述:
通過按鍵操作控制LCD1602的顯示循環顯示兩個頁面。現有的現象是程序開始時,LCD屏保持在第一個頁面不變,但是按動(按下再抬起)按鈕后,LCD就自己不停的在兩個頁面之間循環跳變。只有在按下按鈕不抬起來的時候LCD屏幕才能一直顯示一個頁面。PS:按鍵和LCD顯示單獨測試均正常,且引腳定義也已確定無誤。
2.問題代碼:#include<REG52.h>
#include"LCD1602.h"
#include"delay.h"
#include"Level_1Menu.h"
#include"Level_2Menu.h"
#include"Level_3Menu.h"
#include"Level_4Menu.h"
#include"EC11.h"
#include"PowerMode.h"
#include"interrupt.h"
#include"relay.h"


unsigned char menu = 0;

unsigned char  key_num = 0;

unsigned char EC11_Action()
{
        if(ENTER == 0)//判斷ENTER鍵是否按下
                {
                        DelayXms(5);//延時消抖,時間一般為5-10ms
                        if(ENTER == 0)
                        {                        
                                key_num = 1;//分配ENTER的鍵值為“1”
                                while(ENTER == 0);//等待松手
                                LCDWriteCmd(LCD_SCREEN_CLR); //清屏
                        }

                }

        return key_num;        
}

unsigned char EC11_Scan()
{

        switch(EC11_Action())
        {
                case 0:break;
                case 1:menu++;if(menu>1) menu = 0;break;
                default:break;
        }
        return menu;
}


void LCDShowService()
{
                switch(EC11_Scan())
                {
                        case 0:BAIC_C62X();break;
                        case 1:BAIC_B40();break;
                        default:break;
                }        
}


void T0_Service() interrupt 1 using 0
{
        TR0=0;                 //關閉定時器
        TL0=0x33;    //低八位賦初值
        TH0=0XFE;    //高八位賦初值
        
        LCDShowService();

        TR0=1;//重新開啟定時器        
}


void main()
{        
        LCDInit();
        T0_Init();
        while(1);
}



捕獲.PNG (44.5 KB, 下載次數: 90)

捕獲.PNG

DVP_MENU.rar

66.54 KB, 下載次數: 5

LCD驅動及相關模塊

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

使用道具 舉報

沙發
ID:798631 發表于 2021-3-4 11:38 | 只看該作者
menu 的反轉太快了   把反轉速度降下來啊
回復

使用道具 舉報

板凳
ID:888259 發表于 2021-3-4 11:40 | 只看該作者
問題補充:如果直接在EC11_Action()函數直接中做menu變量的增減操作,然后再中斷函數中用switch函數處理menu的值,程序就沒有問題。
回復

使用道具 舉報

地板
ID:888259 發表于 2021-3-4 11:43 | 只看該作者
15830266185 發表于 2021-3-4 11:38
menu 的反轉太快了   把反轉速度降下來啊

您的意思是中斷的時間太短了嗎?我這邊中斷是5ms一次的,能否具體指明一下呢?謝謝啦
回復

使用道具 舉報

5#
ID:798631 發表于 2021-3-4 11:51 | 只看該作者
中斷是5ms一次             case 1:menu++;if(menu>1) menu = 0;break;  這句   menu反轉就是10ms   
回復

使用道具 舉報

6#
ID:888259 發表于 2021-3-4 11:54 | 只看該作者
15830266185 發表于 2021-3-4 11:51
中斷是5ms一次             case 1:menu++;if(menu>1) menu = 0;break;  這句   menu反轉就是10ms

我剛調整的定時中斷時間為50ms,現象還是一樣的。只是頁面切換的沒有那么快了。
回復

使用道具 舉報

7#
ID:798631 發表于 2021-3-4 11:59 | 只看該作者
做成0.5秒切換啊      比方說  menu低于50顯示 1界面  高于50顯示2界面  =100 歸0  調好計數就好
回復

使用道具 舉報

8#
ID:451718 發表于 2021-3-4 12:03 | 只看該作者
定時器中斷處理里面去操作定時器的開關,這不是一種好的程序結構思維。  你所預想的結果,并不一定是你希望得到的。  這樣搞,不可預料的狀態太多了,不是定時器的正確用法
回復

使用道具 舉報

9#
ID:858964 發表于 2021-3-4 13:33 | 只看該作者
建議在按鍵處理函數中添加消除抖動的代碼。
回復

使用道具 舉報

10#
ID:888259 發表于 2021-3-4 13:38 | 只看該作者
robinsonlin 發表于 2021-3-4 12:03
定時器中斷處理里面去操作定時器的開關,這不是一種好的程序結構思維。  你所預想的結果,并不一定是你希望 ...

的確在中斷函數里不應該進行過多操作,所以我在進入定時器中斷函數中就把中斷給關閉了,等待按鍵處理完成后再把中斷打開。這個是不是不會對程序有什么影響呢?
回復

使用道具 舉報

11#
ID:888259 發表于 2021-3-4 13:42 | 只看該作者
15830266185 發表于 2021-3-4 11:59
做成0.5秒切換啊      比方說  menu低于50顯示 1界面  高于50顯示2界面  =100 歸0  調好計數就好

您可能沒有完全明白我的描述,我的按鍵處理是在定時器中斷中做的操作,EC11_Action()這個函數僅是檢測按鍵操作并分配一個key_num(鍵值),之后通過EC11_Scan()函數來捕獲鍵值,通過判斷鍵值來做menu的增減,menu的值實際是代表了所顯示頁面的索引。
回復

使用道具 舉報

12#
ID:888259 發表于 2021-3-4 13:44 | 只看該作者
Kxuan163 發表于 2021-3-4 13:33
建議在按鍵處理函數中添加消除抖動的代碼。

在EC11_Action()函數中已經做了DelayXms(5) 【5ms】的消抖了
回復

使用道具 舉報

13#
ID:451718 發表于 2021-3-4 14:03 | 只看該作者
17826075805 發表于 2021-3-4 13:38
的確在中斷函數里不應該進行過多操作,所以我在進入定時器中斷函數中就把中斷給關閉了,等待按鍵處理完成 ...

定時中斷是有很高優先級的,你在高優先級的響應中,處理按鍵,也就是讓主程序的都停下來,等著執行按鍵響應,而且是一直在循環執行。你的程序一直都在執行中斷響應中,還有多少資源去響應主程序?
回復

使用道具 舉報

14#
ID:888259 發表于 2021-3-4 14:06 | 只看該作者
17826075805 發表于 2021-3-4 13:38
的確在中斷函數里不應該進行過多操作,所以我在進入定時器中斷函數中就把中斷給關閉了,等待按鍵處理完成 ...

如果不采用按鍵分配鍵值的辦法,直接在EC11_Action()函數中做menu的增減操作,同樣在中斷函數中檢測,其結果就表現正常了。只是這樣做會影響代碼結構,在多級菜單編程時會操作會十分繁瑣。
回復

使用道具 舉報

15#
ID:798631 發表于 2021-3-4 14:08 | 只看該作者
你的 key_num 沒有歸零處理  不就是menu一直自加么
回復

使用道具 舉報

16#
ID:888259 發表于 2021-3-4 14:16 | 只看該作者
robinsonlin 發表于 2021-3-4 14:03
定時中斷是有很高優先級的,你在高優先級的響應中,處理按鍵,也就是讓主程序的都停下來,等著執行按鍵響 ...

進入定時器中斷后,定時器關閉不再計時,中斷函數可以安心處理其內部的操作,包含按鍵檢測,LCD顯示。待處理完成后定時器再次打開,準備進入下一次中斷。main函數中的while(1)就是提供給中斷處理任務的。有中斷任務就處理,沒有的話主程序也是一直等待呀。
回復

使用道具 舉報

17#
ID:888259 發表于 2021-3-4 14:21 | 只看該作者
15830266185 發表于 2021-3-4 14:08
你的 key_num 沒有歸零處理  不就是menu一直自加么

強!剛試了一下,問題解決了,多謝啦。今后還請多指教。
回復

使用道具 舉報

18#
ID:213173 發表于 2021-3-4 20:51 | 只看該作者
#include <REG52.h>
#include"LCD1602.h"
#include"delay.h"
#include"Level_1Menu.h"
#include"Level_2Menu.h"
#include"Level_3Menu.h"
#include"Level_4Menu.h"
#include"EC11.h"
#include"PowerMode.h"
#include"interrupt.h"
#include"relay.h"


//unsigned char menu = 0;

unsigned char  key_num = 0;

unsigned char EC11_Action()
{
        if(ENTER == 0)//判斷ENTER鍵是否按下
        {
                DelayXms(5);//延時消抖,時間一般為5-10ms
                if(ENTER == 0)
                {                       
//                        key_num = 1;//分配ENTER的鍵值為“1”
                        key_num=++key_num%2;
                        while(ENTER == 0);//等待松手
                        LCDWriteCmd(LCD_SCREEN_CLR); //清屏
                }
        }
        return key_num;       
}
/*
unsigned char EC11_Scan()
{

        switch(EC11_Action())
        {
                case 0:break;
                case 1:menu++;if(menu>1) menu = 0;break;
                default:break;
        }
        return menu;
}
*/

void LCDShowService()
{
//        switch(EC11_Scan())
        switch(EC11_Action())
        {
                case 0:BAIC_C62X();break;
                case 1:BAIC_B40();break;
                default:break;
        }       
}

void T0_Service() interrupt 1 using 0
{
        TR0=0;                 //關閉定時器
        TH0=0XFE;    //高八位賦初值500
        TL0=0x33;    //低八位賦初值
        LCDShowService();
        TR0=1;//重新開啟定時器       
}

void main()
{       
        LCDInit();
        T0_Init();
        while(1);
}

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产japanhdxxxx麻豆| 亚洲成人一区二区三区 | 国产免费自拍 | 尤物视频在线免费观看 | 国产精品麻 | 一级黄色大片 | 国产中文在线观看 | 久在线观看 | 成人精品毛片 | 亚洲 欧美 日韩在线 | 四虎成人免费视频 | 国产乱码精品1区2区3区 | 超碰成人免费观看 | 国产一区二区三区在线免费 | 国产精品96久久久久久 | 伊人av在线播放 | 日韩a | 99热.com| 亚洲国产精品91 | 久草在线在线精品观看 | 国产成人一区二区三区电影 | 一区在线播放 | 一区二区国产精品 | 国产精品视频综合 | 伊人亚洲 | 成人精品系列 | 精品一二三区 | 一本一道久久a久久精品蜜桃 | 欧美日韩18 | 日本免费视频在线观看 | 国产一级在线 | 亚洲一区精品在线 | 国产激情91久久精品导航 | 亚洲精品一区二 | 精品久久久久久久久亚洲 | 一区二区中文字幕 | 国产高清美女一级a毛片久久w | 一区二区三区视频在线免费观看 | 狼人伊人影院 | 亚洲精品国产成人 | 人人做人人澡人人爽欧美 |