📄 mkey.c
字号:
/*******************************************
文件:MKEY.C
环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
硬件:ATMEGA16芯片
日期:2006年12月10日
功能:驱动开发板上的矩阵键盘,按不同的键,则数码管显示键码0~F
备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#include <iom16v.h> //包含型号头文件
#include <macros.h> //包含"位"操作头文件
#include <stdio.h> //标准输入输出头文件
#include <AVR_PQ1A.h> //包含自定义常量头文件
#include "SMG.C" //包含数码管显示函数
/*******************************************
函数名称: Key_press
功 能: 检测是否有键按下
参 数: 无
返回值 : pressed--有键按下时为TRUE,否则为FALSE
/********************************************/
uchar Mkey_press(void)
{
uchar pressed;
KEY_DDR=OUT; //定义数据端口为输出
KEY_PORTO=0xF0; //输出数据(输出检测码)
KEY_DDR=IN; //定义数据端口为输入
if(KEY_PORTI!=0xF0) //检测是否有键按下
pressed=TRUE; //有键按下则返回TRUE
else
pressed=FALSE; //无键按下则返回FALSE
KEY_DDR=OUT; //数据端口还原为输出
return pressed;
}
/*******************************************
函数名称: Key_scan
功 能: 扫描所按的键并返回键值
参 数: 无
返回值 : keycode--被按下键值
/********************************************/
uchar Mkey_scan(void)
{
uchar i=0x7F,keycode=0xFF; //i为扫描码,
Delayms(15); //延时消抖
if(Mkey_press()==TRUE) //如果有键按下
{
do
{
i=(i<<1|i>>7); //进行行扫描
KEY_DDR=0x0F; //定义数据端口低四位为输出,高四位为输入
KEY_PORTO=i; //输出扫描码 #define KEY_PORTO PORTD
Delayms(1); //防止读入出错,加入延时
keycode=KEY_PORTI; //读入原始键码 #define KEY_PORTI PIND
}while((keycode&0xF0)==0xF0); //是否检测到被按下按键(扫描到就跳出循环,否则继续扫描)
do
{
}while(Mkey_press()==TRUE); //等待按键释放(为了防止按一次,执行多次的现象)
Delayms(15); //延时消抖
switch(keycode) //将原始键码翻译成0~F
{
case 0xEE:
keycode=0x1;
break;
case 0xDE:
keycode=0x2;
break;
case 0xBE:
keycode=0x3;
break;
case 0x7E:
keycode=0xa;
break;
case 0xED:
keycode=0x4;
break;
case 0xDD:
keycode=0x5;
break;
case 0xBD:
keycode=0x6;
break;
case 0x7D:
keycode=0xb;
break;
case 0xEB:
keycode=0x7;
break;
case 0xDB:
keycode=0x8;
break;
case 0xBB:
keycode=0x9;
break;
case 0x7B:
keycode=0xc;
break;
case 0xE7:
keycode=0xe;
break;
case 0xD7:
keycode=0x0;
break;
case 0xB7:
keycode=0xf;
break;
case 0x77:
keycode=0xd;
break;
}
}
return keycode; //返回经过翻译的键码
}
/*******************************************
函数名称: main
功 能: 独立按键驱动主函数
参 数: 无
返回值 : 无
/********************************************/
void main(void)
{
uchar i;
uchar j=0;
uchar temp[4];
uchar qq;
uchar p=0; // 确认
uchar tem;
uchar k; //PA0 光电传感器输入
uchar a=0x7f; // 1111 1110
Board_init( ); //初始化开发板
DDRA|=BIT(7); //定义PA7为输出
PORTA&=0x7F; //初始设置输出为0,不发声 0111 1111
DDRC&=0x7F; //0111 1111 定义PORTC7为输入
PORTC|=0x00;//PC7 不设上拉电阻 1000 0000
//DDRC&=a; //定义PA0为输入 0111 1111 高电平有效
//PORTA&=0xff; //PA0 不设上拉电阻
//One_smg_display(0,1); //第1个数码管,初始显示数字8
/*for(j=0;j<4;j++) //初始数码管显示 0000
{
temp[j]=0x0;
j=0;
}
for(i=0;i<4;i++)
{
One_smg_display(temp[i],i+1);
Delayms(5);
}*/
while(1)
{
if(Mkey_press()) //是否有按键按下
{
qq=Mkey_scan();
if(qq==0xB) //按键确认 是否按下
{
for(j=0;j<4;j++)
temp[j]=0x0;
j=0;
p=0x01;
}
else if(qq==0xA) //清除当前输入
{
if(j>0)
{
temp[j-1]=0x0;
j--;
}
else
{
temp[3]=0x0;
j=3;
}
}
else
{
temp[j]=qq; //Mkey_scan();//扫描并反回翻译后的键码
j++;
if(j>3)
j=0;
}
}//if end
for(i=0;i<4;i++) //显示按键数字
{
One_smg_display(temp[i],i+1);
Delayms(5);
}
tem=PINC; //uchar k; //PC7 光电传感器输入
k=tem>>7;
if(k==1 )
{
One_smg_display(8,6);
Delayms(5);
if(p==0) {PORTA|=0xFF;Delayms(200);PORTA&=0x7F;}//无刷卡,有人通过,发声2妙后停止 0111 1111
}
if(p==1 ) {Delayms(2000);p=0;} //有刷卡,2妙内有人通过不发声,2妙后,有人通过,发声
} //while end
}//main end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -