找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1920|回复: 1
收起左侧

51单片机控制的LED风火轮显示效果

[复制链接]
ID:301968 发表于 2018-7-28 11:02 | 显示全部楼层 |阅读模式
QQ图片20180728105855.png /******************************
   配合原理图编写
   带编码器的直流小电机的控制软件

             2018-06-13
                                                 
                                                 内部晶体频率11.0592MHz

*******************************/

#include "STC15W40XXX.H"
#include "intrins.h"


sbit LEDA=P3^5;                          
sbit LEDB=P3^6;                          
sbit LEDC=P3^7;                          

sbit LED1=P1^0;                          
sbit LED2=P1^1;                          
sbit LED3=P1^2;       
sbit LED4=P1^3;                          
sbit LED5=P1^4;                          
sbit LED6=P1^5;       
sbit LED7=P1^6;
sbit LED8=P1^7;
                  

sbit KEY1=P3^4;       

bit key=0;
bit KeySta = 1; //当前按键状态
bit backup = 1; //按键值备份,保存前一次的扫描值
unsigned char cnt=14;

void Key_scan();                                  //按键扫描函数
void Key_Function();     //按键功能函数
void Delay5ms()                //@11.0592MHz
{
unsigned char i, j;

        _nop_();
        _nop_();
        i = 22;
        j = 128;
        do
        {
                while (--j);
        } while (--i);
}
void main()
{
        //定时器T0设定
        EA=0;                                    //关闭总中断
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x66;                 //设置定时初值
        TH0 = 0xFC;                 //设置定时初值
        TF0 = 0;                   //清除TF0标志
        TR0 = 1;                  //定时器0开始计时
        ET0=1;         //禁止T0中断

  EA = 1;   
        LEDA=LEDB=LEDC=0;
        P1=0X00;
       

               
        while(1)
{
        unsigned char i;
       
                if(key)
                {

                        LED1=1;LED2=0;for(i=0;i<cnt;i++){Delay5ms();}
                        LED2=1;LED3=0;for(i=0;i<cnt;i++){Delay5ms();}
                        LED3=1;LED4=0;for(i=0;i<cnt;i++){Delay5ms();}
                        LED4=1;LED5=0;for(i=0;i<cnt;i++){Delay5ms();}
                        LED5=1;LED6=0;for(i=0;i<cnt;i++){Delay5ms();}
                        LED6=1;LED7=0;for(i=0;i<cnt;i++){Delay5ms();}
                        LED7=1;LED8=0;for(i=0;i<cnt;i++){Delay5ms();}
                        LED8=1;LED1=0;for(i=0;i<cnt;i++){Delay5ms();}
                }
                else
                {
                        P1=0XFF;
                }
       
}



}

//定时器2中断入口
void t0int() interrupt 1   //中断入口
{
        static bit on=1;
   static unsigned int time1=0;
         time1++;
         
         if(on)
         {
    Key_scan();
          Key_Function();
         }
                 if(KEY1==0)
                 {
            time1++;
                 if(time1==1800)
                 {                       
                        if(KEY1==0)
                                {
                                        on=!on;       
           key=!key;                               
                                }                  
                 }
         
         }
         else
         {
                         time1=0;
         }
         
         
}



void Key_scan()//按键扫描函数
{
                static unsigned char keybuf = 0xFF; //扫描缓冲区,保存一段时间内的扫描值

        keybuf = (keybuf<<1) | KEY1; //缓冲区左移一位,并将当前扫描值移入最低位
        if (keybuf == 0x00)
                {                 //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下
                        KeySta = 0;
                }
        else if (keybuf == 0xFF)
                {         //连续 8 次扫描值都为 1,即 16ms 内都只检测到弹起状态时,可认为按键已弹起
                        KeySta = 1;
                }
                else
                {} //其它情况则说明按键状态尚未稳定,则不对 KeySta 变量值进行更新

}
void Key_Function()
{  

        if (KeySta != backup)         //当前值与前次值不相等说明此时按键有动作
        {
                if (backup == 0)                 //如果前次值为 0,则说明当前是弹起动作
                        {
                                  key=1;
                                cnt--;
                                if(cnt==9)
                                cnt=14;
                                       
                  }
                backup = KeySta;                 //更新备份为当前值,以备进行下次比较
        }


QQ图片20180728105855.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:237797 发表于 2018-7-28 16:39 | 显示全部楼层
有没有清晰的原理图?传上来学习一下!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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