找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2380|回复: 7
收起左侧

c51单片机按键程序问题,求大神解答!

[复制链接]
ID:344175 发表于 2018-6-3 19:57 | 显示全部楼层 |阅读模式
小弟最近在制作一个单片机倒计时器,时间可调,但是只能每次按一下加1。想实现按着不动自己也会加,但是不知道怎么搞?求前辈赐教!!
回复

使用道具 举报

ID:277550 发表于 2018-6-3 23:06 | 显示全部楼层
那就是在一般的按键写法,修改一下,类似这样


if(k1==0){
        delay(1);
        if(k1==0){
                while(k1==0){
                        value++;
                        delay(100);
                }
        }
}

评分

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

查看全部评分

回复

使用道具 举报

ID:287575 发表于 2018-6-3 23:30 | 显示全部楼层
你可以编一个定时器中断,再用个定时器,如有按键按下启动定时器,比如这定时器超过1秒了,表示长按键连减或连加了,就启动定时器中断比如0.5秒改变到计时的值就可以了

评分

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

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2018-6-4 07:40 | 显示全部楼层
给你一个短按加减1,长按连加减的示例程序参考。按键端口按你的实际电路更改。
#include <REG51.H>
#define uint unsigned int                         //宏定义数据类型uint
#define uchar unsigned char                 //宏定义数据类型uchar
#define key_S 1000                                        //宏定义短按(约20ms)
#define key_L 30000                                        //宏定义长按(约2/3s)
#define key_M 20000                                        //宏定义长按(约1/3s)
sbit key1=P3^6;                                                //加键
sbit key2=P3^7;                                                //减键
uchar num=1;

void keyscan()                                                        //按键扫描
{
        static uint count1=0,count2=0;//计数变量
        if(!key1)   
        {  
                count1++;  
                if(count1>=key_L)                                //长按
                {
                        if(num<255)
                                num++;        
                        count1=key_M;
                }
        }  
        else                                                                        //按键抬起
        {  
                if(count1>key_S && count1<key_L)//短按
                {
                        if(num<255)
                                num++;
                }
                count1=0;                                                        //count1清0
        }   
        if(!key2)   
        {  
                count2++;  
                if(count2>=key_L)                                //长按
                {
                        if(num>0)
                                num--;        
                        count2=key_M;
                }
        }  
        else                                                                        //按键抬起
        {  
                if(count2>key_S && count2<key_L)//短按
                {
                        if(num>0)
                                num--;
                }
                count2=0;                                                        //count2清0
        }
}

void main()
{
        while(1)
        {
                keyscan();                                //按键扫描
                P1=~num;                                        //LED显示,低电平亮
        }
}
回复

使用道具 举报

ID:7485 发表于 2018-6-4 08:38 | 显示全部楼层
思路就是扫描检测按键,设置一个循环次数计数单元,如果循环达到N次(根据你自己的要求和扫描延时10~40次,一般总共半秒为宜)如果还是按下状态,就加1,然后循环次数计数置0,继续检测......。循环次数也可以逐渐减小,也就是加1的时间逐渐加快,自己试验着调。
回复

使用道具 举报

ID:344466 发表于 2018-6-4 10:46 | 显示全部楼层
编一个定时器中断程序,设置数码管动态显示。
回复

使用道具 举报

ID:329794 发表于 2018-6-4 20:32 来自手机 | 显示全部楼层
利用中断,如果有需要,我有60秒倒计时,可改
回复

使用道具 举报

ID:344175 发表于 2018-7-15 21:27 | 显示全部楼层
devcang 发表于 2018-6-3 23:06
那就是在一般的按键写法,修改一下,类似这样

小弟试试,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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