找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4535|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

求程序思路 單片機(jī)按鍵次數(shù)控制流水燈

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:895128 發(fā)表于 2021-4-7 22:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請(qǐng)教一下大致的實(shí)現(xiàn)方法與思路,理清頭緒后我自己來寫程序去實(shí)現(xiàn),謝謝大家

例如按一下全亮,連續(xù)按兩下流水燈,連續(xù)三下?lián)Q一種流水燈。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:895128 發(fā)表于 2021-4-7 22:53 | 只看該作者
我暫時(shí)的思路是定時(shí)計(jì)數(shù),定時(shí)3s內(nèi)統(tǒng)計(jì)按鍵次數(shù)在用按鍵次數(shù)去控制不同的燈動(dòng)作。但是這樣的話會(huì)有很大的延遲,每次都要等3s才會(huì)停止計(jì)數(shù)的話。太浪費(fèi)時(shí)間了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:752974 發(fā)表于 2021-4-8 08:35 | 只看該作者
對(duì)按鍵計(jì)數(shù)就可以,1全亮,2流水,3換一個(gè)流水,并清零變量。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:584814 發(fā)表于 2021-4-8 08:36 | 只看該作者
Dieouy 發(fā)表于 2021-4-7 22:53
我暫時(shí)的思路是定時(shí)計(jì)數(shù),定時(shí)3s內(nèi)統(tǒng)計(jì)按鍵次數(shù)在用按鍵次數(shù)去控制不同的燈動(dòng)作。但是這樣的話會(huì)有很大的延 ...

那么問題來了:你按了1次或2次后怎么才知道你不是要按3次呢 ?

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:592807 發(fā)表于 2021-4-8 08:48 | 只看該作者
Dieouy 發(fā)表于 2021-4-7 22:53
我暫時(shí)的思路是定時(shí)計(jì)數(shù),定時(shí)3s內(nèi)統(tǒng)計(jì)按鍵次數(shù)在用按鍵次數(shù)去控制不同的燈動(dòng)作。但是這樣的話會(huì)有很大的延 ...

3S?你這個(gè)東西是給老年人用的?你自己用個(gè)計(jì)時(shí)器算一下3S你能按多少下按鍵,連續(xù)按鍵間隔超過0.5秒都不叫連續(xù)。得到按鍵信號(hào)0.5秒內(nèi),沒有下一個(gè)按鍵信號(hào)就可以處理了

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:487569 發(fā)表于 2021-4-8 09:40 | 只看該作者
思路就是松開按鍵執(zhí)行動(dòng)作。判斷到按鍵按下,先暫存按鍵的鍵值,按下次數(shù)+1,然后給一個(gè)變量賦值用作延時(shí)判斷。等到判斷按鍵松開延時(shí)就開始倒計(jì),倒計(jì)為0的時(shí)候,把暫存的鍵值取出來,并執(zhí)行判斷是哪個(gè)按鍵,按下幾次。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:895128 發(fā)表于 2021-4-8 10:40 | 只看該作者
unsigned char key_read(void)
{
    static unsigned char key_m = key_state_0, key_time_1 = 0;
    unsigned char key_return = N_key,key_temp;
     
    key_temp = key_driver();
     
    switch(key_m)
    {
        case key_state_0:
            if (key_temp == S_key )
            {
                 key_time_1 = 0;               // 第1次單擊,不返回,到下個(gè)狀態(tài)判斷后面是否出現(xiàn)雙擊
                 key_m = key_state_1;
            }
            else
                 key_return = key_temp;        // 對(duì)于無鍵、長(zhǎng)鍵,返回原事件
            break;

        case key_state_1:
            if (key_temp == S_key)             // 又一次單擊(間隔肯定<500ms)
            {
                 key_return = D_key;           // 返回雙擊鍵事件,回初始狀態(tài)
                 key_m = key_state_0;
            }
            else                                
            {                                  // 這里500ms內(nèi)肯定讀到的都是無鍵事件,因?yàn)殚L(zhǎng)鍵>1000ms,在1s前低層返回的都是無鍵
                 if(++key_time_1 >= 50)
                 {
                      key_return = S_key;      // 500ms內(nèi)沒有再次出現(xiàn)單鍵事件,返回上一次的單鍵事件
                      key_m = key_state_0;     // 返回初始狀態(tài)
                 }
             }
             break;
    }
    return key_return;
}     



這個(gè)怎么添加第n次的判斷啊
回復(fù)

使用道具 舉報(bào)

8#
ID:895128 發(fā)表于 2021-4-8 11:03 | 只看該作者
已經(jīng)做出來了,謝謝各位大佬。



#include<reg52.h>
#define N_key    0              //無鍵
#define S_key    1              //單鍵
#define D_key    2              //雙鍵
#define L_key    3              //長(zhǎng)鍵
#define C_key    4              //三擊鍵
#define E_key    5              //四擊鍵
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
#define key_state_4 4
#define key_state_5 5
sbit key_input = P2^0;    // 按鍵輸入口
unsigned char time_10ms_ok = 0;
unsigned char key = 0;

unsigned char key_driver(void)
{
    static unsigned char key_state = key_state_0, key_time = 0;
    unsigned char  key_return = N_key;
        bit key_press;

    key_press = key_input;                    // 讀按鍵I/O電平

    switch (key_state)
    {
      case key_state_0:                              // 按鍵初始態(tài)
        if (!key_press) key_state = key_state_1;      // 鍵被按下,狀態(tài)轉(zhuǎn)換到按鍵消抖和確認(rèn)狀態(tài)
        break;
      
      case key_state_1:                      // 按鍵消抖與確認(rèn)態(tài)
        if (!key_press)
        {
             key_time = 0;                   //  
             key_state = key_state_2;   // 按鍵仍然處于按下,消抖完成,狀態(tài)轉(zhuǎn)換到按下鍵時(shí)間的計(jì)時(shí)狀態(tài),但返回的還是無鍵事件
        }
        else
             key_state = key_state_0;   // 按鍵已抬起,轉(zhuǎn)換到按鍵初始態(tài)。此處完成和實(shí)現(xiàn)軟件消抖,其實(shí)按鍵的按下和釋放都在此消抖的。
        break;
      
      case key_state_2:
        if(key_press)
        {
             key_return = S_key;        // 此時(shí)按鍵釋放,說明是產(chǎn)生一次短操作,回送S_key
             key_state = key_state_0;   // 轉(zhuǎn)換到按鍵初始態(tài)
        }
        else if (++key_time >= 100)     // 繼續(xù)按下,計(jì)時(shí)加10ms(10ms為本函數(shù)循環(huán)執(zhí)行間隔)
        {
             key_return = L_key;        // 按下時(shí)間>1000ms,此按鍵為長(zhǎng)按操作,返回長(zhǎng)鍵事件
             key_state = key_state_3;   // 轉(zhuǎn)換到等待按鍵釋放狀態(tài)
        }
        break;

      case key_state_3:                 // 等待按鍵釋放狀態(tài),此狀態(tài)只返回?zé)o按鍵事件
        if (key_press) key_state = key_state_0; //按鍵已釋放,轉(zhuǎn)換到按鍵初始態(tài)
        break;
    }
    return key_return;
}

/*=============
中間層按鍵處理函數(shù),調(diào)用低層函數(shù)一次,處理雙擊事件的判斷,返回上層正確的無鍵、單鍵、雙鍵、長(zhǎng)鍵4個(gè)按鍵事件。
本函數(shù)由上層循環(huán)調(diào)用,間隔10ms
===============*/

