基于51单片机的独立按键和矩阵按键用法

发布时间:2024-08-12  

主要实现如图所示的功能

将主函数以外的函数全部放在qiyu.h文件中


  1 //qiyu.h

  2 #define KEY_PORT      P1

  3 #define led           P2

  4 #define unchar unsigned char

  5 #define uint unsigned int

  6 

  7 sbit Buz = P1^5;

  8 sbit LED  = P2^0;

  9 sbit K1 = P3^0;

 10 sbit K2 = P3^1;

 11 sbit K3 = P3^2;

 12 sbit K4 = P3^3;

 13 

 14 char tzsta,msta,val=0;

 15 int seccnt,temp,m=0,j,b;

 16 

 17 

 18 void ini()//定时器

 19 { 

 20     seccnt=0;    

 21     msta=tzsta=0;

 22     TMOD=0x01;

 23     TH0=0xFF;

 24     TL0=0x9C;

 25     TR0=1;     //开启定时器0

 26     

 27 }

 28 

 29 void delay(int p)

 30 {

 31     while(p--);

 32 }

 33 void keyscan()//独立按键

 34 {

 35     if(K1==0)

 36         {

 37             delay(5);

 38             if(K1==0)

 39             {

 40                 msta=1;

 41             }

 42         }

 43         if(K2==0)

 44         {

 45             delay(5);

 46             if(K2==0)

 47             {

 48                 msta=2;

 49             }

 50         }

 51       if(K3==0)

 52         {

 53             delay(5);

 54           if(K3==0)

 55             {

 56                 msta=3;

 57             }

 58         }

 59         if(K4==0)

 60         {

 61             delay(5);

 62             if(K4==0)

 63             {

 64                 msta=4;

 65             }

 66         }

 67 }

 68 

 69 char KeyScan1()//矩阵按键

 70 {

 71     KEY_PORT = 0x0f;        // P1.0-1.3输出高电平,P1.4-P1.7输出低电平

 72     if (KEY_PORT != 0x0f)    // 读取KEY_PORT看是否有按键按下

 73     {

 74         delay(10);        // 延时消抖

 75         if (KEY_PORT != 0x0f)        // 确认确实有按键按下

 76         {

 77             // 先确定按键发生在第几列

 78             switch (KEY_PORT)

 79             {

 80                 case 0x07 :    val = 1;     break;

 81                 case 0x0b :    val = 2;    break;

 82                 case 0x0d : val = 3;    break;

 83                 case 0x0e :    val = 4;    break;

 84                 default      :             break;

 85             }

 86 

 87             // 再确定按键发生在第几行

 88             KEY_PORT = 0xf0;

 89             switch (KEY_PORT)

 90             {

 91                 case 0x70:    val = val + 0;    break;

 92                 case 0xb0:    val = val + 4;    break;

 93                 case 0xd0:     val = val + 8;    break;

 94                 case 0xe0:    val = val + 12;    break;

 95             }

 96             return val;    

 97         }        

 98     }

 99     return 0;    

100 }

101 

102 void fmq(int a)//蜂鸣器功能

103 {

104     while(a)

105     {

106         Buz=0;

107         delay(5);

108         Buz=1;

109         delay(5);

110         a--;

111     }

112 }


执行独立按键的程序放在dulianjian.h的文件中

 

 1 //dulianjian.h

 2 void work0()//蜂鸣器和灯

 3 {

 4     if(m<=500)

 5     {

 6         Buz = !Buz;

 7     }

 8     if(m>5000)

 9     {

10         led=0xff;

11     }

12     if(m>=10000)

13     {

14         LED = 0;

15         m = 0;

16     }

17 }

18 //-----------------------

19 void work1()

20 {

21     static int s=50000;

22     

23     if(m%500==0)

24     {    

25         LED=0;

26         fmq(500);

27         delay(s=s-1000);

28         LED=1;

29     }

30 }

31 //----------------------

32 void work2()//停止

33 {    

34     LED=1;

35     Buz=0;

36 }

37 void work3()

38 {    

39     

40 }


将矩阵按键的执行代码放在juzhenganjian.h中,同时借用math.h的pow函数来解决移位现象

也可借助https://www.cnblogs.com/action0/p/12642089.html中的思路来写,可大范围的简化代码。

要注意的是,借用第二个方法,要符合端口输入的方式。至于这个,有空再写。


 1 //juzhenganjian.h

  2 

  3 

  4 void work4()//按键1--1个空格

  5 {

  6     if(m>200)

  7     {

  8         led=0xff;

  9         temp=~led;

 10     }

 11     if(m>=32000)

 12     {

 13         for(b=0;b<7;b+=2)//奇数补充

 14         {

 15             temp+=pow(2,b);

 16             led=~temp;

 17             delay(40000);

 18         }

 19         

 20         

 21         m=0;

 22     }

 23     

 24 }

 25 

 26 void work5()//2--2个空格

 27 {

 28     if(m>200)

 29     {

 30         led=0xff;

 31         temp=~led;

 32     }

 33     if(m>=32000)

 34     {

 35         for(b=0;b<8;b+=3)//奇数补充

 36         {

 37             temp+=pow(2,b);

 38             led=~temp;

 39             delay(40000);

 40         }

 41         for(b=1;b<=7;b+=3)//o数补充

 42         {

 43             temp+=pow(2,b);

 44             led=~temp;

 45             delay(40000);

 46         }

 47         for(b=2;b<7;b+=3)//奇数补充

 48         {

 49             temp+=pow(2,b);

 50             led=~temp;

 51             delay(40000);

 52         }

 53         

 54         m=0;

 55     }

 56 }

 57 

 58 void work6()//3--3个空格

 59 {

 60     if(m>200)

 61     {

 62         led=0xff;

 63         temp=~led;

 64     }                                    

 65     if(m>=32000)

 66     {

 67         for(b=0;b<7;b+=4)

 68         {

 69             temp+=pow(2,b);

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>