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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數(shù): 4539 | 評論數(shù): 17 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2021-3-4 11:11

正文摘要:

這個問題困擾了我很久,十幾天都沒有解決,希望有站內(nèi)大佬幫我一下。 1.問題描述: 通過按鍵操作控制LCD1602的顯示循環(huán)顯示兩個頁面。現(xiàn)有的現(xiàn)象是程序開始時,LCD屏保持在第一個頁面不變,但是按動(按下再抬起) ...

回復(fù)

ID:213173 發(fā)表于 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;                 //關(guān)閉定時器
        TH0=0XFE;    //高八位賦初值500
        TL0=0x33;    //低八位賦初值
        LCDShowService();
        TR0=1;//重新開啟定時器       
}

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

ID:888259 發(fā)表于 2021-3-4 14:21
15830266185 發(fā)表于 2021-3-4 14:08
你的 key_num 沒有歸零處理  不就是menu一直自加么

強(qiáng)!剛試了一下,問題解決了,多謝啦。今后還請多指教。
ID:888259 發(fā)表于 2021-3-4 14:16
robinsonlin 發(fā)表于 2021-3-4 14:03
定時中斷是有很高優(yōu)先級的,你在高優(yōu)先級的響應(yīng)中,處理按鍵,也就是讓主程序的都停下來,等著執(zhí)行按鍵響 ...

進(jìn)入定時器中斷后,定時器關(guān)閉不再計時,中斷函數(shù)可以安心處理其內(nèi)部的操作,包含按鍵檢測,LCD顯示。待處理完成后定時器再次打開,準(zhǔn)備進(jìn)入下一次中斷。main函數(shù)中的while(1)就是提供給中斷處理任務(wù)的。有中斷任務(wù)就處理,沒有的話主程序也是一直等待呀。
ID:798631 發(fā)表于 2021-3-4 14:08
你的 key_num 沒有歸零處理  不就是menu一直自加么
ID:888259 發(fā)表于 2021-3-4 14:06
17826075805 發(fā)表于 2021-3-4 13:38
的確在中斷函數(shù)里不應(yīng)該進(jìn)行過多操作,所以我在進(jìn)入定時器中斷函數(shù)中就把中斷給關(guān)閉了,等待按鍵處理完成 ...

如果不采用按鍵分配鍵值的辦法,直接在EC11_Action()函數(shù)中做menu的增減操作,同樣在中斷函數(shù)中檢測,其結(jié)果就表現(xiàn)正常了。只是這樣做會影響代碼結(jié)構(gòu),在多級菜單編程時會操作會十分繁瑣。
ID:451718 發(fā)表于 2021-3-4 14:03
17826075805 發(fā)表于 2021-3-4 13:38
的確在中斷函數(shù)里不應(yīng)該進(jìn)行過多操作,所以我在進(jìn)入定時器中斷函數(shù)中就把中斷給關(guān)閉了,等待按鍵處理完成 ...

定時中斷是有很高優(yōu)先級的,你在高優(yōu)先級的響應(yīng)中,處理按鍵,也就是讓主程序的都停下來,等著執(zhí)行按鍵響應(yīng),而且是一直在循環(huán)執(zhí)行。你的程序一直都在執(zhí)行中斷響應(yīng)中,還有多少資源去響應(yīng)主程序?
ID:888259 發(fā)表于 2021-3-4 13:44
Kxuan163 發(fā)表于 2021-3-4 13:33
建議在按鍵處理函數(shù)中添加消除抖動的代碼。

在EC11_Action()函數(shù)中已經(jīng)做了DelayXms(5) 【5ms】的消抖了
ID:888259 發(fā)表于 2021-3-4 13:42
15830266185 發(fā)表于 2021-3-4 11:59
做成0.5秒切換啊      比方說  menu低于50顯示 1界面  高于50顯示2界面  =100 歸0  調(diào)好計數(shù)就好

您可能沒有完全明白我的描述,我的按鍵處理是在定時器中斷中做的操作,EC11_Action()這個函數(shù)僅是檢測按鍵操作并分配一個key_num(鍵值),之后通過EC11_Scan()函數(shù)來捕獲鍵值,通過判斷鍵值來做menu的增減,menu的值實際是代表了所顯示頁面的索引。
ID:888259 發(fā)表于 2021-3-4 13:38
robinsonlin 發(fā)表于 2021-3-4 12:03
定時器中斷處理里面去操作定時器的開關(guān),這不是一種好的程序結(jié)構(gòu)思維。  你所預(yù)想的結(jié)果,并不一定是你希望 ...

的確在中斷函數(shù)里不應(yīng)該進(jìn)行過多操作,所以我在進(jìn)入定時器中斷函數(shù)中就把中斷給關(guān)閉了,等待按鍵處理完成后再把中斷打開。這個是不是不會對程序有什么影響呢?
ID:858964 發(fā)表于 2021-3-4 13:33
建議在按鍵處理函數(shù)中添加消除抖動的代碼。
ID:451718 發(fā)表于 2021-3-4 12:03
定時器中斷處理里面去操作定時器的開關(guān),這不是一種好的程序結(jié)構(gòu)思維。  你所預(yù)想的結(jié)果,并不一定是你希望得到的。  這樣搞,不可預(yù)料的狀態(tài)太多了,不是定時器的正確用法
ID:798631 發(fā)表于 2021-3-4 11:59
做成0.5秒切換啊      比方說  menu低于50顯示 1界面  高于50顯示2界面  =100 歸0  調(diào)好計數(shù)就好
ID:888259 發(fā)表于 2021-3-4 11:54
15830266185 發(fā)表于 2021-3-4 11:51
中斷是5ms一次             case 1:menu++;if(menu>1) menu = 0;break;  這句   menu反轉(zhuǎn)就是10ms

我剛調(diào)整的定時中斷時間為50ms,現(xiàn)象還是一樣的。只是頁面切換的沒有那么快了。
ID:798631 發(fā)表于 2021-3-4 11:51
中斷是5ms一次             case 1:menu++;if(menu>1) menu = 0;break;  這句   menu反轉(zhuǎn)就是10ms   
ID:888259 發(fā)表于 2021-3-4 11:43
15830266185 發(fā)表于 2021-3-4 11:38
menu 的反轉(zhuǎn)太快了   把反轉(zhuǎn)速度降下來啊

您的意思是中斷的時間太短了嗎?我這邊中斷是5ms一次的,能否具體指明一下呢?謝謝啦
ID:888259 發(fā)表于 2021-3-4 11:40
問題補(bǔ)充:如果直接在EC11_Action()函數(shù)直接中做menu變量的增減操作,然后再中斷函數(shù)中用switch函數(shù)處理menu的值,程序就沒有問題。
ID:798631 發(fā)表于 2021-3-4 11:38
menu 的反轉(zhuǎn)太快了   把反轉(zhuǎn)速度降下來啊

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国内精品久久久久 | 国产成人免费视频网站视频社区 | 成人免费视屏 | 久久国产亚洲 | 欧洲一级视频 | 超碰成人免费 | 91精品国产综合久久久动漫日韩 | 免费人成激情视频在线观看冫 | 色偷偷噜噜噜亚洲男人 | 欧美男人天堂 | 精品二区 | 成人性生交大片 | 久久毛片 | 免费看欧美一级片 | 羞羞在线观看视频 | 爽爽免费视频 | 国产xxxx在线 | www.天天干.com | 成人在线播放网站 | 欧美一级全黄 | 三级视频网站 | 日本在线免费看最新的电影 | 一级做a | 伊人影院在线观看 | 成人在线播放网站 | h视频免费在线观看 | 一区二区高清在线观看 | 五月精品视频 | 欧美精品在线看 | 欧美三级免费观看 | 久久久国产一区二区三区 | 四虎影视免费在线 | 成人精品一区二区三区 | 高清国产一区二区 | 先锋资源网 | 华人黄网站大全 | 在线91 | 日韩伦理一区二区 | 欧美激情精品久久久久 | 91高清在线观看 | 久久久网 |