[51单片机学习笔记FIVE]----独立按键

一、8个按键控制8个LED灯

 1 /*******************************************************************************
 2 实验名称:       8个独立按键控制8盏LED灯(按下哪个键,那个键对应的LED亮)
 3 实验时间:         2015/1/20
 4 *******************************************************************************/
 5 #include <reg51.h>
 6
 7 #define LED_KEY P0   //LED灯用P0口
 8 #define IO_KEY  P1     //独立按键用P1口
 9
10 void Delay();        //延时函数
11 unsigned char Key_Scan();     //获取按键值
12
13 void main()
14 {
15     unsigned char Key_Value, LED_Value;
16
17     while(1)
18     {
19         Key_Value = Key_Scan();
20         switch(Key_Value)
21         {
22             case(0xFE):         //K1按下
23                 LED_Value = 0x01;
24                 break;
25             case(0xFD):         //K2按下
26                 LED_Value = 0x02;
27                 break;
28             case(0xFB):         //K3按下
29                 LED_Value = 0x04;
30                 break;
31             case(0xF7):         //K4按下
32                 LED_Value = 0x08;
33                 break;
34             case(0xEF):         //K5按下
35                 LED_Value = 0x10;
36                 break;
37             case(0xDF):         //K6按下
38                 LED_Value = 0x20;
39                 break;
40             case(0xBF):         //K7按下
41                 LED_Value = 0x40;
42                 break;
43             case(0x7F):         //K8按下
44                 LED_Value = 0x80;
45                 break;
46             default:
47                 break;
48         }
49
50         LED_KEY = LED_Value;  //点亮相应LED
51     }
52 }
53
54 unsigned char Key_Scan()
55 {
56     unsigned char Key_Value,i;
57
58     if(IO_KEY != 0)
59     {
60         Delay();            //消除抖动
61
62         if(IO_KEY != 0xFF)
63         {
64             Key_Value = IO_KEY;
65             i = 0;
66             if((i<50)&&(IO_KEY != 0xFF)) //判断按键是否松开
67             {
68                 Delay();
69                 i++;
70             }
71         }
72     }
73     return Key_Value;
74 }
75
76 void Delay()              //延迟10ms
77 {
78     unsigned char a,b,c;
79
80     for(c=1;c>0;c--)
81     {
82         for(b=38;b>0;b--)
83         {
84             for(a=130;a>0;a--)
85             {};
86         }
87     }
88 }

独立按键原理是这样的:按键没按下的时候,相应端口是高电平状态,而当按键按下的时候,相应的端口则是低电平。所以可以根据这个现象,实现相应的功能。

还有一点应该注意的是:按键在闭合和断开时,触点会存在抖动现象。

在实际情况下,我们需要的是稳定闭合的那部分状态。所以可以采用延时的方法来解决这个问题,具体的过程就是先看看有没有键按下,有键按下了,再延迟一段时间,再看看有没有键按下,

这时候如果还是有键按下的话那就真的是有键按下了。

而这个抖动的时间大概是10ms,所以只要用一个延时10ms的子函数就行。

上面代码的第66行那个判断按键是否松开也是必要的,虽然在这个程序中有和没有区别不大,但是在有的程序中加入要求按键松开之后才出现什么现象之类的东西的话,那这部分就显得必要了。



二、LED显示键值

 1  1 /***************************************************
 2  2 实验名称:       LED显示键值(按下哪个键,那个键对应的LED不亮)
 3  3 实验时间:       2015/1/22
 4  4 ****************************************************/
 5  5 #include <reg51.h>
 6  6
 7  7 #define LED_KEY P0   //LED灯用P0口
 8  8 #define IO_KEY  P1     //独立按键用P1口
 9  9
10 10 void Delay();        //延时函数
11 11 unsigned char Key_Scan();     //获取按键值
12 12
13 13 void main()
14 14 {
15 15     unsigned char Key_Value, LED_Value;
16 16
17 17     while(1)
18 18     {
19 19         Key_Value = Key_Scan();
20 20         if (Key_Value != 0)     //有按键按下
21 21         {
22 22             LED_Value = Key_Value;
23 23         }
24 24
25 25         LED_KEY = LED_Value;  //点亮相应LED
26 26     }
27 27 }
28 28
29 29 unsigned char Key_Scan()
30 30 {
31 31     unsigned char Key_Value,i;
32 32
33 33     if(IO_KEY != 0)
34 34     {
35 35         Delay();            //消除抖动
36 36
37 37         if(IO_KEY != 0xFF)
38 38         {
39 39             Key_Value = IO_KEY;
40 40             i = 0;
41 41             if((i<50)&&(IO_KEY != 0xFF)) //判断按键是否松开
42 42             {
43 43                 Delay();
44 44                 i++;
45 45             }
46 46         }
47 47     }
48 48     return Key_Value;
49 49 }
50 50
51 51 void Delay()              //延迟10ms
52 52 {
53 53     unsigned char a,b,c;
54 54
55 55     for(c=1;c>0;c--)
56 56     {
57 57         for(b=38;b>0;b--)
58 58         {
59 59             for(a=130;a>0;a--)
60 60             {};
61 61         }
62 62     }
63 63 }


三、按键选择花样显示

  1  /***********************************************
  2  实验名称:        按键选择花样显示
  3  实验时间:           2015/1/22
  4  ***********************************************/
  5 #include <reg51.h>
  6 #include <intrins.h>
  7
  8 #define IO_KEY  P1
  9 #define LED_KEY P0
 10
 11 void Delay(unsigned char c);                       //延时函数
 12 unsigned char  Key_Scan();            //按键扫描函数
 13 void Key1();                        //按下按键1的操作
 14 void Key2();                          //按下按键2的操作
 15 void Key3();                        //按下按键3的操作
 16 void Key4();                        //按下按键4的操作
 17 void Key5();                        //按下按键5的操作
 18 void Key6();                        //按下按键6的操作
 19 void Key7();                        //按下按键7的操作
 20 void Key8();                        //按下按键8的操作
 21
 22 void main()
 23 {
 24     unsigned char Key_Value;
 25
 26     while(1)
 27     {
 28         Key_Value = Key_Scan();
 29         switch(Key_Value)
 30         {
 31             case(0xFE):
 32                     Key1();
 33                     break;
 34             case(0xFD):
 35                     Key2();
 36                     break;
 37             case(0xFB):
 38                     Key3();
 39                     break;
 40             case(0xF7):
 41                     Key4();
 42                     break;
 43             case(0xEF):
 44                     Key5();
 45                     break;
 46             case(0xDF):
 47                     Key6();
 48                     break;
 49             case(0xBF):
 50                     Key7();
 51                     break;
 52             case(0x7F):
 53                     Key8();
 54                     break;
 55             default:
 56                     break;
 57         }
 58     }
 59 }
 60
 61
 62 void Delay(unsigned char c)                       //c=1时,延迟10ms
 63 {
 64     unsigned char a,b;
 65
 66     for(;c>0;c--)
 67     {
 68         for(b=38;b>0;b--)
 69         {
 70             for(a=130;a>0;a--)
 71             {};
 72         }
 73     }
 74 }
 75
 76 unsigned char Key_Scan()
 77 {
 78     unsigned char Key_Value,i;
 79     if(IO_KEY != 0)
 80     {
 81         Delay(1);                                   //消除抖动
 82
 83         if(IO_KEY != 0)
 84         {
 85             Key_Value = IO_KEY;
 86             i = 0;
 87             if((i<50)&&(IO_KEY != 0xFF))           //判断按键是否松开
 88             {
 89                 Delay(1);
 90                 i++;
 91             }
 92         }
 93     }
 94     return Key_Value;
 95 }
 96
 97 //LED左移闪烁两次
 98 void Key1()
 99 {
100     unsigned char i;
101     LED_KEY = 0x01;
102     for(i=0;i<16;i++)                               //循环两次
103     {
104         LED_KEY = _crol_(LED_KEY,1);                //循环左移一位
105         Delay(15);                                    //延时
106     }
107 }
108 //LED右移闪烁两次
109 void Key2()
110 {
111     unsigned char i;
112     LED_KEY= 0x80;
113     for(i=0;i<16;i++)
114     {
115         LED_KEY = _cror_(LED_KEY,1);                //循环右移一位
116         Delay(15);                                    //延时
117     }
118 }
119 //LED交替闪烁16次,间隔亮
120 void Key3()
121 {
122     unsigned char i;
123     for(i=0;i<16;i++)
124     {
125         LED_KEY = 0xAA;
126         Delay(15);
127         LED_KEY = 0x55;
128         Delay(15);
129     }
130 }
131 //LED反交替闪烁16次,间隔亮
132 void Key4()
133 {
134     unsigned char i;
135     for(i=0;i<16;i++)
136     {
137         LED_KEY = 0x55;
138         Delay(15);
139         LED_KEY = 0xAA;
140         Delay(15);
141     }
142 }
143 //LED交替闪烁16次,相邻亮
144 void Key5()
145 {
146     unsigned char i;
147     for(i=0;i<16;i++)
148     {
149         LED_KEY = 0xCC;
150         Delay(15);
151         LED_KEY = 0x33;
152         Delay(15);
153     }
154 }
155 //LED反交替闪烁16次,相邻亮
156 void Key6()
157 {
158     unsigned char i;
159     for(i=0;i<16;i++)
160     {
161         LED_KEY = 0x33;
162         Delay(15);
163         LED_KEY = 0xCC;
164         Delay(15);
165     }
166 }
167 //Key1()--Key6(),Key8()都来一遍
168 void Key7()
169 {
170     Key1();
171     Key2();
172     Key3();
173     Key4();
174     Key5();
175     Key6();
176     Key8();
177 }
178 //全灭
179 void Key8()
180 {
181     LED_KEY = 0x00;
182 }


四、按键左右移LED灯

  1 /*******************************************************************************
  2 *实验名称                    :按键控制LED左右移
  3 *实验时间               ;   2015/1/22
  4 *******************************************************************************/
  5 #include <reg51.h>
  6 #include <intrins.h>
  7
  8 //--定义要使用的IO口--//
  9 sbit      K1 = P1^0;       //对应按钮K1
 10 sbit     K2 = P1^1;        //对应按钮K2
 11 #define  LED_KEY P0    //LED使用P0口
 12
 13 //--定义全局函数--//
 14 void Delay10ms(unsigned int c);   //延时10ms
 15 unsigned char Key_Scan();
 16
 17 /*******************************************************************************
 18 * 函 数 名         : main
 19 * 函数功能           : 主函数
 20 *******************************************************************************/
 21 void main(void)
 22 {
 23     unsigned char ledValue, keyNum;
 24
 25     ledValue = 0x01;
 26
 27     while (1)
 28     {
 29         keyNum = Key_Scan();  //扫描键盘
 30
 31         if (keyNum == 1)      //如果键值返回1
 32         {
 33             ledValue = _crol_(ledValue, 1);    //左循环
 34         }
 35         else if (keyNum == 2)
 36         {
 37             ledValue = _cror_(ledValue, 1);    //右循环
 38         }
 39
 40         LED_KEY = ledValue;  //点亮LED灯
 41     }
 42 }
 43
 44 /*******************************************************************************
 45 * 函 数 名                     : Key_Scan()
 46 * 函数功能                       : 扫描键盘
 47 *******************************************************************************/
 48
 49 unsigned char Key_Scan()
 50 {
 51     unsigned char keyValue = 0 , i; //保存键值
 52
 53     //--检测按键1--//
 54     if (K1==0)        //检测按键K1是否按下
 55     {
 56         Delay10ms(1);    //消除抖动
 57
 58         if (K1==0)    //再次检测按键是否按下
 59         {
 60             keyValue = 1;
 61             i = 0;
 62             while ((i<50) && (K1==0))     //检测按键是否松开
 63             {
 64                 Delay10ms(1);
 65                 i++;
 66             }
 67         }
 68     }
 69
 70     //--检测按键2--//
 71     if (K2==0)        //检测按键K1是否按下
 72     {
 73         Delay10ms(1);    //消除抖动
 74
 75         if (K2==0)    //再次检测按键是否按下
 76         {
 77             keyValue = 2;
 78             i = 0;
 79             while ((i<50) && (K2==0))     //检测按键是否松开
 80             {
 81                 Delay10ms(1);
 82                 i++;
 83             }
 84         }
 85     }
 86
 87     return keyValue;   //将读取到键值的值返回
 88 }
 89
 90 /*******************************************************************************
 91 * 函 数 名                     : Delay10ms
 92 * 函数功能                     : 延时函数,延时10ms
 93 *******************************************************************************/
 94
 95 void Delay10ms(unsigned int c)   //误差 0us
 96 {
 97     unsigned char a, b;
 98
 99     //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
100     for (;c>0;c--)
101     {
102         for (b=38;b>0;b--)
103         {
104             for (a=130;a>0;a--);
105         }
106
107     }
108 }
时间: 2024-08-25 16:46:54

[51单片机学习笔记FIVE]----独立按键的相关文章

[51单片机学习笔记ONE]-----LED灯的多种使用方法

一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间间隔1s 3 实验时间: 2014年12月2日 4 ******************************************************/ 5 6 #include <reg51.h> 7 8 void delay(unsigned char a); 9 10 void m

[51单片机学习笔记TWO]----蜂鸣器

蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来驱动振动膜发声的.因此需要一定的电流才能驱动它,而单片机I/O引脚输出的电压较小.单片机输出的TTLK电平基本驱动不了蜂鸣器,因需要增加一个放大电路.这里用三极管作为放大电路.下面是原理图: 我这里的J8端是跟芯片的P1^5端口相连,当P1^5输出高电平时,三极管截止,蜂鸣器不发声,反之,输出低电平

51单片机学习笔记【五】——1602液晶屏

一.1602液晶屏基础 1.LCD1602简介 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母.数字.符号的点阵型液晶模块.它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片.本次使用型号为SMC1602A LCM的液晶屏. 2.LCD1602接口信号说明 3.控制接口说明 4.指令说明 二.实验例程 1.电路原理图 2.实验说明 本实验通

[51单片机学习笔记THREE]----继电器

继电器是一种电控制器件,它是当输入量(如电压,电流,温度等)达到规定值时,使得被控量发生阶跃性变化的一种电器. 比如说:我们只需要用一个12V,0.1A的参数量去控制一个继电器,然后让继电器去充当几百万伏特,几百万安培的设备的开关. 无论在什么地方,如果想让控制者处于安全的环境中,就可以用继电器.让我们去接触安全的一边,让继电器去接触危险的一边,我们只要控制继电器的动作,继电器就会帮助我们连接我们不想亲自去碰的一些线路. 继电器的分类千千万,这里就不多说了. 最近因为好像没什么地方要用到,这里先

[51单片机学习笔记FOUR]----16*16LED点阵

一.LED点阵发光原理 8*8单色单片机结构图如下: 从电路图中很简单的就可以看出来,想要点亮点阵中的某一个LED灯.只要使得那个灯所在的行输出高电平,所在列输出低电平就好. 二.点阵扫描实验 1 /*********************************************** 2 实验名称: 点阵扫描 3 实验说明: 扫描每个LED灯,检查点阵是否完好 4 实验时间: 2014/12/24 5 ******************************************

51单片机学习笔记【六】——串口通信实验

一.串口通信基础 1.串行通信 串行通信将数据字节分成一位一位的形式在一条传输线上逐个传送.单片机采用串行通信.特点是:传输线少,长距离传送成本低,但数据传送控制复杂. 串行通信的传输的传输方向:单工(数据传输只能沿一个方向),办双工(传输数据和接受数据分布进行),全双工(传输和接受同步进行). 单片机采用异步通信,发送和接受设备使用各自的时钟频率,容易实现,但传输效率不高,数据格式 2.MAX232 实验通过MAX232电平转换芯片,可把计算机串口电平(-12V~+12V)转换为单片及TTL电

51单片机学习笔记【九】——红外通信实验

一.红外通信基础 1.红外线原理 红外线是波长在760nm~1mm之间的非可见光.红外通信装置由红外发射管和红外接受管组成,红外发射管是能发射出红外线的发光二极管,发射强度随着电流的增大而增大:红外接受管是一个具有红外光敏感特征的PN节的光敏二极管,只对红外线有反应,产生光电流. 2.信号调制原理 基带信号:从信号源发出没有经过调制的原始信号,特点是频率较低,信号频率从0开始,频谱较宽. 调制:就是用待传送信号去控制某个高频信号的幅度.相位.频率等参量变化的过程,即用一个信号去装载另一个信号.

51单片机学习笔记【七】——蜂鸣器和继电器

一.蜂鸣器 1.蜂鸣器基础 蜂鸣器按驱动方式分为有源蜂鸣器和无源蜂鸣器,有源蜂鸣器内部带振荡器,接入一个低电平便会响:无源蜂鸣器不带振荡器,让它响要接500HZ~4.5KHZ之间的脉冲信号来驱动才会响.很实验采用的是无源蜂鸣器. 2.电路原理图 3.实验说明 本实验通过控制蜂鸣器分别在4KHZ和1KHZ频率下发声,实验接线为JP8接P1.5. 4.程序源代码 /************************************** > File Name: 蜂鸣器实验 > Author:

51单片机学习笔记【0】——基础知识

一.单片机三大资源 1.Flash--程序存储空间 相当于计算机的硬盘,可实现断电后数据不丢失. 2.RAM--数据存储空间 相当于计算机的内存,用来存储程序运行过程中产生和需要的数据,断电后数据丢失,优点是读取速度快,可无限次写入. 3.SFR--特殊功能寄存器 单片机每个功能都对应一个 多个SFR,用户通过对SFR的读写来实现单片机的功能. 二.单片机的最小系统 1.电源 主流单片机采用5V和3.3V的电压,供电电路40引脚接+5V,通常也成为VCC或VDD,代表电源正极:20引脚接GND,