unsigned char key_read(void)
{
    static unsigned char key_m = key_state_0, key_time_1 = 0;
    unsigned char key_return = N_key,key_temp;
     
    key_temp = key_driver();
     
    switch(key_m)
    {
        case key_state_0:
            if (key_temp == S_key )
            {
                 key_time_1 = 0;               // 第1次單擊,不返回,到下個(gè)狀態(tài)判斷后面是否出現(xiàn)雙擊
                 key_m = key_state_1;
            }
            else
                 key_return = key_temp;        // 對(duì)于無鍵、長(zhǎng)鍵,返回原事件
            break;

        case key_state_1:
            if (key_temp == S_key)             // 又一次單擊(間隔肯定<500ms)
         
                                                
            {   if( key_temp == S_key)
               
                                                         {
                 key_time_1 = 0;               // 第1次單擊,不返回,到下個(gè)狀態(tài)判斷后面是否出現(xiàn)雙擊
                 key_m = key_state_4;
               }
                                                        
                                                         else
                                                                          { key_return = D_key;           // 返回雙擊鍵事件,回初始狀態(tài)
                     key_m = key_state_0; }
                                                                 
            }
            else                                
            {                                  // 這里500ms內(nèi)肯定讀到的都是無鍵事件,因?yàn)殚L(zhǎng)鍵>1000ms,在1s前低層返回的都是無鍵
                 if(++key_time_1 >= 50)
                 {
                      key_return = S_key;      // 500ms內(nèi)沒有再次出現(xiàn)單鍵事件,返回上一次的單鍵事件
                      key_m = key_state_0;     // 返回初始狀態(tài)
                 }
             }
             break;
       case key_state_4:
            if (key_temp == S_key)             // 又一次單擊(間隔肯定<500ms)
         
                                                
            {   if( key_temp == S_key)
               
                                                         {
                 key_time_1 = 0;               // 第1次單擊,不返回,到下個(gè)狀態(tài)判斷后面是否出現(xiàn)雙擊
                 key_m = key_state_5;
               }
                                                        
                                                         else
                                                                          { key_return = C_key;           // 返回雙擊鍵事件,回初始狀態(tài)
                     key_m = key_state_0; }
                                                                 
            }
            else                                
            {                                  // 這里500ms內(nèi)肯定讀到的都是無鍵事件,因?yàn)殚L(zhǎng)鍵>1000ms,在1s前低層返回的都是無鍵
                 if(++key_time_1 >= 50)
                 {
                      key_return = D_key;      // 500ms內(nèi)沒有再次出現(xiàn)單鍵事件,返回上一次的單鍵事件
                      key_m = key_state_0;     // 返回初始狀態(tài)
                 }
             }
             break;
                        case key_state_5:
            if (key_temp == S_key)             // 又一次單擊(間隔肯定<500ms)
            {
                 key_return = E_key;           // 返回四擊鍵事件,回初始狀態(tài)
                 key_m = key_state_0;
            }
            else                                
            {                                  // 這里500ms內(nèi)肯定讀到的都是無鍵事件,因?yàn)殚L(zhǎng)鍵>1000ms,在1s前低層返回的都是無鍵
                 if(++key_time_1 >= 50)
                 {
                      key_return = C_key;      // 500ms內(nèi)沒有再次出現(xiàn)單鍵事件,返回上一次的單鍵事件
                      key_m = key_state_0;     // 返回初始狀態(tài)
                 }
             }
             break;



     }
               
                return key_return;
}     

void main()
{
        P0 = 0xff;        //IO口初始化
        P2 = 0xff;
                        //定時(shí)器的初始化                                                   
        TMOD = 0x01;                           //選擇定時(shí)器的工作模式:定時(shí)器0,方式1
        TH0 = (65535 - 10000)/256; //定時(shí)器的初值
        TL0 = (65535 - 10000)%256;
        EA = 1;                                           //開打總中斷使能
        ET0 = 1;                                   //打開定時(shí)器0 的使能
        TR0 = 1;                                   //打開定時(shí)器0 ,開始工作

        while(1)
        {
                if(time_10ms_ok)          //time_10ms_ok = 1,表示計(jì)時(shí)到了10MS。(10MS掃描一次按鍵)
                {
                        time_10ms_ok = 0; //清除計(jì)時(shí)10MS標(biāo)志
                        key = key_read(); //調(diào)用掃描按鍵程序,返回一個(gè)鍵值

                        if (key == L_key) //長(zhǎng)按:點(diǎn)亮P1口上的8個(gè)LED燈。(低電平點(diǎn)亮)
                        {
                                P0 = 0x00;
                        }  
            else if(key == D_key)//雙擊:點(diǎn)亮P1口上第二個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0xfd;
                        }  
            else if(key == S_key)//單擊:點(diǎn)亮P1口上第一個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0xfe;
                        }
                              else if(key == C_key)//單擊:點(diǎn)亮P1口上第1個(gè)和第二個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0xfc;//11111100
                        }
                              else if(key == E_key)//單擊:點(diǎn)亮P1口上第1個(gè)和第二個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0xf0;//11110000
                        }
                }
        }
}

