中断扫描实现计算器程序

发布者:疯狂小马最新更新时间:2014-12-10 来源: laogu关键字:中断扫描  计算器程序  键盘扫描. 手机看文章 扫描二维码
随时随地手机看文章

单片机小制作时写的一些小程序,在最小系统上运行成功,采用的是中断键盘扫描.
//****键值表如下:

//    1 2 3 4
//    5 6 7 8
//    9 + - *
//    /   = CLR 
//*************//

 

#include
#define unint unsigned int
#define unchar unsigned char

sbit P3_4=P3^4;
sbit P3_5=P3^5;
unchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
                            0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
                               0xc6,0xa1,0x86,0x8e,0x00
};
#define ADD 10
#define SUB 11
#define MUL 12
#define DIV 13


void delay(unint c){
unint i,j;
for(j=0;jfor(i=0;i<200;i++)
{;}
}
}
//**************键盘扫描程序**************
unint  keyscan(void)
{  unint n;
   delay(1);
   if((P1&0xF0)!=0xF0)
    {
   P1=0xFE;
   if((P1&0xFE)!=0xFE)
    {
     if((P1&0xFE)==0xEE)
    n=1;
  else if((P1&0xFE)==0xDE)
    n=2;
  else if((P1&0xFE)==0xBE)
          n=3;
        else
          n=4;
    }
   P1=0xFD;
   if((P1&0xFD)!=0xFD)
    {
     if((P1&0xFD)==0xED)
    n=5;
  else if((P1&0xFD)==0xDD)
    n=6;
  else if((P1&0xFD)==0xBD)
    n=7;
        else
          n=8;
    }
   P1=0xFB;
   if((P1&0xFB)!=0xFB)
    {
      if((P1&0xFB)==0xEB)
     n=9;
   else if((P1&0xFB)==0xDB)
     n=10;
   else if((P1&0xFB)==0xBB)
     n=11;
         else
           n=12;
    }
      P1=0xF7;
      if((P1&0xF7)!=0xF7)
    {
      if((P1&0xF7)==0xE7)
     n=13;
   else if((P1&0xF7)==0xD7)
     n=14;
   else if((P1&0xF7)==0xB7)
     n=15;
         else
           n=16;
    }
  }
   else
         n=0;
         P1=0xF0;
         return(n);
}

 


//LED数值显示程序
void led_display(unint m){

switch(m)
{
case 1:P2=~0xf1;P0=0xf9;break;//LED以二进制形式显示1
case 2:P2=~0xf2;P0=0xa4;break;//LED以二进制形式显示2
case 3:P2=~0xf3;P0=0xb0;break;//LED以二进制形式显示3
case 4:P2=~0xf4;P0=0x99;break;//LED以二进制形式显示4
case 5:P2=~0xf5;P0=0x92;break;//LED以二进制形式显示5
case 6:P2=~0xf6;P0=0x82;break;//LED以二进制形式显示6
case 7:P2=~0xf7;P0=0xf8;break;//LED以二进制形式显示7
case 8:P2=~0xf8;P0=0x80;break;//LED以二进制形式显示8
case 9:P2=~0xf9;P0=0x90;break;//LED以二进制形式显示9
case 10:P2=~0xfa;P0=0x88;break;//LED以二进制形式显示10
case 11:P2=~0xfb;P0=0x83;break;//LED以二进制形式显示11
case 12:P2=~0xfc;P0=0xc6;break;//LED以二进制形式显示12
case 13:P2=~0xfd;P0=0xa1;break;//LED以二进制形式显示13
case 14:P2=~0xfe;P0=0x86;break;//LED以二进制形式显示14
case 15:P2=~0xff;P0=0x8e;break;//LED以二进制形式显示15
case 16:P2=~0x00;P0=0xc0;break;//CLR 
}
}


