聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> 键盘

键盘

时间:2012-12-29 22:42:45    下载该word文档

#include

#include "delay.h"

#include "LCD1602.h"

#include "KEY.h"

#define uchar unsigned char

#define uint unsigned int

uchar num; //存放按键标识

uchar denghao=0,flag=0,fuhao,key; //denghao存放是否按下等号键,flag存放是否按下符号键,fuhao存放按下是什么符号,key存放按键ASCII码值

long a,b,c; //加数ab 结果为c

uchar code table[]={ //键盘显示编码,加上0x30,为对应的ASCII 0x2f-0x30

7, 8, 9, 0x2f-0x30, // 1 2 3 + 0x2a-0x30

4, 5, 6, 0x2a-0x30, // 4 5 6 - 0x2d-0x30

1, 2, 3, 0x2d-0x30, // 7 8 9 * 0x2b-0x30

0x2f-0x30, 0x2a-0x30, 0, 0x2b-0x30}; // 0 = CE / ; 0x01-0x30, 0, 0x3d-0x30, 0x2f-0x30}; // 0 = CE / ;

void keyscan()

{

uchar temp;

KEY_8=0xfe; //1111 1110

temp=KEY_8;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay_nms(20);

temp=KEY_8;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=KEY_8;

switch(temp)

{

case 0xee:num=0;break; //1110 1110

case 0xde:num=1;break; //1101 1110

case 0xbe:num=2;break; //1011 1110

case 0x7e:num=3;break; //0111 1110

}

while(temp!=0xf0) //等待按键释放

{

temp=KEY_8;

temp=temp&0xf0;

}

}

if(num==0||num==1||num==2) //判断是按下1,2,3

{

if(flag==0) //如果没有按符号键,符号前的数值为a

a=a*10+table[num];

else if(flag==1) //如果按了符号键,符号后的数值为b

b=b*10+table[num];

if(denghao==1) //如果之前按了'=',再按键时清屏,进行下一次计算

{

denghao=0;

LCD_init();

LCD_write_str(0,0,"JIsuanqitest");

write_com(0x80+0x40); //清屏

}

}

else if(num==3) //判断是否按下+

{

flag=1;

fuhao=4;

}

key=table[num]; //显示按下的键

write_dat(0x30+key);

}

KEY_8=0xfd; // 1111 1101

temp=KEY_8;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay_nms(20);;

temp=KEY_8;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=KEY_8;

switch(temp)

{

case 0xed:num=4;break; //1110 1101

case 0xdd:num=5;break; //1101 1101

case 0xbd:num=6;break; //1011 1101

case 0x7d:num=7;break; //0111 1101

}

while(temp!=0xf0) //等待按键释放

{

temp=KEY_8;

temp=temp&0xf0;

}

}

if(num==4||num==5||num==6) //判断是按下4,5,6

{

if(denghao==1) //如果之前按了'=',再按键时清屏,进行下一次计算

{

denghao=0;

LCD_init();

LCD_write_str(0,0,"JIsuanqitest");

write_com(0x80+0x40); //清屏

}

if(flag==0) //如果没有按符号键,符号前的数值为a

a=a*10+table[num];

else if(flag==1)//如果按了符号键,符号后的数值为b

b=b*10+table[num];

}

else if(num==7) //判断是否按下-

{

flag=1;

fuhao=3;

}

key=table[num]; //显示按下的键

write_dat(0x30+key);

}

KEY_8=0xfb; //1111 1011

temp=KEY_8;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay_nms(20);

temp=KEY_8;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=KEY_8;

switch(temp)

{

case 0xeb:num=8;break; //1110 1011

case 0xdb:num=9;break; //1101 1011

case 0xbb:num=10;break; //1011 1011

case 0x7b:num=11;break; //0111 1011

}

while(temp!=0xf0)

{

temp=KEY_8;

temp=temp&0xf0;

}

}

if(num==8||num==9||num==10) //判断是按下7,8,9