void timer0(void) interrupt 1        //用的是定時(shí)器0, 這個(gè)“interrupt 1”中的“1”代表1號(hào)中斷即是定時(shí)器0中斷。如果是“0”就是外部中斷0;“2“=外部中斷1;”3“定時(shí)器1中斷;”4“=串行口中斷
{
        TH0 = (65535 - 10000)/256;
        TL0 = (65535 - 10000)%256; //定時(shí)器0的方式1,得在中斷程序中重復(fù)初值。
        time_10ms_ok = 1;  //定時(shí)10MS 的標(biāo)志
}

在原代碼基礎(chǔ)上修改      原代碼鏈接:https://blog.csdn.net/Sun19910114/article/details/53810110
回復(fù)

使用道具 舉報(bào)

9#
ID:451718 發(fā)表于 2021-4-8 12:04 | 只看該作者
本帖最后由 robinsonlin 于 2021-4-8 13:54 編輯

1,在1ms定時(shí)器中斷里面建一個(gè) unsigned long SysTick++;
2,當(dāng)檢測(cè)到按鍵響應(yīng)時(shí),變量TKey = SysTick,采集此時(shí)的系統(tǒng)時(shí)鐘,同時(shí)KeyCount變量+1;
3,在SysTick - Tkey<=1500時(shí),如果還有按鍵響應(yīng),就KeyCount++;
4,當(dāng)SysTick - TKey>1500時(shí),執(zhí)行switch(KeyCount), break后KeyCount變量清零。
附長(zhǎng)短周期判斷,長(zhǎng)短周期判斷,實(shí)際是檢測(cè)按鍵的連續(xù)性, 需要再加一個(gè)10ms的定時(shí)器做按鍵判斷。在10ms定時(shí)器中,設(shè)定按鍵檢測(cè)標(biāo)志,并記錄SysTick,如按下時(shí),TFlag = 1; KeyDelay = SysTick;這個(gè)操作記得加鎖,只執(zhí)行一次。 當(dāng)檢測(cè)到按鍵彈起,TFlag = 0;  然后判斷 SysTick - KeyDelay是否大于500,如果大于就是長(zhǎng)按鍵,KeyCount += 10;如果SysTick - KeyDelay小于500ms,就是短按鍵,KeyCount ++ ;  KeyCount 十位就是長(zhǎng)按次數(shù),個(gè)位是短按次數(shù)。   SysTick - Tkey > 1500時(shí),記得清理keyCount。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

10#
ID:47286 發(fā)表于 2021-4-8 12:32 | 只看該作者
用一個(gè)變量當(dāng)計(jì)數(shù)器 每按一下按鍵 計(jì)數(shù)器+一次 然后判斷變量值 運(yùn)行對(duì)應(yīng)的部分 大致框架如下 細(xì)節(jié)還需要補(bǔ)上 比如防抖什么的

if(key==1)
{
keynum++;
if(keynum==10)
{
keynum=0;//假設(shè)10種流水方式
}
}

if(keynum==0)
{
停止流水或關(guān)燈
}
else if(keynum==1)
{
流水1
}
else if(........)
{

}

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

11#
ID:895128 發(fā)表于 2021-4-8 13:13 | 只看該作者
這個(gè)問題解決的,現(xiàn)在新的問題是通過按鍵

比如按鍵中間間隔延時(shí)實(shí)現(xiàn)兩長(zhǎng)一短,或者兩短一長(zhǎng)這樣的判斷。

暫時(shí)思路是通過延時(shí)來實(shí)現(xiàn):
檢測(cè)按鍵是否按下,按下后等待500ms又按下后在等待1000ms后按下就是兩短一長(zhǎng)。兩長(zhǎng)一短同理,但是實(shí)現(xiàn)起來有一個(gè)代碼我有點(diǎn)蒙蔽。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

