📄 oldkeyprogrammetest.c
字号:
#include<avr/io.h>
#define uchar unsigned char
#define uint unsigned int
uchar Cal[4]={0,0,0,0};//定义一个全局变量 用于保存进行加法运算十的按键值:A+B=C
uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//用于保存十进制显示
uchar p[2]={0,0};//保存要显示的两位数内容 本程序显示两位
void delay(uint i)//延时函数
{
uchar j;
for(j=0;j<i;j++);
}
uchar KEYPRESSED(void)//检测是否有按键
{
DDRA=0xFF;
PORTA=0xF0;
DDRA=0x00;
if(PINA!=0xF0)
return 1;//有按键
else
return 0;//无按键
}
uchar KeyScan(void)//键盘扫描程序
{
uchar High,Low,KeyCode;
uchar keycode;
PORTA=0XF0;//检测高位被按下的按键
DDRA=0X0F;
High=PINA&0xF0;
PORTA=0x0F;//检测低四位 按下 并求得键值
DDRA=0xF0;
Low=PINA&0X0F;
KeyCode=High+Low;
switch(KeyCode)
{
case 0x7E:
keycode=0X77;//A
break;
case 0xBE:
keycode=0x4F;//3
break;
case 0xDE:
keycode=0x5B;//2
break;
case 0xEE:
keycode=0x06;//1
break;
case 0x7D:
keycode=0X7C;//B
break;
case 0xBD:
keycode=0X7D;//6
break;
case 0xDD:
keycode=0X6D;//5
break;
case 0xED:
keycode=0X66;//4
break;
case 0x7B:
keycode=0x39;//C
break;
case 0xBB:
keycode=0X6F;//9
break;
case 0xDB:
keycode=0X7F;//8
break;
case 0xEB:
keycode=0X07;//7
break;
case 0x77:
keycode=0x5E;//D
break;
case 0xB7:
keycode=0x71;//#显示为F
break;
case 0xD7:
keycode=0X3F;//0
break;
case 0xE7:
keycode=0x76;//'*'显示为H
break;
default :
break;
}
return keycode;
}
void Init(void)//初始化数码管
{
DDRB=0xFF;
PORTB=0x00;
DDRC=0X03;
PORTC=0XFF;
}
void Display(uchar p)//数码管显示
{
PORTC =0xFE;
PORTB=p;
delay(10);
}
void DispValue(void)//显示和值
{
//显示十位 即点亮 Q1
PORTB=0x00;
PORTC=0x0E;
PORTB=Table[p[0]];
delay(100);
PORTC=0xFF;
//显示个位 即点亮Q2
if(p[1]>0)
{
PORTB=0x00;
PORTC=0x0D;
PORTB=Table[p[1]];
delay(100);
}
}
uchar get_int(uchar K)//根据键值返回整型
{
uchar getint;
switch(K)
{
case 0x3f :
getint=0;
break;
case 0x06 :
getint=1;
break;
case 0x5B :
getint=2;
break;
case 0x4F :
getint=3;
break;
case 0x66 :
getint=4;
break;
case 0x6D :
getint=5;
break;
case 0x7D :
getint=6;
break;
case 0x07 :
getint=7;
break;
case 0x7f :
getint=8;
break;
case 0x6F :
getint=9;
break;
default:
getint=0;
break;
}
return getint;
}
int main()
{
uchar key,Value,a,b;
uchar flag;//选择的运算的标志 0--加法 1--减法 2--乘法 3--除法
Init();//数码管初始化
//key=0x6D;//没有按下时初始显示0
//Display(key);//初始显示
while(1){
while(!KEYPRESSED());//不断的检测是否有按键按下
delay(5);
key=KeyScan();
if(Cal[1]==0)//也就是加.减.乘.除号还没按下的时候 保存第一个加数 但是这有一个问题 按下的是加号 则这个值存加号
{
/*if((key!=0x77)&&(key!=0x7C))//用一个switch语句来选择究竟是执行什么样的操作
Cal[0]=key;
else
Cal[1]=1;*/
switch(key)
{
case 0x77: //加号
{
Cal[1]=1;flag=0;
break;
}
case 0x7C: //减号
{
Cal[1]=1;flag=1;
break;
}
case 0x39: //乘号
{
Cal[1]=1;flag=2;
break;
}
case 0x5E: //除号
{
Cal[1]=1;flag=3;
break;
}
default:
Cal[0]=key;
break;
}
}
else
{
if(key!=0x71)
Cal[2]=key;//即是加号按下了 保存第二个加数 但这里同样有个问题 即是按下等号是 就是等号的值
// Display(key);//这步不搞这么负责 对于显示的只是进行 0-9的计算 对于其他的非法按键也没处理
else
{
a=get_int(Cal[0]);
b=get_int(Cal[2]);
// Value=a-b;
switch(flag)
{
case 0: Value=a+b;
break;
case 1: Value=a-b;
break;
case 2: Value=a*b;
break;
case 3: Value=a/b;
break;
default :
break;
}
p[0]=Value%10;//个位 为什么Add_Value 总是等于a 也就是第一次按出的数
p[1]=Value/10;//十位
while(1)
DispValue();
//delay(200);
}
}
Display(key);
}/*
while(1){
while(!KEYPRESSED());//不断的检测是否有按键按下 是否可以运行
delay(5);
key=KeyScan();
//while(KEYPRESSED())
Display(key);
delay(50); //注意注意::这个延时信号必须在适当的范围 大了则可能无法检测到数值 导致无法响应键盘操作
// key=0x6D;//没有按下时初始显示0
//Display(key);//初始显示
}
while(!KEYPRESSED());//不断的检测是否有按键按下 是否可以运行
delay(5);
key=KeyScan();
//while(KEYPRESSED())
Display(key);
*/
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -