找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机怎样实现按键按下数字连加?

[复制链接]
跳转到指定楼层
楼主
ID:101869 发表于 2021-6-27 21:34 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
弱弱的问下  按键按下mun怎样实现连续加也就是按下按键1.2.3.4.5这样,我用的mum++按着不放手就只+1不能连续加 请老师们指导下
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:945591 发表于 2021-6-27 23:11 | 只看该作者
这个可以通过定时器来实现,比如当按键时间小于2秒时,按一次加1,当超过2秒时,没50毫秒加1实现连加功能。例程如下:
#include<reg51.h>
unsigned int a;
unsigned char times;
sbit key=P1^0;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
if(times>40)
{
a++;
printf("%d",a);
}
回复

使用道具 举报

板凳
ID:101869 发表于 2021-6-28 08:34 来自手机 | 只看该作者
gxbdf 发表于 2021-6-27 23:11
这个可以通过定时器来实现,比如当按键时间小于2秒时,按一次加1,当超过2秒时,没50毫秒加1实现连加功能。 ...

如果不用定时器呢
回复

使用道具 举报

地板
ID:707333 发表于 2021-6-28 08:52 | 只看该作者
用循环也可以,每次循环检测到按键仍然按下内部变量k就加一(没继续按下就k=0,考虑防抖会复杂一点);当k=100(或者其他值),实现连加,同时k=0,,,大致这样子

循环时注意需要给其他处理留出时间
回复

使用道具 举报

5#
ID:830240 发表于 2021-6-28 09:44 | 只看该作者
学习长短按键的实现方法,就会这个了,长按键网上很多例子
回复

使用道具 举报

6#
ID:313048 发表于 2021-6-28 09:47 | 只看该作者
可以用定时器定时扫描,也可以再主循环中用状态机也可以。
回复

使用道具 举报

7#
ID:313048 发表于 2021-6-28 09:49 | 只看该作者

用状态机,2个状态,状态1是读取,状态2执行操作,在状态1读取到按下后,跳转到状态2读取按下,执行加操作后,跳回状态1,重复执行就可以了。
回复

使用道具 举报

8#
ID:401564 发表于 2021-6-28 14:58 | 只看该作者
我也是在学C语言,这是我写的
如果你是用别的单片机型号,有上拉电阻也是可以亮灯的,延时部分要改一下,因为我这是24MHZ的
/*=========================================================================================
名称:单片机按键加1程序
作者:老玉
日期:20210625
最后更新日期:20210627
电路编号:YGG_20210413.0_ST
MCU:STC88A4KS32
使用片上24MHZ时钟,
功能描述:这是学习C8051用的入门程序,单片机按键加1,单击加一次,长按一直加,并显示
;=========================================================================================*/
#include <REG52.h>
#define OUT P0                         //输出显示
sbit KEY=P3^2;                         //按键
sbit com0=P2^0;                         //数码管的COM引脚
sbit com1=P2^1;
sbit com2=P2^2;
sbit com3=P2^3;
sfr P0M0=0x94;                        //stc8A4K端口控制寄存器
sfr P0M1=0x93;                        
unsigned int NUM;
//=================================================
void delay(unsigned char i)                   //延时
{
        unsigned int k;
        for(i;i>0;i--)
                {
                 for(k=1000;k>0;k--);
                }
}
//=====================================================================================
unsigned char ledtab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
//=====================================================================================
void display()                        
{       
                         unsigned char bat;
                        if(NUM>1000)NUM=0x00;
                        bat=NUM%10;                                 //显示个位
                        OUT=ledtab[bat];
                        com0=0;
                        delay(10);
                        com0=1;

                        bat=NUM%100/10;                        //先求余100,再除以10,等到十位数
                        OUT=ledtab[bat];
                        com1=0;
                        delay(10);
                        com1=1;

                        bat=NUM%1000/100;
                        OUT=ledtab[bat];
                        com2=0;
                        delay(10);
                        com2=1;

                        bat=NUM/1000;
                        OUT=ledtab[bat];
                        com3=0;
                        delay(10);
                        com3=1;
}
//==================================================================================
void main()                                          //主程序
{
        P0M0=0xff;
        P0M1=0x00;
        KEY=1;
        while(1)
        {         
         unsigned char t;
         if(!KEY)                
                {
                        for(t=0;t<10;t++)display();
                        NUM++;
                }
         display();               
        }
}
//============================================================

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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