打印
[STC单片机]

请各位帮忙看看我的程序,如何实行松开P1口灯闪烁

[复制链接]
1063|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiangzb520|  楼主 | 2017-11-28 22:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人在学习51单片机,现在在做按键松开可以闪烁,如果下次再按就熄灭。代码如下,请各位大神帮忙分享下,最好给改进的代码,key1是另外一个按键,想按下这个按键,松开就可以闪烁,现在这个程序是要一直按住闪烁,松开无任何反映。

#include <STC90.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned char
sbit key=P2^0;
sbit key1=P2^1;
void Delay200ms()                //@12.000MHz
{
        unsigned char i, j, k;
        _nop_();
        _nop_();
        i = 3;
        j = 189;
        k = 92;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void Delay40ms()                //@12.000MHz
{
        unsigned char i, j, k;
        _nop_();
        _nop_();
        i = 2;
        j = 95;
        k = 43;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void Delay10ms()                //@12.000MHz
{
        unsigned char i, j;
        i = 117;
        j = 184;
        do
        {
                while (--j);
        } while (--i);
}
void main()
{
         uchar  a;
         P1=0Xff;
        while(1)
        {
                if(key==0)
                {
                  Delay10ms();
                  if(key==0)
                  {
                          a++;
                        if(a==9)          //如果a=9,那么就进行清零
                        {
                        a=0;
                        while(key==0);         //循环在按键判断
                  }
                 }
                switch(a)
                        {
                                case 1:P1=0X00;        Delay200ms();break;          //灯全亮
                                case 2:P1=0X7f;        Delay200ms();break;          //第一亮
                                case 3:P1=0Xbf;        Delay200ms();break;         //第二个亮
                                case 4:P1=0Xdf;        Delay200ms();break;
                                case 5:P1=0Xef;        Delay200ms();break;
                                case 6:P1=0Xf7;        Delay200ms();break;
                                case 7:P1=0Xfb;        Delay200ms();break;
                                case 8:P1=0Xfd;        Delay200ms();break;
                                case 0:P1=0Xfe;        Delay200ms();break;        //第8个亮
                        }
                }
                if(key1==0)
                {
                  Delay10ms();
                  if(key1==0)
                  {
                          P1=0X00;
                        Delay40ms();
                        P1=0Xff;
                        Delay10ms();
                        //while(1);
                        while (key==0);
                  }
                }
        }
}

相关帖子

沙发
一路向北lm| | 2017-11-28 22:30 | 只看该作者
还有按键啊?闪烁简单啊?

使用特权

评论回复
板凳
jiangzb520|  楼主 | 2017-11-29 12:19 | 只看该作者
一路向北lm 发表于 2017-11-28 22:30
还有按键啊?闪烁简单啊?

初学者,请群主附上代码,谢谢

使用特权

评论回复
地板
datouyuan| | 2017-11-29 14:30 | 只看该作者
本帖最后由 datouyuan 于 2017-11-29 15:14 编辑
#include <STC90.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned char
sbit key=P2^0;
sbit key1=P2^1;

void Delay10ms()                //@12.000MHz
{
        unsigned char i, j;
        i = 117;
        j = 184;
        do
        {
                while (--j);
        } while (--i);
}

void Delayms(uchar cnt)
{
        if(cnt==0) return;
        do
        {
                Delay10ms();
        } while (--cnt);
}

void Delay200ms()
{
        Delayms(20);
}



bit gb_ledflash=0;
void ledflash()
{
        static uchar ledflashcnt=5;

        if(--ledflashcnt) return;
        ledflashcnt=5;
        if(gb_ledflash)
        {
                P1=(~P1);
        }
}


uchar  key1_cnt=0;
void main()
{
        uchar  a;
        P1=0Xff;
        while(1)
        {
                Delay10ms();
                ledflash();
               
                if(key1==0)
                {
                        ++key1_cnt;
                        if(key1_cnt==0) --key1_cnt;
                        if(key1_cnt==5)
                        {
                                gb_ledflash=!gb_ledflash;
                        }
                }
                else
                {
                        key1_cnt=0;
                }
               
        }
}





帮你改成了:单次按下灯闪,双次按下,灯不闪。
另外延时函数你参考我的写法。假如晶振变更了,只要修改一个函数,修改移植更方便些。

使用特权

评论回复
5
jiangzb520|  楼主 | 2017-11-29 21:22 | 只看该作者
datouyuan 发表于 2017-11-29 14:30
帮你改成了:单次按下灯闪,双次按下,灯不闪。
另外延时函数你参考我的写法。假如晶振变更了,只要修改 ...

谢谢,我有点看不懂这些意思,能注释下吗?

使用特权

评论回复
6
lhj07260420| | 2017-11-30 16:34 | 只看该作者
试试吧 这个 我也刚开始学的 !!!
#include "reg52.h"           //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;

sbit k1=P3^1;    //定义P31口是k1
sbit led=P2^0;   //定义P20口是led
sbit led1=P2^7;
u8 flag;
/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
    while(i--);
}


void keypros()
{
    if(k1==0)         //检测按键K1是否按下
    {   
        delay(500);   //消除抖动
        if(k1==0)    //再次判断按键是否按下
        {
            led=~led;
            flag=~flag;
  
        }
        while(!k1);  //检测按键是否松开
    }      
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/
void main()
{   
        flag=0;
    while(1)
    {   
        keypros();  //按键处理函数
        if(flag)
            {

                led1=0;
                delay(10000);
                    led1=1;
                delay(10000);
            }
    }      
}

使用特权

评论回复
7
datouyuan| | 2017-12-4 11:05 | 只看该作者
本帖最后由 datouyuan 于 2017-12-4 11:06 编辑
jiangzb520 发表于 2017-11-29 21:22
谢谢,我有点看不懂这些意思,能注释下吗?

你用了200mS、40mS、10mS这几个延时,都是在晶振12MHz下的,假如把晶振改了,你要把这几个函数都要调整一遍。

我的延时函数,你只需要调整10mS这一个延时函数,40mS是10mS的4倍,200mS是10mS的20倍,不需要调整。假如你还需要其它和10mS的倍数相关的延时,都不需要调整。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

190

帖子

3

粉丝