12#
ID:895128 發(fā)表于 2021-4-8 13:13 | 只看該作者
dzbj 發(fā)表于 2021-4-8 12:32
用一個(gè)變量當(dāng)計(jì)數(shù)器 每按一下按鍵 計(jì)數(shù)器+一次 然后判斷變量值 運(yùn)行對(duì)應(yīng)的部分 大致框架如下 細(xì)節(jié)還需要補(bǔ) ...

這個(gè)實(shí)現(xiàn)的不是連續(xù)按鍵,是每一次按鍵對(duì)應(yīng)的事件吧。
回復(fù)

使用道具 舉報(bào)

13#
ID:895128 發(fā)表于 2021-4-8 14:31 | 只看該作者
突然想,能不能用按鍵中間時(shí)間間隔實(shí)現(xiàn)莫爾斯電碼的輸入。
回復(fù)

使用道具 舉報(bào)

14#
ID:895128 發(fā)表于 2021-4-8 14:51 | 只看該作者
#include<reg52.h>
#define N_key    0              //無鍵
#define S_key    1              //單鍵
#define D_key    2              //雙鍵
#define L_key    3              //長(zhǎng)鍵
#define C_key    4              //三擊鍵
#define E_key    5              //四擊鍵
#define F_key    6              //兩短一長(zhǎng)擊建
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
#define key_state_4 4
#define key_state_5 5
sbit key_input = P2^0;    // 按鍵輸入口
unsigned char time_10ms_ok = 0;
unsigned char key = 0;

unsigned char key_driver(void)
{
    static unsigned char key_state = key_state_0, key_time = 0;
    unsigned char  key_return = N_key;
        bit key_press;

    key_press = key_input;                    // 讀按鍵I/O電平

    switch (key_state)
    {
      case key_state_0:                              // 按鍵初始態(tài)
        if (key_press) key_state = key_state_1;      // 鍵被按下,狀態(tài)轉(zhuǎn)換到按鍵消抖和確認(rèn)狀態(tài)
        break;
      
      case key_state_1:                      // 按鍵消抖與確認(rèn)態(tài)
        if (key_press)
        {
             key_time = 0;                   //  
             key_state = key_state_2;   // 按鍵仍然處于按下,消抖完成,狀態(tài)轉(zhuǎn)換到按下鍵時(shí)間的計(jì)時(shí)狀態(tài),但返回的還是無鍵事件
        }
        else
             key_state = key_state_0;   // 按鍵已抬起,轉(zhuǎn)換到按鍵初始態(tài)。此處完成和實(shí)現(xiàn)軟件消抖,其實(shí)按鍵的按下和釋放都在此消抖的。
        break;
      
      case key_state_2:
        if(!key_press)
        {
             key_return = S_key;        // 此時(shí)按鍵釋放,說明是產(chǎn)生一次短操作,回送S_key
             key_state = key_state_0;   // 轉(zhuǎn)換到按鍵初始態(tài)
        }
        else if (++key_time >= 100)     // 繼續(xù)按下,計(jì)時(shí)加10ms(10ms為本函數(shù)循環(huán)執(zhí)行間隔)
        {
             key_return = L_key;        // 按下時(shí)間>1000ms,此按鍵為長(zhǎng)按操作,返回長(zhǎng)鍵事件
             key_state = key_state_3;   // 轉(zhuǎn)換到等待按鍵釋放狀態(tài)
        }
        break;

      case key_state_3:                 // 等待按鍵釋放狀態(tài),此狀態(tài)只返回?zé)o按鍵事件
        if (!key_press) key_state = key_state_0; //按鍵已釋放,轉(zhuǎn)換到按鍵初始態(tài)
        break;
    }
    return key_return;
}

/*=============
中間層按鍵處理函數(shù),調(diào)用低層函數(shù)一次,處理雙擊事件的判斷,返回上層正確的無鍵、單鍵、雙鍵、長(zhǎng)鍵4個(gè)按鍵事件。
本函數(shù)由上層循環(huán)調(diào)用,間隔10ms
===============*/

unsigned char key_read(void)
{
    static unsigned char key_m = key_state_0, key_time_1 = 0;
    unsigned char key_return = N_key,key_temp;
     
    key_temp = key_driver();
     
    switch(key_m)
    {
         case key_state_0:
            if (key_temp == S_key )
            {
                 key_time_1 = 0;               // 第1次單擊,不返回,到下個(gè)狀態(tài)判斷后面是否出現(xiàn)雙擊
                 key_m = key_state_1;
            }
            else
                 key_return = key_temp;        // 對(duì)于無鍵、長(zhǎng)鍵,返回原事件
            break;

          case key_state_1:
            if (key_temp == S_key)             // 又一次單擊(間隔肯定<500ms)
            {
                 key_return = D_key;           // 返回雙擊鍵事件,回初始狀態(tài)
                 key_m = key_state_0;
            }
            else                                
            {                                  // 這里500ms內(nèi)肯定讀到的都是無鍵事件,因?yàn)殚L(zhǎng)鍵>1000ms,在1s前低層返回的都是無鍵
                 if(++key_time_1 >= 50&&++key_time_1 <= 75)
                 {
                      key_return = E_key;      // 500ms內(nèi)沒有再次出現(xiàn)單鍵事件,返回上一次的單鍵事件
                      key_m = key_state_0;     // 返回初始狀態(tài)
                 }
                 else
                                                                         if(++key_time_1 >= 75)

                 {
                      key_return = S_key;      // 500ms內(nèi)沒有再次出現(xiàn)單鍵事件,返回上一次的單鍵事件
                      key_m = key_state_0;     // 返回初始狀態(tài)
                 }

            }
                                                 
                                                 
                                                 
             break;
               
                return key_return;
}     

void main()
{
        P0 = 0xff;        //IO口初始化
        P2 = 0x00;  //定時(shí)器的初始化                                                  
        TMOD = 0x01;                           //選擇定時(shí)器的工作模式:定時(shí)器0,方式1
        TH0 = (65535 - 10000)/256; //定時(shí)器的初值
        TL0 = (65535 - 10000)%256;
        EA = 1;                                           //開打總中斷使能
        ET0 = 1;                                   //打開定時(shí)器0 的使能
        TR0 = 1;                                   //打開定時(shí)器0 ,開始工作

        while(1)
        {
                if(time_10ms_ok)          //time_10ms_ok = 1,表示計(jì)時(shí)到了10MS。(10MS掃描一次按鍵)
                {
                        time_10ms_ok = 0; //清除計(jì)時(shí)10MS標(biāo)志
                        key = key_read(); //調(diào)用掃描按鍵程序,返回一個(gè)鍵值

                        if (key == L_key) //長(zhǎng)按:點(diǎn)亮P1口上的8個(gè)LED燈。(低電平點(diǎn)亮)
                        {
                                P0 = 0x00;
                        }  
            else if(key == D_key)//雙擊:點(diǎn)亮P1口上第二個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0xfd;
                        }  
            else if(key == S_key)//單擊:點(diǎn)亮P1口上第一個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0xfe;
                        }
                              else if(key == C_key)//單擊:點(diǎn)亮P1口上第1個(gè)和第二個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0xfc;//11111100
                        }
                              else if(key == E_key)//單擊:點(diǎn)亮P1口上第1個(gè)和第二個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0xf0;//11110000
                        }
                               else if(key == F_key)//單擊:點(diǎn)亮P1口上第1個(gè)和第二個(gè)LED燈。(低電平點(diǎn)亮)  
            {
                                P0 = 0x70;//11110000
                        }
                }
        }
}

void timer0(void) interrupt 1        //用的是定時(shí)器0, 這個(gè)“interrupt 1”中的“1”代表1號(hào)中斷即是定時(shí)器0中斷。如果是“0”就是外部中斷0;“2“=外部中斷1;”3“定時(shí)器1中斷;”4“=串行口中斷
{
        TH0 = (65535 - 10000)/256;
        TL0 = (65535 - 10000)%256; //定時(shí)器0的方式1,得在中斷程序中重復(fù)初值。
        time_10ms_ok = 1;  //定時(shí)10MS 的標(biāo)志
}


led.c(117): error C141: syntax error near 'void'

報(bào)錯(cuò),求助。
回復(fù)

使用道具 舉報(bào)

15#
ID:584814 發(fā)表于 2021-4-20 08:23 | 只看該作者
unsigned char key_read(void) 尾巴上少了個(gè) }
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表