单片机矩阵按键定时器消抖程序源码

发布者:黄金大花猫最新更新时间:2015-04-29 来源: 51hei关键字:单片机  矩阵按键  定时器  消抖程序 手机看文章 扫描二维码
随时随地手机看文章
芯片是采用的stc89c51单片机.

下面是矩阵键盘的电路图,矩阵键盘是接在p2口的.

下面是单片机部分的图,数码管显示等完整的原理图可以从 http://www.51hei.com/f/ks51.pdf  这里下载

 


下面是程序源码:

/********矩阵按键定时器消抖**************/
/**
*时间:2014年3月18日20:27:23
*作者:寒竹子
*工程写法:用定时器为按键消抖不占用cpu的时间
**/

#include

typedef unsigned int uint;
typedef unsigned char uchar;

//138
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

//KeyIn
sbit KeyIn1 = P2^4;
sbit KeyIn2 = P2^5;
sbit KeyIn3 = P2^6;
sbit KeyIn4 = P2^7;

//KeyOut
sbit KeyOut1 = P2^3;
sbit KeyOut2 = P2^2;
sbit KeyOut3 = P2^1;
sbit KeyOut4 = P2^0;

//数码管编码
uchar code table[] = {  
0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  //"9"
                0x88,  //"A"
                0x83,  //"B"
                0xC6,  //"C"
                0xA1,  //"D"
                0x86,  //"E"
                0x8E   //"F"
};[page]

uchar key = 0;

//16个按键初始化1
uchar keysta[4][4] =
{
{1, 1, 1, 1}, //K1 - K4
{1, 1, 1, 1}, //K5 - K8
{1, 1, 1, 1}, //K9 - K 12
{1, 1, 1, 1} //K13 - K16
};

//16个按键的备份值初始值1
uchar keybackup[4][4] = {
{1, 1, 1, 1},
{1, 1, 1, 1},  
{1, 1, 1, 1},
{1, 1, 1, 1}
};

void keymatrixScan();
void timer0_init();
void refresh();
void HC138_init();

void main()
{
timer0_init();
HC138_init();

while (1)
{
keymatrixScan();
}
}

/********timer0 init*************/
void timer0_init()
{
TMOD |= 0x01;
TMOD &= 0xF1; //1111 0001,配置T0方式1
TH0 = 0xFC;
TL0 = 0x67;//1ms
TR0 = 1;//start T0
EA = 1; //open main int
ET0 = 1;//open T0 int
}

/***********HC138 init*********/
void HC138_init()
{
ADDR3 = 1;
ENLED = 0;//使能U3
}

/***********刷新数码管************/
void refresh()
{
static uchar j = 0;//刷新数码管
P0 = 0xFF;//消隐
switch (j)
{
case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0;
break;
case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1;
break;
case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0;
break;
case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1;
break;
case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0;
break;
case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1;
break;
default:
break;
}
P0 = table[key]; //在此处送入显示的数据,很正常的显示出来,当放到while(1)中时会出现抖动
j++;
if (j >= 6)
{
j = 0;
}
}

/**********矩阵按键检测***********/
void keymatrixScan()
{
//16个按键检测
uchar i = 0, j = 0;
for (i = 0; i < 4; i++) //4行
{
for (j = 0; j < 4; j++) //4列
{
if (keysta[j] != keybackup[j]) //检测第i行第j列按键是否有动作
{
if (keybackup[j] == 0) //若第i行第j列的按键的前一个状态为0,则由0-1,即按键弹起
{
key = i * 4 + j;//按键定位
}
//备份当前按键的值,以备下一次比较
keybackup[j] = keysta[j];
}
}
}
}

