标题:
包含长短按组合按键的单片机矩阵键盘扫描C语言程序
[打印本页]
作者:
51hei圆圆
时间:
2024-2-26 16:33
标题:
包含长短按组合按键的单片机矩阵键盘扫描C语言程序
分享一个刚开始学51时的一个矩阵键盘扫描程序
算法还是比较简单的,供初学者学习
单片机源程序如下:
<span style="line-height: 1.5;">//此程序可以实现短按键、长按键、组合键三种操作。双击按键操作还未实现,要进一步研究</span>
//
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag;
uchar key;
bit key_flag;
bit time_10ms_ok=0;
bit time_2ms_ok=0;
sbit dula=P2^6; //段选信号的锁存器控制
sbit wela=P2^7; //位选信号的锁存器控
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//数码管各位的码表
void delay(unsigned int i)
{
unsigned int m,n;
for(m=i;m>0;m--)
for(n=90;n>0;n--);
}
void display(uchar a,b,c,d,e,f)
{
P0=table[a];
dula=1;
dula=0;
P0=wei[0];
wela=1;
wela=0;
delay(5);
P0=table[b];
dula=1;
dula=0;
P0=wei[1];
wela=1;
wela=0;
delay(5);
P0=table[c];
dula=1;
dula=0;
P0=wei[2];
wela=1;
wela=0;
delay(5);
P0=table[d];
dula=1;
dula=0;
P0=wei[3];
wela=1;
wela=0;
delay(5);
P0=table[e];
dula=1;
dula=0;
P0=wei[4];
wela=1;
wela=0;
delay(5);
P0=table[f];
dula=1;
dula=0;
P0=wei[5];
wela=1;
wela=0;
delay(5);
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0xFC;//延时1ms,请在中断处理函数中,重新装入该数值。
TL0 = 0x6;
TR0=1;
EA = 1;
ET0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xFC;//延时1ms,请在中断处理函数中,重新装入该数值。
TL0 = 0x6;
flag++;
if(flag==10)
{flag=0;
time_10ms_ok=1;}
if(flag%2==0)
time_2ms_ok=1;
}
uchar KeyRead( void )
{
uchar ReadData; // 读按键的实时值
static uchar i; //长按键按下时间计数
static uchar trg,cont,cont1; //按键按下时的状态,trg用来描述短按键,cont用来描述长按键
P3=0x0f;
ReadData=P3;
P3=0xf0;
ReadData=(ReadData | P3)^0xff;
//if...else; 语句作用 是当第一次按键按下时,退出按键扫描程序,
//一来可以实现消抖,二来可以防止第一次按下按键时,程序刚好执行到按键扫描程序的中间部分,造成结果不准确
if(ReadData==cont1)
{
trg = ReadData & (ReadData ^ cont);
cont = ReadData;
}
else
{
cont1=ReadData;
return;
}
if(cont) //长按键计时
{
i++;
}
else //按键释放时
{
i=0;
return;
}
switch(trg)
{
case 0x11: key=0;key_flag=1; break;
case 0x21: key=1;key_flag=1; break;
case 0x41: key=2;key_flag=1; break;
case 0x61: key=8;key_flag=1; break; //1和2同时按下组成的组合键
case 0x81: key=3;key_flag=1; break;
case 0x12: key=4;key_flag=1; break;
case 0x22: key=5;key_flag=1; break;
case 0x42: key=6;key_flag=1; break;
case 0x82: key=7;key_flag=1; break;
case 0x14: key=8;key_flag=1; break;
case 0x24: key=9;key_flag=1; break;
case 0x44: key=10;key_flag=1; break;
case 0x84: key=11;key_flag=1; break;
case 0x18: key=12;key_flag=1; break;
case 0x28: key=13;key_flag=1; break;
case 0x48: key=14;key_flag=1; break;
case 0x88: key=15;key_flag=1; break;
}
if(i==100)
{
i=90;
switch(cont)
{
case 0x11: key++;key_flag=1; break;
case 0x21: key++;;key_flag=1; break;
case 0x41: key++;;key_flag=1; break;
case 0x81: key++;;key_flag=1; break;
case 0x12: key++;;key_flag=1; break;
case 0x22: key++;;key_flag=1; break;
case 0x42: key++;;key_flag=1; break;
case 0x82: key++;;key_flag=1; break;
case 0x14: key++;;key_flag=1; break;
case 0x24: key++;;key_flag=1; break;
case 0x44: key++;;key_flag=1; break;
case 0x84: key++;;key_flag=1; break;
case 0x18: key++;;key_flag=1; break;
case 0x28: key++;;key_flag=1; break;
case 0x48: key++;;key_flag=1; break;
case 0x88: key++;;key_flag=1; break;
}
}
return key;
}
void main(void)
{
uchar a,b,c,d,e,f;
InitTimer0();
while(1)
{
if(key_flag )
{
key_flag=0;
f=e;
e=d;
d=c;
c=b;
b=a;
a=key;
}
if(time_10ms_ok)
{
time_10ms_ok=0;
KeyRead();
}
display(a,b,c,d,e,f);
}
}
复制代码
作者:
joyb
时间:
2024-2-27 10:42
TH0 = 0xFC;//延时1ms,
51@11.0592mhz
。
TL0 = 0x66;
漏写6
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1