本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
char key_count=0;
char last_key= -1;
char num[8];
char key_buf[]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,
0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7};
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0-F
/*------------------------------------------------
函数声明
------------------------------------------------*/
uchar keyscan(void);//键盘扫描
void delay(uint i); //演示程序
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
uchar key,n=0,k=0;
while(1)
{
key=keyscan(); //调用键盘扫描,
if (key != last_key) //if (key != -1)
{
last_key = key; //key2 = getKey();
delay(500);
if(key!=-1) //if(key2 == -1)
{
// 有按键按下
for (n=0; n<7; n++)
{
num[n] = num[n+1];// LED显示左移一位
}
num[7] = key; // 最右显示新按下键的键值
}
}
for(k=0;k<8;k++)
{
P0 = dofly[num[k]];
P2 = (k); //位选,k=1表示选通第一个数码管...
delay(300);
}
}
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l,k,i;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
k=(cord_h+cord_l);
for(i=0;i<16;i++)
{
if(key_buf[i]==k)
{
return i;
}
}
}
}return -1; //返回该值
}
/*------------------------------------------------
延时程序
------------------------------------------------*/
void delay(uint i) //延时函数
{
while(i--);
}
这样的程序为什么实现不了第一次按下一次按键,第一个数码管显示相应的值,再按一次,第一位数码管显示,同时第二位数码管上保留我第一次输入的数。以此类推。按完8次后,数码管上显示我刚才按的8个数字。
是什么问题呢!各位高手帮忙看看修改修改!! |