找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2135|回复: 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 单片机教程网

快速回复 返回顶部 返回列表