找回密码
 立即注册

QQ登录

只需一步,快速开始

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

需要通过按键K2、K3分别实现长按连续加、连续减的功能,短按已实现,如何修改单片机程序

[复制链接]
跳转到指定楼层
楼主
谢谢大家,单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit buz=P3^0;
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar count,shi,ge,dcount,dicount;
unsigned int n = 0;
void delay(int ms)
{
   uchar i,j;
   for(i=ms;i>0;i--)
   for(j=200;j>0;j--);
}
void init()
{
        P0=0x6f;
        P2=0x6f;
        P1=0xff;
        buz=0;
        TMOD=0x01;
        IE=0x82;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=1;
        dcount=99;      
}
void keyscan()
{
     if(k1==0)
     {    delay(5);
          if(k1==0)
         {   
                  TR0=0;
         }
      }               
     if(TR0==0)
     {
       if(k2==0)
      {  delay(5);
if(k2==0)
              {
                  dcount++;
                  if(dcount==100)
                  dcount=0;
                  while(!k2)
              {      
                   shi=dcount/10;
                   ge=dcount%10;
                    P0=duan[shi];
                     P2=duan[ge];
               }
               }

        }
                      if(k3==0)
        {             delay(5);
                    if(k3==0)
               {
                       dcount--;
                      if(dcount==-1)
                  dcount=99;
                    while(!k3)
                {
                    shi=dcount/10;
                         ge=dcount%10;
                            P0=duan[shi];
                           P2=duan[ge];
                 }
               }

                        }
                }

              if(k4==0)
              {       delay(5);
                      if(k4==0)
                  {
                        TR0=1;

                   }
              }  



}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        if(++count==20)
        {
        count=0;
        dcount--;
        if(dcount==-1)
        {
        TR0=0;
        while(k1!=0)
          {
                P0=0x00;
                P2=0x00;
                buz=1;
                delay(1000);
                P0=0x3f;
                P2=0x3f;
                buz=0;
                delay(1000);
                }
        dcount=99;
        }
        shi=dcount/10;
        ge=dcount%10;
        P0=duan[shi];
        P2=duan[ge];
        }

}
void main()
{
   init();
   while(1)
     {
      keyscan();
      }

}

屏幕截图 2022-12-19 150929.jpg (174.19 KB, 下载次数: 43)

屏幕截图 2022-12-19 150929.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:45879 发表于 2022-12-19 17:57 | 只看该作者
在松开按键里面做文章  while(!k2)   while(!k3)
回复

使用道具 举报

板凳
ID:1056573 发表于 2022-12-20 02:10 | 只看该作者
设置个flag标志,增加void keyDown()和void keyUP():按下键flag=1,松开按键flag=0。在void keyscan()里加while(flag)函数,若果flag==1就循环连续加或减,若flag==0就退出循环。

评分

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

查看全部评分

回复

使用道具 举报

地板
ID:1056573 发表于 2022-12-20 03:47 | 只看该作者
加void Keyup()和void KeyDown(),设置个flag标志按键按下和松开。
回复

使用道具 举报

5#
ID:161164 发表于 2022-12-20 09:55 | 只看该作者
  1. while(!k2)
  2. {
  3.         shi=dcount/10;
  4.         ge=dcount%10;
  5.         P0=duan[shi];
  6.         P2=duan[ge];
  7.         delay1ms();
  8.         if(DelayCnt++>=500)
  9.         {
  10.                 DelayCnt=0;
  11.                 dcount++;
  12.         }
  13. }
复制代码


回复

使用道具 举报

6#
ID:839835 发表于 2022-12-20 11:19 | 只看该作者
不要在定时器中断做这么多操作,只做计数即可。长按其实很简单
void scan()
{
static  uin32t_t cnt;
if(k2== 0) //按键按下
{
   cnt++;
   if(cnt >=100000)//数据越大,时间越长
   {
     cnt  = 0;
      //长按功能
   }
}


}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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