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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

單片機源程序如下:
#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;   //開定時器/計數器T0中斷        EX0 外部中斷0;EX1 外部中斷1;ET1 定時器/計數器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時 計數一下正好1us
        TR0 = 1;   //開啟定時器/計數器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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

取消就全量了啊
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

10#
ID:57657 發表于 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毫秒 根據晶振頻率計算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. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品精品 | av一二三区 | 一区二区三区四区av | 国产综合久久久久久鬼色 | 日韩精品一区二区三区在线播放 | 久草中文网 | 99久久免费观看 | 九九九视频精品 | 人人操日日干 | 青青草视频网站 | www日本高清视频 | 色接久久 | 国产区在线 | 成人在线免费观看 | 中文字幕日韩一区 | 亚洲免费在线 | 一区二区三区电影在线观看 | 欧美日韩精品影院 | 欧美阿v| 国产二区视频 | 黄色激情毛片 | 亚洲成人一区二区在线 | 成人免费一区二区三区视频网站 | 九九色九九 | 中文字幕1区 | 这里只有精品99re | 国产一区二 | 国产欧美一区二区三区国产幕精品 | 久久精品国产免费一区二区三区 | 天堂免费 | 国产视频久久 | 国内在线视频 | 久久久久久久久久久高潮一区二区 | 国产精品成人在线观看 | a毛片| 国产伦精品一区二区三区照片91 | 在线观看国产精品一区二区 | 91九色在线观看 | www.4虎影院| 国产福利在线免费观看 | 亚洲精品一级 |