soma 发表于 2024-6-7 22:15:44

GPIO学习笔记之模拟手电筒

本帖最后由 soma 于 2024-6-10 17:41 编辑

使用开天斧实现一个按键实现多种控制效果
#include <STC8H.H>
#define MAIN_Fosc 24000000UL
#define uint unsigned int
#define uchar unsigned char
uchar status = 0;
sbit key = P3^5; //按键
void delayms(uint ms)
{
         uint i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
}
void main(void)
{
      P2M0=0x00;P2M1=0x00;
      P3M0=0x00;P3M1=0x00;
      while(1)
      {
                if(!key)
                {
                        delayms(10); //软件防抖
                        if(!key)
                        {
                              status++;
                              if(status==1)
                              {
                                        P2=0xfe;//亮一灯
                              }
                              else if(status==2)
                              {      
                                        P2=0xf8;//亮3灯
                              }
                              else if(status==3)
                              {
                                        P2=0xc0;//亮6灯
                              }
                              else if(status==4)
                              {
                                        status=0;//关灯
                                        P2=0xff;
                              }
                              while(!key); //等待按键释放
                        }
                }
      }
}



jwd 发表于 2024-6-8 06:57:55

{:4_174:}

xxkj2010 发表于 2024-6-8 08:19:22

不错,你已经成功了一半!

zhange 发表于 2024-6-8 08:20:31

学习   主要原理是10毫秒把状态位加一    10ms太短了   1秒一改变 好控制{:4_200:}{:4_200:}{:4_200:}

18344371880 发表于 2024-6-8 08:47:28

我觉得,else if(status==4)这句改成≥4比较合适,目前就这么简单的循环,还好,万一任务多了,跑非了咋整

soma 发表于 2024-6-8 08:56:34

zhange 发表于 2024-6-8 08:20
学习   主要原理是10毫秒把状态位加一    10ms太短了   1秒一改变 好控制

只有按下按键状态位才加1,10ms是软件防抖。

soma 发表于 2024-6-8 08:59:49

18344371880 发表于 2024-6-8 08:47
我觉得,else if(status==4)这句改成≥4比较合适,目前就这么简单的循环,还好,万一任务多了,跑非了咋整
...

这个只是玩玩的。这种单按键多任务程序一般任务不会很多。

soma 发表于 2024-6-9 18:10:51

第二步,使用定时器实现闪灯效果,代码准备中。

ffzdh 发表于 2024-6-10 01:30:18

新手不懂请教一下代码

我在论坛看视频里讲的开头需要
sfr p0=0x80 ;
sfr p0m1=0x93;
sfr p0m0=0x94;

sfr p4=0xc0 ;
sfr p4m1=0xB3;
sfr p4m0=0xB4;

sfr p6=0xE8 ;
sfr p6m1=0xCB;
sfr p6m0=0xCC;

sbit P40=P4^0;
sbit P60=p6^0;

这里sbit P40=P4^0; 这个我的理解P40就等于 P4组第0个IOP60一样
但是为啥楼主没写这些?
还有就是只在代码里写了 P2=0xf8 这个0xf8是什么意思呢? P2=0xff 这个是关灯? 直接给P2赋值0xff就是全组关灯?
楼主能给解惑一下么 万分感谢

soma 发表于 2024-6-10 08:14:56

ffzdh 发表于 2024-6-10 01:30
新手不懂请教一下代码

我在论坛看视频里讲的开头需要


stc8h.h这个头文件已经对寄存器进行配置了,所以不用再次配置sfr。P2口是共阳LED,低电平开灯,所以0xff关闭P2所有LED。
页: [1] 2 3
查看完整版本: GPIO学习笔记之模拟手电筒