{

if(denghao==1) //如果之前按了'=',再按键时清屏,进行下一次计算

{

denghao=0;

LCD_init();

LCD_write_str(0,0,"JIsuanqitest");

write_com(0x80+0x40); //清屏

}

if(flag==0)

a=a*10+table[num]; //如果没有按符号键,符号前的数值为a

else if(flag==1)

b=b*10+table[num]; //如果按了符号键,符号后的数值为b

}

else if(num==11) //判断是否按下*

{

flag=1;

fuhao=2;

}

key=table[num];

write_dat(0x30+key);

}

KEY_8=0xf7; //1111 0111

temp=KEY_8;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay_nms(20);

temp=KEY_8;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=KEY_8;

switch(temp)

{

case 0xe7:num=12;break; //1110 0111

case 0xd7:num=13;break; //1101 0111

case 0xb7:num=14;break; //1011 0111

case 0x77:num=15;break; //0111 0111

}

while(temp!=0xf0)

{

temp=KEY_8;

temp=temp&0xf0;

}

}

switch(num)

{

case 13: //0

{

if(denghao==1) //如果之前按了'=',再按键时清屏,进行下一次计算

{

denghao=0;

LCD_init();

LCD_write_str(0,0,"JIsuanqitest");

write_com(0x80+0x40); //清屏

}

if(flag==0)

a=a*10;

else if(flag==1)

b=b*10;

write_dat(0x30);

}

break;

case 14: //=键(+-*/、)

{

denghao=1;

if(fuhao==1) //如果符号键是+,执行+运算

{

write_com(0x80+0x4f); //使结果从屏幕最右下角显示出来

write_com(0x04); //从右到左显示

c=a+b;

while(c!=0)

{

write_dat(0x30+c%10);

c=c/10;

}

write_dat(0x3d); //显示等号=

fuhao=0;

a=0;

b=0;

flag=0;

}

if(fuhao==2) //如果符号键是-,执行-运算

{

write_com(0x80+0x4f); //使结果从屏幕最右下角显示出来

write_com(0x04);

if(a>=b)

{

c=a-b;

while(c!=0)

{

write_dat(0x30+c%10);

c=c/10;

}

}

else if(a

{

c=b-a;

while(c!=0)

{

write_dat(0x30+c%10);

c=c/10;

}

write_dat(0x2d); //显示负号

}

write_dat(0x3d); //显示等号=

a=0;

b=0;

flag=0;

fuhao=0;

}

if(fuhao==3) //如果符号键是*,执行*运算

{

write_com(0x80+0x4f); //使结果从屏幕右下角显示出来

write_com(0x04);

c=a*b;

while(c!=0)

{

write_dat(0x30+c%10);

c=c/10;

}

write_dat(0x3d); //显示等号=

a=0;

b=0;

flag=0;

fuhao=0;

}

if(fuhao==4) //如果符号键是/,执行/运算

{

key=0; //小数位数

write_com(0x80+0x4f);

write_com(0x04);

if(b!=0) c=(long)( ( (float)a/b )*10000); //结果保留4位小数

else LCD_write_str(1,15,"rorre"); //显示错位

while(c!=0)

{

write_dat(0x30+c%10);

c=c/10;

key++;

if(key==4) //显示完六位小数后,显示小数点

write_dat(0x2e); //显示小数点

}

if(a/b<=0)

{

write_dat(0x30); //显示0

}

write_dat(0x3d); //显示等号

a=0;

b=0;

flag=0;

fuhao=0;

}

}

break;

case 12:

{

LCD_init();

LCD_write_str(0,0,"JIsuanqitest");

write_com(0x80+0x40); //清屏

a=0;

b=0;

flag=0;

fuhao=0;

}

break;

case 15:

{

flag=1;

fuhao=1;

write_dat(0x30+table[num]);

}

break;

}

}

}

void jisuanqi_main()

{

keyscan();

}

void int1() interrupt 2

{

EX1=0;//关外部中断1

//music_delay1(1);//去抖

EX1=1;//开外部中断1

}

免费下载 Word文档免费下载: 键盘

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服