找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 26109|回复: 18
打印 上一主题 下一主题
收起左侧

求STC89C52单片机 独立按键的代码,要求只需要用一个按键控制一个led灯

  [复制链接]
跳转到指定楼层
楼主
ID:73449 发表于 2015-4-11 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求STC89C52单片机 独立按键的代码,要求只需要用一个按键控制一个led灯,第一次按下,灯亮,再按,灯灭,依此类推
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:74245 发表于 2015-4-11 22:55 | 只看该作者
入门问题,这个只能靠自己了
回复

使用道具 举报

板凳
ID:76471 发表于 2015-4-12 08:41 | 只看该作者
/***********************************************************************************************************************************************
按一下灯亮,按一下灯灭
***********************************************************************************************************************************************/

#include<reg52.h>

sbit S1=P1^4;                                                                //将S1位定义为P1^4,检测独立按键
sbit led0=P1^0;                                                        //将led0定义为P1.0口的LED

/***********************************************************************************************************************************************
延时函数
***********************************************************************************************************************************************/
void delay(void)
{
        unsigned int i;
        for(i=5000;i>0;i--)
        ;
}
/***********************************************************************************************************************************************
主函数
***********************************************************************************************************************************************/
void main(void)
{
while(1)
{
        if(S1==0)                                                                //判断是否有键按下
        {
                delay();                                                        //有键按下,延时去抖,真正应用时要少用这种延时,占用时间,用定时器延时或一个寄存器循环检测10多次按键

                if(F0==0)                                                        //用F0标志位判断键按下是否已经处理,因刚学C语言没多久,
                                                                                        //不知道怎么定义RAM能位寻址的寄存器,先用F0,按键多的话,一个F0不够用
                {
                        F0=1;                                                         //F0置1,表示这次按键按下已处理
                        led0=~led0;                                                //将LED亮灭状态取反
                }
        }

        else                                                                         //S1=1说明按键释放
        {
                F0=0;                                                                //F0清零,清按键已处理标志
        }
}
}


此程序自己编写,经测试OK

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:76471 发表于 2015-4-12 09:50 | 只看该作者
/****************************************************************************
按一下灯亮,按一下灯灭
*****************************************************************************/

#include<reg52.h>

sbit S1=P1^4;                                        //将S1位定义为P1^4,检测独立按键
sbit led0=P1^0;                                //将led0定义为P1.0口的LED

/************************************************************************
延时函数
***************************************************************************/
void delay(void)
{
        unsigned int i;
        for(i=5000;i>0;i--)
        ;
}
/**************************************************************************
主函数
****************************************************************************/
void main(void)
{
while(1)
{
        if(S1==0)                                                //判断是否有键按下
        {
                delay();                                        //有键按下,延时去抖,真正应用时要少用这种延时,占用时间,用定时器延时或一个寄存器循环检测10多次按键

                if(S1==0)
                {
                        if(F0==0)                                //用F0标志位判断键按下是否已经处理,因刚学C语言没多久,不知道怎么定义RAM能位寻址的寄存器,先用F0,按键多的话,一个F0不够用
                        {
                                F0=1;                                 //F0置1,表示这次按键按下已处理
                                led0=~led0;                        //将LED亮灭状态取反
                        }
                }
        }

        else                                                         //S1=1说明按键释放
        {
                F0=0;                                                //F0清零,清按键已处理标志
        }
}
}


上面程序漏了一个if语句,要不延时去抖没作用,汗
回复

使用道具 举报

5#
ID:76471 发表于 2015-4-12 10:12 | 只看该作者
/****************************************************************************
按一下灯亮,按一下灯灭
*****************************************************************************/

#include<reg52.h>

sbit S1=P1^4;                                        //将S1位定义为P1^4,检测独立按键
sbit led0=P1^0;                                //将led0定义为P1.0口的LED

/************************************************************************
延时函数
***************************************************************************/
void delay(void)
{
        unsigned int i;
        for(i=5000;i>0;i--)
        ;
}
/**************************************************************************
主函数
****************************************************************************/
void main(void)
{
while(1)
{
        if(S1==0)                                                //判断是否有键按下
        {
                delay();                                        //有键按下,延时去抖,真正应用时要少用这种延时,占用时间,用定时器延时或一个寄存器循环检测10多次按键

                if(S1==0)
                {
                        if(F0==0)                                //用F0标志位判断键按下是否已经处理,因刚学C语言没多久,不知道怎么定义RAM能位寻址的寄存器,先用F0,按键多的话,一个F0不够用
                        {
                                F0=1;                                 //F0置1,表示这次按键按下已处理
                                led0=~led0;                        //将LED亮灭状态取反
                        }
                }
        }

        else                                                         //S1=1说明按键释放
        {
                F0=0;                                                //F0清零,清按键已处理标志
        }
}
}


上面程序漏了一个if语句,要不延时去抖没作用,汗

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:73156 发表于 2015-4-12 10:23 | 只看该作者
入门问题,这个只能靠自己,看郭天祥视频

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:73449 发表于 2015-4-13 14:46 | 只看该作者
panzishi123456 发表于 2015-4-12 10:12
/****************************************************************************
按一下灯亮,按一下灯 ...

非常感谢
回复

使用道具 举报

8#
ID:73449 发表于 2015-4-13 15:17 | 只看该作者
panzishi123456 发表于 2015-4-12 10:12
/****************************************************************************
按一下灯亮,按一下灯 ...

F0的标志位不需要提前先定义麽?
回复

使用道具 举报

9#
ID:76471 发表于 2015-4-13 18:16 | 只看该作者
lucyhyr 发表于 2015-4-13 15:17
F0的标志位不需要提前先定义麽?

F0是PSW的,头文件已经定义了
回复

使用道具 举报

10#
ID:73449 发表于 2015-4-13 20:13 | 只看该作者
panzishi123456 发表于 2015-4-13 18:16
F0是PSW的,头文件已经定义了

哦哦,谢谢
回复

使用道具 举报

11#
ID:76471 发表于 2015-4-13 21:32 | 只看该作者

不客气,以前我也试过学习时有一些问题卡住,难以解决的痛苦,有人知道提示一下能少走很多弯路

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

12#
ID:112693 发表于 2016-4-18 13:27 | 只看该作者
哪位大师能写个,四按键四LED的,多谢,在线等
回复

使用道具 举报

13#
ID:114869 发表于 2016-4-18 14:42 | 只看该作者
这个靠自己来理解了
回复

使用道具 举报

14#
ID:114960 发表于 2016-4-18 15:44 | 只看该作者
百度啊
回复

使用道具 举报

15#
ID:112693 发表于 2016-4-18 23:47 | 只看该作者
百度没有
回复

使用道具 举报

16#
ID:161556 发表于 2017-1-13 07:19 | 只看该作者
dragon19790000 发表于 2016-4-18 13:27
哪位大师能写个,四按键四LED的,多谢,在线等

我也是初学者,我认为,你把他复制4份,改一下端口,融合在一起就行
回复

使用道具 举报

17#
ID:161488 发表于 2017-1-15 18:16 | 只看该作者
有没有汇编程序
回复

使用道具 举报

18#
ID:161909 发表于 2017-1-15 19:00 | 只看该作者
百度找找,我是来凑数子的。。。。
回复

使用道具 举报

19#
ID:248171 发表于 2017-11-10 20:40 | 只看该作者
#include <reg52.h> sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit k1=P3^1; sbit k2=P3^0; sbit k3=P3^2; sbit k4=P3^3; void delay(int i) {     while(i--); } void key() {     if(k1==0)         {            delay(100);            if(k1==0)            {                led1=~led1;            }            while(!k1);         }         if(k2==0)         {            delay(100);            if(k2==0)            {                led2=~led2;            }            while(!k2);         }         if(k3==0)         {            delay(100);            if(k3==0)            {                led3=~led3;            }            while(!k3);         }         if(k4==0)         {            delay(100);            if(k4==0)            {                led4=~led4;            }            while(!k4);         } } void main() {     while(1)         {         key();         } }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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