void service_int0()interrupt 0 using 2//采用中断0触发中断的程序
{

 

unint last;//第一次键入的数值
unint second;//第二次键入的数值
unint result;//最终运算结果
unint op;//用来存储+、-、*、/操作符键值

last=0;
second=0;
result=0;
op=0;
keyscan();

if(keyscan()>0&&keyscan()<10){//得到的键盘数值是数字的1-9之间的。
   if (last==0){
   last=keyscan();
   led_display(last);//显示第一次按键键值
   delay(200);}
   else{
   second=keyscan();
   led_display(second);//显示下一次按键键值
   delay(200);
}
}
else if(keyscan()>9&&keyscan()<14){//返回的键值为10代表+,11代表-,12代表*,13代表/。
op=keyscan();//将+、-、*、/的键值赋给操作符OP
}
else if((keyscan()==14) (keyscan()==15)){//返回的键值为15则代表=。
led_display(result);
delay(200);//显示最终的计算结果。
last=0;//清零回复初始状态,当然我们也可以设置一个CLR键来达到此目的。
second=0;
result=0;
op=0;
}
else if(keyscan()==16){//返回的键值为16代表CLR。
led_display(16);

last=0;//清零回复初始状态,当然我们也可以设置一个CLR键来达到此目的。
second=0;
result=0;
op=0;
}

 

//***** 四则运算程序*****
if(op!=0&&last!=0&&second!=0)
{
// 判断是否操作符键以及先后两次的数值键都已经按下。

switch(op){
case 10:result=last+second;if(result>=16){result=result%10;} break;
case 11:result=last-second;if(result>=16){result=result%10;}break;
case 12:result=last*second;if(result>=16){result=result%10;}break;
case 13:result=last/second;if(result>=16){result=result%10;}break;
}
}
}

     

void main(void){

P0=0xc0;
P2=0xff;//四个LED全灭
P1=0xF0;//处于初始状态,当然随便你设置一个合适的值即可。

P3_4=0;
P3_5=1;
IT0=1;
EX0=1;
EA=1;

while(1);
}

关键字:中断扫描  计算器程序  键盘扫描. 引用地址:中断扫描实现计算器程序

上一篇:定时中断控制灯的亮灭
下一篇:LCD1602的滚动显示程序

推荐阅读最新更新时间:2024-03-16 13:48

Small RTOS的键盘扫描程序
Small RTOS的键盘扫描驱动程序及其在DP-51下载仿真实验仪上使用的例子。本驱动程序支持最大254个按键,最多3个按键同时按下。 驱动程序的使用 a) 在用户程序中添加一个任务KeyInput,优先级要比较高。 b) 设置几个常量的值。 KEY_READ_BUF_LEGTH:键盘消息队列缓冲区的大小。 KEY_START:发送KEY_DOWN消息与第一次发送KEY_ALWAYS消息的间隔时间,以系统节拍为单位。 KEY_DELAY:两次发送KEY_ALWAYS消息的间隔时间,以系统节拍为单位。 c) 编写一个与系统相关的函数KeyScan()。 KeyScan()进行一
[单片机]
单片机与单片机串行通讯+键盘扫描+数码管显示
发送的子程序:       MOV TMOD,#20H       MOV SCON,#11010000B       ANL PCON,#01111111B       MOV TH1,#0FDH       MOV TL1,#0FDH       SETB TR1 ALOOP1: INC R7             MOV A,R7             MOV 35H,A             MOV SBUF,#0E1H             JNB TI,$             CLR TI             JNB RI,$             CLR RI             MO
[单片机]
C51编程几个有用的模块-键盘扫描模块
键盘扫描模块有两种工作方式, 一种为自动的由时钟模块调用, 另一种是由程序员自行调用。 1) 由时钟模块自动调用的方式 将时钟模块实现文件(Timer.h)及键盘扫描模块的实现文件(KBScan。c)包含进工程, 在Config.h 文件中添加TIMER_KBSCANDELAY宏。 时钟模块自动对时钟中断进行计数, 当达到TIMER_KBSCANDELAY宏所定义的值后, 自动调用键盘扫描模块中的函数KBScanProcess()进行键盘扫描,也就是说,这个宏的值可以决定按键消抖动的时间。 用户应该提供两个回调函数OnKBScan()及onKeysPressed()。 在函数OnKBScan中进行键盘扫描, 并返回扫描
[单片机]
反转法键盘扫描 ATmega128
#include string.h #include stdio.h #define F_CPU 7372800 #include util/delay.h #include avr/io.h #include avr/iom128.h //*********************************************************************** // 定义变量区 //*********************************************************************** #define delay_us(x) _delay_us
[单片机]
扫描法读出4×4矩阵键盘,在数码管显示按键值
//电路说明如下。 //单片机:使用51系列兼容的即可; //4 4矩阵键盘:接在P1口; //两位数码显示器: P0口输出七段码,P2口输出位选码。 //============================================================== //C语言程序如下。 /************************************************************* * 文件名: KEY_LED.c * 功能 : 对4 4矩阵键盘进行输出,在数码管后两位显示按键值。 ***************************************************
[单片机]
用<font color='red'>扫描</font>法读出4×4矩阵<font color='red'>键盘</font>,在数码管显示按键值
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved