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); //等待按键释放
}
}
}
}
{:4_174:} 不错,你已经成功了一半! 学习 主要原理是10毫秒把状态位加一 10ms太短了 1秒一改变 好控制{:4_200:}{:4_200:}{:4_200:} 我觉得,else if(status==4)这句改成≥4比较合适,目前就这么简单的循环,还好,万一任务多了,跑非了咋整
zhange 发表于 2024-6-8 08:20
学习 主要原理是10毫秒把状态位加一 10ms太短了 1秒一改变 好控制
只有按下按键状态位才加1,10ms是软件防抖。 18344371880 发表于 2024-6-8 08:47
我觉得,else if(status==4)这句改成≥4比较合适,目前就这么简单的循环,还好,万一任务多了,跑非了咋整
...
这个只是玩玩的。这种单按键多任务程序一般任务不会很多。 第二步,使用定时器实现闪灯效果,代码准备中。 新手不懂请教一下代码
我在论坛看视频里讲的开头需要
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就是全组关灯?
楼主能给解惑一下么 万分感谢 ffzdh 发表于 2024-6-10 01:30
新手不懂请教一下代码
我在论坛看视频里讲的开头需要
stc8h.h这个头文件已经对寄存器进行配置了,所以不用再次配置sfr。P2口是共阳LED,低电平开灯,所以0xff关闭P2所有LED。