soma 发表于 2024-6-10 11:39:29

第二版增加闪灯板,可能不是很完善希望大家指正。#include <STC8H.H>
#define MAIN_Fosc 24000000UL
#define uint unsigned int
#define uchar unsigned char
uchar status = 0; //初始化状态字
sbit key = P3^5;//按键可自行更改
uchar tr0cnt = 0;                //TR0计数
uchar flash = 0xaa; //1,3,5,7交替闪灯
void delayms(uint ms)
{
    uint i;
    do {
      i = MAIN_Fosc / 6000;
      while(--i);
    } while(--ms);
}
void Timer0_Isr(void) interrupt 1
{
    tr0cnt++;
    P2 = flash;
    if(tr0cnt==50) //1秒闪一次
    {
      flash = ~flash;
      tr0cnt =0;
    }
}

void Timer0_Init(void)                //20毫秒@24.000MHz
{
    AUXR &= 0x7F;                        //定时器时钟12T模式
    TMOD &= 0xF0;                        //设置定时器模式
    TL0 = 0xC0;                                //设置定时初始值
    TH0 = 0x63;                                //设置定时初始值
    TF0 = 0;                                //清除TF0标志
    //TR0 = 1;                                //定时器0开始计时
    ET0 = 1;                                //使能定时器0中断
    EA =1;
}
void main(void)
{
    P2M0=0x00;
    P2M1=0x00;
    P3M0=0x00;
    P3M1=0x00;
    Timer0_Init();
    while(1)
    {
      if(!key)
      {
            delayms(10);
            if(!key)
            {

                status++;
                if(status==1)
                {
                  P2=0xfe; //P2.0亮灯
                }
                else if(status==2)
                {
                  P2=0xf8; //P2.0-P2.2亮灯
                }
                else if(status==3)
                {
                  P2=0xc0; //P2.0-P2.7亮灯
                }
                else if(status==4)
                {
                  TR0=1; //开启定时器
                }
                else if(status==5)
                {
                  TR0 = 0;//关闭定时器
                                                                                tr0cnt = 0;
                  status=0;
                                                                          P2=0xff; //灭灯
                }
                while(!key); //等待按键释放
            }
      }
    }
}

ffzdh 发表于 2024-6-10 12:58:29

soma 发表于 2024-6-10 08:14
stc8h.h这个头文件已经对寄存器进行配置了,所以不用再次配置sfr。P2口是共阳LED,低电平开灯,所以0xff ...

P2=0xf8这个呢 没看懂什么意思楼主能给解惑下么

soma 发表于 2024-6-10 13:13:58

本帖最后由 soma 于 2024-6-10 13:15 编辑

ffzdh 发表于 2024-6-10 12:58
P2=0xf8这个呢 没看懂什么意思楼主能给解惑下么

开天斧P2灯使用共阳只有低电平时才会亮灯,0xf8=11111000b,所以这时候P2.0,P2.1,P2.2亮灯,其余灯灭。

ffzdh 发表于 2024-6-10 13:34:21

soma 发表于 2024-6-10 13:13
开天斧P2灯使用共阳只有低电平时才会亮灯,0xf8=11111000b,所以这时候P2.0,P2.1,P2.2亮灯,其余灯灭。 ...

多谢楼主 貌似懂了 P2是整组开始的地址给个16进制相当于全部设置了一遍从高往低一位就是一个io

嵌入式之路 发表于 2024-6-10 16:18:27

我觉得再加一个延时消抖可能更好

soma 发表于 2024-6-10 17:04:37

嵌入式之路 发表于 2024-6-10 16:18
我觉得再加一个延时消抖可能更好

已经加了一个10ms的消抖了。

vb2002 发表于 2024-7-18 12:45:02

加个pwm,加个save.之前我有发一个,
挺好的.
飞哥帮忙写的
我加入了省电模式
可以自动保存当前亮度,下次开机就是那个亮度

vb2002 发表于 2024-7-18 12:45:27

#include "config.h"
sbit key = P3^2; //按键


void main ()
{

sys_init();
pwm_init();
               
        while(1)
{

                          if(!key)
                {       
                          
                          u8 status ;

                        delayms(10); //软件防抖
                        if(!key)
                        {
                              status++;
                              if(status==1)
                              {
                                        CCAP1H=5;//亮一灯
                              }
                              else if(status==2)
                              {      
                                       CCAP1H=50;//亮3灯
                              }
                              else if(status==3)
                              {
                                          CCAP1H=150;//亮6灯
                              }
                              else if(status==4)
                              {
                                        status=0;//关灯
                                       CCAP1H=0;
                              }
                              while(!key); //等待按键释放
                        }
                }

   }
}


soma 发表于 2024-7-18 12:48:55

vb2002 发表于 2024-7-18 12:45
加个pwm,加个save.之前我有发一个,
挺好的.
飞哥帮忙写的


PWM有计划加入现在还没开始写

vb2002 发表于 2024-7-18 12:54:27

soma 发表于 2024-7-18 12:48
PWM有计划加入现在还没开始写

我发出来这个代码就是我加入pwm的.
按一下亮度改变,按一下改变.占空比自己设置
页: 1 [2] 3
查看完整版本: GPIO学习笔记之模拟手电筒