/**********timer0 int****************/
void timer0_int() interrupt 1 using 3
{
static uchar keybuf[4][4] = {
{0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF}
};//16个按键的扫描缓冲区
static uchar keyout = 0;//按键的列,即KeyOut1 - KeyOut4
uchar i = 0;
TH0 = 0xFC;
TL0 = 0x67; //1ms

refresh();

//扫描第keyout列的按键的值
keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KeyIn1;//将按键1的扫描值存入keybuf中
keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KeyIn2;
keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KeyIn3;
keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KeyIn4; //每1ms扫描一列,4ms扫描四列,共扫描四位,设定扫描16ms,即每个按键扫描4次

//更新消抖后按键的值
for (i = 0; i < 4; i++) //4行, 一列4个按键
{
if ((keybuf[keyout] & 0x0F) == 0x00) //按键的缓冲区的低四位都是0,因为16ms只扫描了4次,移入了四位状态值
{
keysta[keyout] = 0;//按键按下
}
else if ((keybuf[keyout] & 0x0F) == 0x0F) //按键的缓冲区的第四位都是1
{
keysta[keyout] = 1;//第keyout列第i行的按键弹起
}
}

//列++
keyout++;
//keyout 0-3
/*if (keyout >= 4)
keyout = 0;
*/
keyout &= 0x03;//当keyout到4则会等于3
//通过keyout列数选中列
switch (keyout)
{
case 0: KeyOut1 = 0; KeyOut4 = 1; KeyOut2 = 1; KeyOut3 = 1; //选中第一列,开发板上的第一行
break;
case 1: KeyOut2 = 0; KeyOut1 = 1; KeyOut3 = 1; KeyOut4 = 1;
break;
case 2: KeyOut3 = 0; KeyOut1 = 1; KeyOut2 = 1; KeyOut4 = 1;
break;
case 3: KeyOut4 = 0; KeyOut1 = 1; KeyOut2 = 1; KeyOut3 = 1;
break;
default:
break;
}
}

关键字:单片机  矩阵按键  定时器  消抖程序 引用地址:单片机矩阵按键定时器消抖程序源码

上一篇:单片机串口通信控制步进电机
下一篇:串口通信-数据发送到PC加1后接收到单片机在数码管上显示

推荐阅读最新更新时间:2024-03-16 14:00

proteus与keil Cx51的单片机仿真(按键亮灯)
电路图 C程序: #include reg51.h sbit K01=P1^4; sbit K02=P1^5; sbit K03=P1^6; sbit K04=P1^7; sbit VD17=P3^0; sbit VD18=P3^1; sbit VD19=P3^2; sbit VD20=P3^3; void delay() {unsigned char i,j;for(i=0;i 255;i++)for(j=0;j 255;j++);}//延时程序 void main() { while(1) { if(K01==0)//P1.4引脚输入低电平,按键K01被按下(检测按键) { delay();//延时一段时间继续检测
[单片机]
AT89S51单片机的低频信号仿真研究
1 设计目标和思路 文中设计目标是完成4种波形信号输出,即正弦波、三角波、方波和锯齿波,并使其在低频范围内具有稳定稳定性好、性能可靠、体积较小、占空比调节方便等技术优势。文中采用键盘控制的办法,来实现并输出方波、锯齿波、三角波和正弦波等信号。另外,对频率和幅值的变换情况,用键盘也能够较好的进行控制和调整。同时,本文还将其产生的信号参数用LCD进行仿真显示和调试。 在设计中,首先在函数中对某个数组附值,利用DAC0832来实现输出波形信号输出转换,再经过功放滤波模块处理,这样的话,就会在示波器上观察到不同函数值的波形信号。但是,因为函数对数组中的数附值之后并不是一次就输出显示出来,这就需要编写AT89S51的控制字,使其开中
[单片机]
AT89S51<font color='red'>单片机</font>的低频信号仿真研究
STM8L15x系列MCU的标准库简介
和STM32一样,意法也为STM8L提供了标准库,在Datsheet和官方的应用指南中称作STM8L15x standard firmware library。利用标准库中的库函数进行开发能够节约不少时间,对STM32开发有所了解的人都应该比较清楚这一点。 由于STM8根据应用定位分为标准的S、汽车的A和低功耗的L,各自的功能都有不同的特点,所以标准库是不能通用的。再者,在STM8L系列中根据功能的不同分为不同的产品系列,比如STM8L05x、STM8L101、STM8L15x、STM8L162等,因此8L某个系列的标准库在其他的系列中也是不能通用的。 对于STM8L15x的标准库,可以在st的官网上面找到:点击打开链接,
[单片机]
STM8L15x系列<font color='red'>MCU</font>的标准库简介
自学PIC单片机必备工具
  P IC 单片机 是一种可编程的芯片,数字 电路 也有些芯片具有可编程的能力。      但是数字电路的编程太简单,因而其功能也很少,但PIC单片机具有很强的编程能力,是数字电路无法实现的目标。例如:笔者用一片PIC16F84制作的多波形电针治疗仪,能在20分钟内变换20种波形,即每分钟变换一次波形(消除人体对单波形刺激的适应性)。如果要用数字电路来实现,需要上10个芯片,这充分证明PIC单片机的可编程的能力十分强大。由于单片机自身不能编程,所以必须借助下述的硬件和软件两种开发工具对它编程之后,才能把PIC单片机变成有用的产品。这些设备价格便宜,功能可靠。      1.PC(个人电脑)和开发软件PC机一台,其配置如下:Mic
[单片机]
基于SPMC75系列单片机的高性能三相变频电源
1 引言   变频电源是一种电源变换设备,因具有输出波形纯正、输出电压稳定、输出频率和输出电压可调等优点。其良好的性能,在传感、仪器仪表、工业控制等领域有广泛应用。本文主要介绍利用SPMC75F2413A和IPM(PS21865A)实现高性能三相变频电源的开发。 2 芯片特性简介   SPMC752413A是μ’nSP%26;#8482;系列产品的一个新成员,是凌阳科技新推出的专用于变频驱动的16位微控制器。其拥有性能出色定时器和PWM信号发生器组。   SPMC75F2413A在4.5V"5.5V工作电压范围内的工作速度范围为0"24MHz,拥有2K字SRAM和32K字闪存ROM;最多64个可编程的多功能I/O端口;5个通用16位
[应用]
视频会议多点控制单元的MCU设计与实现
0 引言 视频会议的多点控制单元(MCU)是视频会议系统的核心设备。所有参与会议的终端可与MCU建立一对一的连接,终端负责采集本会场的声音和图像,然后经编码后传输到MCU,由MCU根据当前视频会议的模式确定对音视频信号的处理方式和转发逻辑,最后将处理后的音视频数据再发送到每一个与会者。 1 多点视频会议的分类 基于H.324标准,多点会议实现有各种不同的方法和配置,主要可以为集中式多点会议和分散式多点会议两种模式。 集中式多点会议是由一个多点控制单元来组织,所有终端以点对点方式向多点控制单元发送视频流、音频流和控制流。其结构如图1所示。图1中的多点控制器使用H.245控制功能来对会议进行集中式管理。H.245也可用来指定各终端
[工业控制]
视频会议多点控制单元的<font color='red'>MCU</font>设计与实现
微控制器市场将应对质量挑战
据市场调查公司Frost & Sullivan称,在2006到2010年间,汽车微控制器的市场规模将扩大约63%。然而,芯片供应商需要对这一市场的具体特性予以仔细研究。   驱动这一市场需求的主要因素是车载电子产品的不断丰富,这些产品以减少人为失误以及增加像雷达、超声波传感器和具有所有需要增加处理能力和智能的数量的多路复用技术为目标,该调查公司称。   “经过一个全面的产业整合之后,汽车微控制器的市场有望在未来的几年获得长足的增长,这主要是因为终端用户的增长以及在汽车中集成电路的多种应用不断扩大所致,” Frost & Sullivan的高级研究分析师Bonnie Varghese做出了以上预测。该研究预计这一市场将从2006年的
[焦点新闻]
51单片机对SAA7113初始化和控制的程序
  用51单片机对7113初始化和控制   SAA7113的初始化就是对寄存器配置合适的参数,使其能够有符合要求的输出。寄存器配置通过I2C总线来进行,很多可以控制I2C总线的器件都可以作为主器件对7113进行初始化,这里介绍用51单片机初始化7113的例子。   51单片机和7113的硬件连接非常简单,只要把单片机的两个I/O口(如P1.0、P1.0)直接和7113的SCL、SDA管脚相连,再加上上拉电阻即可。   用单片机初始化7113的主要任务是程序的编写,首先要熟悉I2C总线协议,根据I2C总线的原理写出启动、停止、应答信号等的子程序,由子程序再写出发送、接收1个字节的程序,然后根据7113的寄存器操作格式写出
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved