基于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亮的程序

推荐阅读最新更新时间:2024-11-11 10:28

51单片机C编程(九、8X8点阵显示)
//-------------------8X8点阵显示程序---------------------- //-------------------2009年4月23日------------------------ 显示 0 从右向左移动,proteus仿真电路如下: #include reg51.h #define uchar unsigned char #define HANG P1 //P1口为每一列中的位选 #define LIE P0 //P0为列选 void delay(uchar); void main() { int i=0; while(1) { //-----------
[单片机]
51单片机小白零基础教程——数码管的静态显示,以及数码管拓展程序
一、数码管的显示原理 数码管:是一种可以显示数字和其他信息的电子设备,可以看成是多个二极管的组成。 数码管有单位数码管、双位数码管、四位数码管,我们开发板上的数码管为2个四位数码管。 数码管显示原理:通过点亮内部的发光二极管来发光 引脚:又被称为管脚,从集成电路内部电路引出与外围电路的接线,所有的引脚构成了这块芯片的接口 单位数码管的引脚有10个,内部一共有8个小的发光二级管,还有2个引脚是公共端,其实只有一个公共端,但是生产厂家为了封装统一,把这2个引脚连接在了一起。 数码管根据其公共端所接的阳极和阴极的不同,分为了共阴极数码管和共阳极数码管。 共阳极接法:几个二极管的阳极接在一起,接到VCC(高电平),
[单片机]
<font color='red'>51单片机</font>小白零基础教程——数码管的静态显示,以及数码管拓展程序
基于8051单片机的外部设备交换信息的三种数据传输方式解析
单片机CPU与外部设备交换信息通常有如下几种方式:无条件传送方式,查询传送方式和中断传送方式。我们以单片机与微型打印机接口为例讲述这三种方式。假定用户要打印三个数据,这三个数据保存在单片机的内部数据存储器10H,11H,和12H中,8051用并口P2与微型打印机的并行数据口DB进行数据交换。 (1)无条件传送方式 这种数据传送方式中没有联络信号,即CPU总是认为打印机在如何时候都是处于“准备好”的状态。这种传送方式中只需要在程序中加入数据送往P2的指令,数据传送便可以实现。但这种数据传送方式有一个致命弱点,数据易丢失,这是因为CPU的速度相当快,而打印机的速度相对来说较慢,其结果是在打印机打印一个数据的时间内,CPU已送来了多
[单片机]
基于80<font color='red'>51单片机</font>的外部设备交换信息的三种数据传输方式解析
51单片机 AD转换
在数逻的课程中,已经学习过AD转换的概念:将模拟信号采样、量化、编码后转换为数字信号。但是未学习过通过单片机编程,显示结果。 编码分有舍有入、只舍不入两种,量化误差前者更小。=2Vm/(2^n+1 - 1 ) 注意,为了达到精确度高、稳定性好的目的,最好将所有器件的模拟地和数字分别连接,最后将模拟地和数字地仅在一点相连。 此处,使用的是STC12C5A60S2内部的AD转换。 1 /* 功能:使用12C5A60S2内部AD读取外部电压,显示在1602上 */ 2 3 #include STC12C5A60S2.H 4 #include intrins.h 5 sbit RS = P2^6; //1602
[单片机]
51单片机流星灯c语言源程序
大家自己根据程序中的io定义部分 接上灯即可实现流星灯的效果!! //......................................... //内控自走程序 //CPU:STC12C2052 //主频:18.432MHZ(外部晶振144),内部晶振5MHZ //日期:2008/11/30 //......................................... #include reg52.H #include intrins.h #include absacc.h #include string.h #include stdlib.h //产生随机数SAND(); #de
[单片机]
采用51单片机设计的宿舍智能防火防盗报警系统
  0 引言   现如今在学校的寝室里,学生贵重物品被盗、由于学生过失而引起着火等事故时有发生,这些都是一直以来困扰着学生、学工以及学校保卫处的 大问题 。传统的防范措施存在很大的弊端,比如当事故发生时,防护铁门、铁栏杆就会成为主人逃生的最大障碍。而采用智能防火防盗报警系统,便能很好地解决此类问题了。但是市场上防火防盗系统价格对大学生来讲过高,本系统便是针对大学宿舍,从低成本的角度来设计制作的。   1 系统组成及工作原理   本系统通过一个监控室和两个宿舍来模拟,通过RS 485总线来实现通信。考虑到现实中监控室要能监控整栋宿舍楼,因此采用功能强大的ARM7芯片LPC2103作为主机控制芯片,从机采用价格低廉的51系列单片
[单片机]
采用<font color='red'>51单片机</font>设计的宿舍智能防火防盗报警系统
51单片机C编程(二、按键控制数码管显示)
#include reg51.h sbit k1=P3^0; //p30定义为第一个按键 sbit k2=P3^1; //p31定义为第二个按键 char tab ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x02,0xf8,0x00,0x10}; void delay(int x) { int i,j; for(i=x;i 0l;i--) {for(j=255;j 0;j--);} } void main() { int n=0; P0=0xc0; // 初始显示0 while(1) { if(k1==0) //如果
[单片机]
MCS-51单片机内部数据存储器RAM结构详解
内部数据存储器低128单元 8051单片机的内部RAM共有256个单元,通常把这256个单元按其功能划分为两部分:低128单元(单元地址00H~7FH)和高128单元(单元地址80H~FFH)。如图所示为低128单元的配置图。 寄存器区 8051共有4组寄存器,每组8个寄存单元(各为8),各组都以R0~R7作寄存单元编号。寄存器常用于存放操作数中间结果等。由于它们的功能及使用不作预先规定,因此称之为通用寄存器,有时也叫工作寄存器。4组通用寄存器占据内部RAM的00H~1FH单元地址。 在任一时刻,CPU只能使用其中的一组寄存器,并且把正在使用的那组寄存器称之为当前寄存器组。到底是哪一组,由程序状态字寄存器PSW中RS1
[单片机]
MCS-<font color='red'>51单片机</font>内部数据存储器RAM结构详解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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