/**********************/
时间:2014年5月19日
#include<avr/io.h>//AVR通用头文件
#include<util/delay.h>//延时函数
typedef unsigned char uchar;
typedef unsigned int uint;
#define LED_H() DDRC //数码管段选控制口
#define LEDP_H() PORTC//数码管数据口
#define JianPan()DDRB //键盘扫描控制口
#define Jian_H() PORTB//键盘开始状态口
#define Jian_I() PINB //键盘扫描检测口
uchar Duanxuan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};//数据 注意共阴 共阳 数码管的值"相反"
void Init()//初始化
{
LED_H() = 0xff;
JianPan()= 0xf0;//高4位输出低4位输入
Jian_H() = 0x0f;//打开低4位端口的高阻态这里高4位是输出故高阻态没用
LEDP_H() = 0x00;//关闭数码管
}
int main()
{
Init();
while(1)
{
uchar Temp = 0; //定义中间传递变量 这是很好的方法
Jian_H() = 0xef; //预先处理键盘端口的输出状态
_delay_ms(1);
Temp = Jian_I(); //随时检测键盘端口的状态变化
while(Temp != 0xef)//若有变化进入 第一行端口检测
{
_delay_ms(1);//延时消抖
if(Temp == 0xee)//检测变化的值是多少
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[0];//这里是共阴数据 我在这里取反
_delay_ms(1);
}
if(Temp == 0xed)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[1];
_delay_ms(1);
}
if(Temp == 0xeb)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[2];
_delay_ms(5);
}
if(Temp == 0xe7)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[3];
_delay_ms(1);
}
Temp = Jian_I();//循环内部检测键盘端口的值 以便跳出循环进入下一行端口检测
}
Jian_H() = 0xdf;
_delay_ms(1);
Temp = Jian_I();
while(Temp != 0xdf)//第二行端口检测
{
_delay_ms(1);
if(Temp == 0xde)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[4];
_delay_ms(1);
}
if(Temp == 0xdd)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[5];
_delay_ms(1);
}
if(Temp == 0xdb)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[6];
_delay_ms(1);
}
if(Temp == 0xd7)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[7];
_delay_ms(1);
}
Temp = Jian_I();
}
Jian_H() = 0xbf;
_delay_ms(1);
Temp = Jian_I();
while(Temp != 0xbf)//第三行端口检测
{
_delay_ms(1);
if(Temp == 0xbe)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[8];
_delay_ms(1);
}
if(Temp == 0xbd)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[9];
_delay_ms(1);
}
if(Temp == 0xbb)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[10];
_delay_ms(1);
}
if(Temp == 0xb7)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[11];
_delay_ms(1);
}
Temp = Jian_I();
}
Jian_H() = 0x7f;
_delay_ms(1);
Temp = Jian_I();
while(Temp != 0x7f)//第四行端口检测
{
_delay_ms(1);
if(Temp == 0x7e)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[12];
_delay_ms(1);
}
if(Temp == 0x7d)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[13];
_delay_ms(1);
}
if(Temp == 0x7b)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[14];
_delay_ms(1);
}
if(Temp == 0x77)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[15];
_delay_ms(1);
}
Temp = Jian_I();
}
}
}
/**********/
总结一下键盘检测的思路
相信 可以的
/***********/
时间:2014年5月19日
作者:fengjianxin
8MHz晶振
/**********************/#include<avr/io.h>//AVR通用头文件
#include<util/delay.h>//延时函数
typedef unsigned char uchar;
typedef unsigned int uint;
#define LED_H() DDRC //数码管段选控制口
#define LEDP_H() PORTC//数码管数据口
#define JianPan()DDRB //键盘扫描控制口
#define Jian_H() PORTB//键盘开始状态口
#define Jian_I() PINB //键盘扫描检测口
uchar Duanxuan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};//数据 注意共阴 共阳 数码管的值"相反"
void Init()//初始化
{
LED_H() = 0xff;
JianPan()= 0xf0;//高4位输出低4位输入
Jian_H() = 0x0f;//打开低4位端口的高阻态这里高4位是输出故高阻态没用
LEDP_H() = 0x00;//关闭数码管
}
int main()
{
Init();
while(1)
{
uchar Temp = 0; //定义中间传递变量 这是很好的方法
Jian_H() = 0xef; //预先处理键盘端口的输出状态
_delay_ms(1);
Temp = Jian_I(); //随时检测键盘端口的状态变化
while(Temp != 0xef)//若有变化进入 第一行端口检测
{
_delay_ms(1);//延时消抖
if(Temp == 0xee)//检测变化的值是多少
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[0];//这里是共阴数据 我在这里取反
_delay_ms(1);
}
if(Temp == 0xed)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[1];
_delay_ms(1);
}
if(Temp == 0xeb)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[2];
_delay_ms(5);
}
if(Temp == 0xe7)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[3];
_delay_ms(1);
}
Temp = Jian_I();//循环内部检测键盘端口的值 以便跳出循环进入下一行端口检测
}
Jian_H() = 0xdf;
_delay_ms(1);
Temp = Jian_I();
while(Temp != 0xdf)//第二行端口检测
{
_delay_ms(1);
if(Temp == 0xde)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[4];
_delay_ms(1);
}
if(Temp == 0xdd)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[5];
_delay_ms(1);
}
if(Temp == 0xdb)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[6];
_delay_ms(1);
}
if(Temp == 0xd7)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[7];
_delay_ms(1);
}
Temp = Jian_I();
}
Jian_H() = 0xbf;
_delay_ms(1);
Temp = Jian_I();
while(Temp != 0xbf)//第三行端口检测
{
_delay_ms(1);
if(Temp == 0xbe)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[8];
_delay_ms(1);
}
if(Temp == 0xbd)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[9];
_delay_ms(1);
}
if(Temp == 0xbb)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[10];
_delay_ms(1);
}
if(Temp == 0xb7)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[11];
_delay_ms(1);
}
Temp = Jian_I();
}
Jian_H() = 0x7f;
_delay_ms(1);
Temp = Jian_I();
while(Temp != 0x7f)//第四行端口检测
{
_delay_ms(1);
if(Temp == 0x7e)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[12];
_delay_ms(1);
}
if(Temp == 0x7d)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[13];
_delay_ms(1);
}
if(Temp == 0x7b)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[14];
_delay_ms(1);
}
if(Temp == 0x77)
{
_delay_ms(1);
LEDP_H() = ~Duanxuan[15];
_delay_ms(1);
}
Temp = Jian_I();
}
}
}
/**********/
总结一下键盘检测的思路
相信 可以的
/***********/