CrazyTiger

stm8自学笔记 2016/3/12

1
阅读(2851)

【流水灯例程】

*基本语言*

    1,LED1_Open();    //点亮LED

    2,LED2_Close();    //熄灭LED

    3,LED1_Toggle();    //闪烁LED

    4,delay();    //延迟函数

*代码组成*

    1,定义延迟函数

        void delay()
        {
         int i,j;
          for(i=0;i<1000;i++)
           {
             for(j=0;j<1000;j++);
           }
         }

     //如果没有定义的话会有一个警告和一个错误提示

      (Warning[Pe223]: function "delay" declared implicitly;

       Error[Li005]: no definition for "delay" )

    

    2,定义主函数

        int main(void)
                        {
                             CLK_CKDIVR&= (uint8_t)(~0x18);/*时钟复位*/
                              /*设置内部高速时钟16M为主时钟*/
                              CLK_CKDIVR|= (uint8_t)0x00;

                              /*!<Set High speed internal clock */
                               LED_Init();
                               while(1231)
                                   {
                                        LED1_Toggle();
                                       delay();
                                    }

                           }

        //貌似while()里面的这个数字可以输入任意大于1的整数;

          LED_Init()的作用是初始化 然后后面的状态什么的

          都是在它初始化的基础上弄得;


    3,定义头文件

        void LED_Init(void)

        {
         PF_DDR|=0xe0;   // 设置数据方向寄存器 1为输出,0为输入*/
         PF_CR1|=0xe0;   //设置推挽输出 */
         PF_CR2|=0xe0;   //设置输出频率 1为10M,0为2M

        }         

       //定义LED_Init函数,并且设置相关数据;


        void LED1_Toggle(void)
        {
         PF_ODR_ODR5=!PF_ODR_ODR5;
        }

       //定义LED1_Toggle函数;

*程序执行*

    此时LED1在不停的闪烁 LED2和LED2处于点亮状态;

*代码变形*

    1,将while循环里面的 delay();去掉 即  

         while(1231)
           {
               LED1_Toggle();

           }

        3个LED灯均处于点亮状态 无闪烁现象

    2,在while循环里面添加多个 

        LED1_Toggle();

        delay();

       程序运行正常 闪烁频率等现象均无变化


    3,将while里面改成

         LED1_Toggle();
             delay();
         LED2_Toggle();
             delay(); 
         LED3_Toggle();
             delay();

        LED1闪烁频率变慢 LED2和LED3闪烁 3个LED灯依次闪烁

        出现传说中的流水灯现象 闪烁形式为1-2-3-1-2-3-循环


    4,给上述代码末尾加入 LED2_Close(); 即

         LED1_Toggle();
             delay();
         LED2_Toggle();
             delay(); 
         LED3_Toggle();
             delay();
     

         LED2_Close();    

        LED2闪烁频率明显变快 出现新的流水灯现象 闪烁形式

        为1-2-3-2-1-2-3-循环 其中1-2-3比3-2-1“走”的快些


    5,给上述代码末尾加入 delay(); 即

         LED1_Toggle();
             delay();
         LED2_Toggle();
             delay(); 
         LED3_Toggle();
             delay();     

         LED2_Close();   

             delay(); 

        LED2闪烁频率比LED1和LED3快 比3中代码慢

        依旧是上述闪烁方式但是由于频率变慢会显得有点别扭


    6,将上述代码 LED2_Close();-->LED2_Open(); 即

         LED1_Toggle();
             delay();
         LED2_Toggle();
             delay(); 
         LED3_Toggle();
             delay();     

         LED2_Open();   

             delay(); 

        LED2闪烁频率和4中相同 程序执行时LED2和LED3先亮

        LED1先熄灭后点亮 实现闪烁 此时已无流水灯现象


   7,上述代码取消末尾 delay(); 即

         LED1_Toggle();
             delay();
         LED2_Toggle();
             delay(); 
         LED3_Toggle();
             delay();     

         LED2_Open();   

        3个LED灯闪烁频率均增快 依旧是LED2闪烁频率最快

*疑惑之处*

    1,怎样通过CLK_CKDIVR&= (uint8_t)(~0x18);实现时钟复位的?

    2,while()里面的数字含义是什么 可以任意输入吗?

    3,怎样设置LED闪烁频率?

    4,delay()函数对上述实验的影响原理是什么?

*温馨备注*     

    1,上述实验现象均为肉眼观测 与实际可能会有些许误差;

    2,本人刚开始入门stm8 有说明错误的地方欢迎大家指出;

    3,希望各位前辈在有幸看到此篇文章时能够多多指教 不胜感激;