标题:
矩阵键盘程序,请帮忙修改程序,可送话费,可商量,多谢帮忙!
[打印本页]
作者:
hbljcxl
时间:
2015-7-2 22:19
标题:
矩阵键盘程序,请帮忙修改程序,可送话费,可商量,多谢帮忙!
#include <REG52.H>
#include "TM16681.h" //4位数码管H文件
/**********************************
宏定义字符串
**********************************/
#define keyport P2 //定义P2口为矩阵键盘输入口
unsigned char xdata ComData[4]; //定义数组储存键盘数据
void delayms(unsigned int count); //延时函数
unsigned char keyscan(void); //反转法矩阵键盘扫描函数
unsigned char keypro(void); //反转法取得矩阵键盘键值转换成0-15数值函数
/******************************************************
主函数
*******************************************************/
void main(void)
{
unsigned char i=0,keynum[4];
unsigned int resuit;
while(1)
{
keynum[i]=keypro(); //我的意思是把取得的按键值送数组保存
i++;
if(i>=4) //我的意思是要4个按键值分别送往千位,百位,十位,个位
{
i=0;
resuit=keynum[0]*1000+keynum[1]*100+keynum[2]*10+keynum[3];
//这句话的意思是从数组取数
}
NixieTube_DisplayIntegerNumber(resuit);//把取出来的数送数码管显示
//可是出来的结果是按1显示1111,按2显示2222、.......
//松开按键回到显示0,这不是我要的结果
}
}
//请帮忙写个函数:按键值存入4位数后锁存,比如说0-9用来计数了,格式0000-9999任意数。那么10号按键取消后才能再输入
//11号按键用来确定或调用数组数据的意思,可反复调用,按11号键反复把数组送别的函数中使用。
/****************************
反转法按键扫描函数,返回扫描值
******************************/
unsigned char keyscan(void)
{
unsigned char num1;
unsigned char KEY_h,KEY_l;//定义行列值中间变量
P2=0xf0; //这句话意思是让行线输出全为0
if(P2!=0xf0) //不等于0就是有按键按下
{
delayms(10);//延时去抖动
if((P2&0xf0)!=0x0f)//再次检测有关按键按下
{
KEY_l=P2&0xf0;//读入列线值
P2=0x0f; //检测行线值
KEY_h=P2&0x0f;//读入行线值
num1=(KEY_l+KEY_h); //组合键值赋给num1
}
}return num1; //返回键盘码值
}
/*****************************
按键值处理函数,返回扫描键值
********************************/
unsigned char keypro(void)
{
switch(keyscan())//判断读入键值
{
case 0xe7:return 0;break;
case 0xdd:return 1;break;
case 0xbd:return 2;break;
case 0x7d:return 3;break;
case 0xdb:return 4;break;
case 0xbb:return 5;break;
case 0x7b:return 6;break;
case 0xd7:return 7;break;
case 0xb7:return 8;break;
case 0x77:return 9;break;
case 0x7e:return 10;break;
case 0xbe:return 11;break;
case 0xde:return 12;break;
case 0xee:return 13;break;
case 0xed:return 14;break;
case 0xeb:return 15;break;
default:return 0;break; //如果没有按键按下,送0
}
}
作者:
zjlang
时间:
2015-7-12 11:21
#include <reg52.h>
sbit BUZZER=P3^7;
unsigned char second=0,count=0; //设置初值
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//LED段码表
bit RunFlag=0;
unsigned char KeyScan();
void delay(void);
void main(void)
{
unsigned char KeyValue;
TMOD=0x1; //设置T0为定时器模式
TH0=0x3c; //设置T0为50ms定时长度
TL0=0xb0;
PT0=0;
TR0=1; //启动T0
ET0=1; //T0中断允许
EA=1; //CPU中断允许
while(1)
{
P0=seg[second/10]; //显示十位秒值
P2=seg[second%10]; //显示个位秒值
KeyValue=KeyScan();
switch (KeyValue)
{
case 0:
second=0;
break;
case 1:
second++;
break;
case 2:
second--;
break;
case 3:
RunFlag=~RunFlag;
break;
default:
break;
}
}
}
unsigned char KeyScan()
{
unsigned char i,j,key=0x10;
P1=0xf0; //Yi=0;
if ((P1 & 0xf0)!= 0xf0) //有键按下?
{
delay(); //去抖动
for (i=0;i<4;i++) //共扫描四行
{
P1=(0xf0 | (~(0x01<<i)));
if ((P1 & 0xf0)!=0xf0) //本行有键按下?
{
for (j=0;j<4;j++)
{
if ((P1>>j & 0x10)==0x0) //找到按键
{
key=i*4+j;
break;
}
}
}
}
P1=0xf0;
while ((P1 & 0xf0)!= 0xf0); //等待键抬起
delay(); //去抖动
}
return key;
}
void delay(void)
{
unsigned char i,j;
for (i=0;i<100;i++)
for (j=0;j<100;j++);
}
void T0_INT() interrupt 1 using 1 //定时器T0 50ms 中断
{
TH0=0x3c; //重置初值
TL0=0xb0;
if (RunFlag==0)
return;
count++; //计数增量
if (count==20) //是否已到1s
{
count=0; //清除计数值
second++; //秒增量
if (second>=60)
second=0;
if (second%5==0)
BUZZER=0;
else
BUZZER=1;
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1