找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)按鍵控制流水燈程序 不能切換方向的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1007138 發(fā)表于 2022-3-2 13:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
為什么只能右移不能左移啊,暫停也有用,但不能切換方向這是為什么?難道和定時器有關(guān)?

單片機(jī)源程序如下:
#include <reg52.h>
#include "intrins.h"

typedef unsigned char uchar;
typedef unsigned int uint;

uint i = 0;
uchar led = 0x01;
int flag = 1;

sbit key1 = P1^0;  
sbit key2 = P1^1;
sbit key3 = P1^2;

void delay(uint z) {  //1ms
        uint y;
        for (;z > 0; z--) {
                for (y = 0; y < 110; y++){
                }
        }
}

void DelayInit() {
         EA = 1;               
        ET0 = 1;   //開定時器/計數(shù)器T0中斷        EX0 外部中斷0;EX1 外部中斷1;ET1 定時器/計數(shù)器1;ES 串行口中斷;
        TMOD = 0x01;          //Gate = 0, C/T = 0(定時模式) ,M1M0 = 01 方式一16位定時
        TH0 = 60;  //初值高八位    (65536 - N) / 256
        TL0 = 176;        //初值低八位    (65536 - N) % 256   N = 50000時 50ms 12Mhz時 計數(shù)一下正好1us
        TR0 = 1;   //開啟定時器/計數(shù)器0
}

void Delay50ms() interrupt 1 {
        TH0 = 60;
        TL0 = 176;

        i++;
        if (i >= 20) {
                i = 0;
                if (flag == 1) {        
                        led = _crol_(led,1);
                }
                if (flag == 0) {
                        led = _cror_(led,1);
                }                 
        }
}

void keypros() {
        if (key1 == 0) {
                delay (10);   //消抖10ms
                if (key1 == 0) {
                        flag = 1;        
                }        
                //while (!key1);
        }
        if (key2 == 0) {
                delay (10);   //消抖10ms
                if (key2 == 0) {
                        flag = 0;        
                }        
                //while (!key2);
        }
        if (key3 == 0) {
                delay (10);   //消抖10ms
                if (key3 == 0) {
                        flag = -1;        
                }        
                //while (!key3);
        }
}

void main () {
        DelayInit();
        while (1) {
                P0 = led;
                keypros();
        }

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

使用道具 舉報

沙發(fā)
ID:121859 發(fā)表于 2022-3-2 19:27 | 只看該作者
while(1)循環(huán)里面的語句P0=led;取消就可以了。
回復(fù)

使用道具 舉報

板凳
ID:121859 發(fā)表于 2022-3-2 19:27 | 只看該作者
取消循環(huán)里面的語句:P0=led;
回復(fù)

使用道具 舉報

地板
ID:1007138 發(fā)表于 2022-3-2 19:31 | 只看該作者
zhxiufan 發(fā)表于 2022-3-2 19:27
while(1)循環(huán)里面的語句P0=led;取消就可以了。

取消就全量了啊
回復(fù)

使用道具 舉報

5#
ID:624769 發(fā)表于 2022-3-2 22:14 來自觸屏版 | 只看該作者
把暫停鍵和左移鍵互換,如互換后可以左移不可以暫停,則證明按鍵壞。
回復(fù)

使用道具 舉報

6#
ID:143186 發(fā)表于 2022-3-3 08:15 | 只看該作者
程序沒有問題,估計是按鍵電路上的問題
回復(fù)

使用道具 舉報

7#
ID:143186 發(fā)表于 2022-3-3 08:16 | 只看該作者
程序沒有問題,估計是按鍵電路上的問題
回復(fù)

使用道具 舉報

8#
ID:123289 發(fā)表于 2022-3-4 16:17 | 只看該作者
例如有8個LED燈,接在P1口上:
1、將各種顯示的方式列出一個EXCEL表:A列=燈狀態(tài),B列-時間。
2、例如左移雙燈500毫秒一次:A1=00000011,B1=500;A2=00000110,B2=500;A3=00001100,A3=500……
如此,你想怎么玩,就怎么玩:如何顯示,時間多久……
3、將這個EXCEL表,編程一個數(shù)組【燈狀態(tài)1,時間1;燈狀態(tài)2,時間2;……燈狀態(tài)N,時間N】
4、寫個程序,每次取出一組數(shù)據(jù)(燈狀態(tài)X,時間X),燈狀態(tài)X送P1口顯示,顯示時間由時間X決定,結(jié)束后取下一組……
思路簡單、清晰、還易實(shí)現(xiàn)。顯示機(jī)動靈活,修改數(shù)組就玩轉(zhuǎn)顯示方式了。做個紅心,弄個燈塔,擺個方陣,上移、下跳、斜跑……隨意,全在數(shù)組中編輯(EXCEL表中排排,導(dǎo)入到數(shù)組中),程序都不用改動。
回復(fù)

使用道具 舉報

9#
ID:1007138 發(fā)表于 2022-3-4 18:09 | 只看該作者
yzwzfyz 發(fā)表于 2022-3-4 16:17
例如有8個LED燈,接在P1口上:
1、將各種顯示的方式列出一個EXCEL表:A列=燈狀態(tài),B列-時間。
2、例如左 ...

大佬,不會玩啊我&#128514;,還是對著板子玩算了
回復(fù)

使用道具 舉報

10#
ID:57657 發(fā)表于 2022-3-4 19:01 | 只看該作者
按鍵消抖這樣寫,不要用delay
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define u32 unsigned long
  6. #define KEY_TIME 10     //按鍵消抖時間毫秒
  7. //定時器0 16位 12T時鐘 1毫秒 根據(jù)晶振頻率計算TH0與TL0初值:
  8. #define TH_1ms 0xFC
  9. #define TL_1ms 0x18

  10. sbit sKey1 = P1 ^ 0;
  11. sbit sKey2 = P1 ^ 1;
  12. sbit sKey3 = P1 ^ 2;
  13. u8 bdata b8;
  14. sbit Key1 = b8 ^ 0;
  15. sbit Key2 = b8 ^ 1;
  16. sbit Key3 = b8 ^ 2;

  17. void InitTimer0(void){
  18.     TMOD = 0x01;
  19.     TH0 = TH_1ms;
  20.     TL0 = TL_1ms;
  21.     EA = 1;
  22.     ET0 = 1;
  23.     TR0 = 1;
  24. }
  25. u8 led = 1;
  26. u8 flag;
  27. void main(){
  28.     InitTimer0();
  29.     while (1) {
  30.         if (!Key1) {
  31.             flag = 1;
  32.             while (!Key1);
  33.         }

  34.         if (!Key2) {
  35.             flag = 0;
  36.             while (!Key2);
  37.         }

  38.         if (!Key3) {
  39.             flag = 2;
  40.             while (!Key3);
  41.         }
  42.     }
  43. }

  44. void Timer0Interrupt() interrupt 1 {
  45.     static u16 ms;
  46.     static u8 K1ms, K2ms, K3ms;
  47.     TH0 = TH_1ms;
  48.     TL0 = TL_1ms;
  49.     if (sKey1) {
  50.         K1ms = 0;
  51.     } else {
  52.         if (K1ms != 0xFF) {
  53.             K1ms++;
  54.         }
  55.     }
  56.     if (sKey2) {
  57.         K2ms = 0;
  58.     } else {
  59.         if (K2ms != 0xFF) {
  60.             K2ms++;
  61.         }
  62.     }

  63.     if (sKey3) {
  64.         K3ms = 0;
  65.     } else {
  66.         if (K3ms != 0xFF) {
  67.             K3ms++;
  68.         }
  69.     }
  70.     Key1 = !(K1ms >= KEY_TIME);
  71.     Key2 = !(K2ms >= KEY_TIME);
  72.     Key3 = !(K3ms >= KEY_TIME);
  73.     if (++ms >= 100) {
  74.         ms = 0;
  75.         switch (flag) {
  76.             case 1:led = _crol_(led, 1); break;
  77.             case 2:led = _cror_(led, 1); break;
  78.         }
  79.     }

  80.     P0 = ~led;
  81. }
復(fù)制代碼
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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