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

发布者:BlissfulJoy最新更新时间:2024-08-12 来源: cnblogs关键字:51单片机  独立按键  矩阵按键 手机看文章 扫描二维码
随时随地手机看文章

主要实现如图所示的功能

将主函数以外的函数全部放在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);

[1] [2] [3]
关键字:51单片机  独立按键  矩阵按键 引用地址:基于51单片机的独立按键和矩阵按键用法

上一篇:定时器按键消抖的方法
下一篇:基于51单片机,蜂鸣器和led每秒1滴1亮的程序

推荐阅读最新更新时间:2026-03-20 11:04

AD按键-矩阵按键-独立按键
原理:利用数组分压+AD采集; 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在 4时优点才能体现出来);可备用作为AD基准输入。 缺点:不能做成组合按键(或者电阻要精确选择);且离IO口越近优先级越高。按键的识别收到精度的影响(消兜:抖动时间几毫秒到几十毫秒,所以连续读4次(每次8ms)直到读到值都相同。按键的识别是靠AD值的容差范围而非具体的AD值来识别)。基准电压的获得(IO或TL431) 参考http://www.ednchina.com/ART_46350_11_0_OA_6f4d5e96.HTM http://blog.sina.com.cn/s/blog_7a9b7c4c0100sohh.html htt
[单片机]
51单片机实现独立按键控制LED灯
3-1独立按键控制LED亮灭 本段代码主要使用了if...else...语句实现按下按下灯亮,松开按键时灯灭 #include REGX51.H void main() { while(1) { if(P3_1==0&&P3_0==0) { P2_0=0; } else { P2_0=1; } } } 3-2独立按键控制LED状态 首先使用较为灵活的延时函数生成代码,进行修改后如下 void Delay(unsigned int xms) { unsigned char i, j; while(xms) { i = 2; j = 2
[单片机]
51单片机:独立按键控制LED灯
1. 独立按键控制LED灯状态 亮灭实验完成后,就可以控制LED状态,首先我们知道由于机械结构的弹性作用,按键开关在闭合时不会一瞬间稳定的接通,在断开时,也不会一下子断开。所以就得需要程序消抖,也就是适当延时,程序如下 #include reg52.h //定义LED灯 sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3; sbit LED5 = P2^4; sbit LED6 = P2^5; sbit LED7 = P2^6; sbit LED8 = P2^7; //定义独立按键 sbit KEY1 = P3^1; //需要
[单片机]
<font color='red'>51单片机</font>:<font color='red'>独立</font><font color='red'>按键</font>控制LED灯
51单片机 使用一个独立按键控制蜂鸣器
第一次按下按键按键key后,蜂鸣器响; 第二次按下按键按键key后,蜂鸣器停。 #include reg52.h sbit beep=P1^5; sbit key=P3^1; unsigned int mode; //定义一个模式 void delay(unsigned int i) { while(i--); } void voice() { if(mode) { beep=~beep; delay(100); //更改delay可以让蜂鸣器发出不同的声音 } else { beep=0; } } void main()
[单片机]
51单片机 独立按键k1控制数码管移位 k2控制数值加
按下独立按键k1数码管左移,按下独立按键k2数码管数值加1。 typedef unsigned char u8; u8 code smgwei ={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; u8 code smgduan ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit key1=P3^1; sbit key2=P3^0; u8 wei,shu; void delay(u16 i) { while(i--); } void button() { if(key1==0) { delay(1000);
[单片机]
51单片机累计主循环次数实现独立按键
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: Independent-KEY ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200505 ---- @ModifiedTime: 20200505 ---- @Description:
[单片机]
<font color='red'>51单片机</font>累计主循环次数实现<font color='red'>独立</font><font color='red'>按键</font>
51单片机开发之独立按键
JP165跳线帽断开、JP10连接J12(为了实现按键控制LED灯的效果)、JP5连接JP8、J21接左边 3.5.2 示例代码 下面代码都使用多文件编程模型,这里贴出每个文件的主要代码。 下面代码实现的效果是,按下按键控制LED灯。 Main.c文件: #include reg51.h #include delay.h #include key.h #include type.h #include led.h int main() { u8 key; LED=0; //关闭所有LED灯,51单片机默认输出高电平,LED默认高电平点亮 while(1) { key=Key_
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved