用51单片机中断编写的4x4键盘程序.docx

上传人:b****9 文档编号:23327666 上传时间:2023-05-16 格式:DOCX 页数:9 大小:297.05KB
下载 相关 举报
用51单片机中断编写的4x4键盘程序.docx_第1页
第1页 / 共9页
用51单片机中断编写的4x4键盘程序.docx_第2页
第2页 / 共9页
用51单片机中断编写的4x4键盘程序.docx_第3页
第3页 / 共9页
用51单片机中断编写的4x4键盘程序.docx_第4页
第4页 / 共9页
用51单片机中断编写的4x4键盘程序.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

用51单片机中断编写的4x4键盘程序.docx

《用51单片机中断编写的4x4键盘程序.docx》由会员分享,可在线阅读,更多相关《用51单片机中断编写的4x4键盘程序.docx(9页珍藏版)》请在冰豆网上搜索。

用51单片机中断编写的4x4键盘程序.docx

用51单片机中断编写的4x4键盘程序

用51单片机中断编写的4x4键盘程序

    应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长(详见2013年9月29日博文《MSP430和AT89C51单片机4x4键盘C程序》),如果用中断编写,设置中断响应在下降沿时执行中断,则程序编写不用去抖动判断,所以相比较要简单很多!

下面用汇编和C语言两种方式编写4X4键盘程序!

    一、汇编程序

          ORG0000H

           LJMPMAIN

           ORG0003h

            LjmpZD0

           ORG000Bh

           LJMPTZD0

            ORG0013h

           LjmpZD1

           ORG001Bh

           LJMPTZD1

          ORG0040H

MAIN:

MovTMOD,#66h

          MOVTH0,#0ffh

          MOVTL0,#0ffh

          MOVTH1,#0ffh

          MOVTL1,#0ffh

          SETBEA

          SETBET0

          SETBTR0

          SETBET1

          SETBTR1

          SETBIT0

          SETBIT1

          SETBEX0

          SETBEX1

xh:

     movP1,#0feh

         LcallDelay

         movP1,#0fdh

         LcallDelay

         movP1,#0fbh

         LcallDelay

         movP1,#0f7h

         LcallDelay

         SJMPxh

ZD0:

 JNBP1.0,dat1

        JNBP1.1,dat2

        JNBP1.2,dat3

        JNBP1.3,dat4

dat1:

movP2,#06h ;1

        sjmpZD0R

dat2:

movP2,#5bh ;2

        sjmpZD0R

dat3:

movP2,#4fh ;3

        sjmpZD0R

dat4:

movP2,#66h ;4

ZD0R:

reti

ZD1:

 JNBP1.0,dat5

        JNBP1.1,dat6

        JNBP1.2,dat7

        JNBP1.3,dat8

dat5:

movP2,#6dh ;50110

        sjmpZD1R

dat6:

movP2,#7dh ;6

        sjmpZD1R

dat7:

movP2,#07h ;7

        sjmpZD1R

dat8:

movP2,#7fh ;8

ZD1R:

reti

TZD0:

JNBP1.0,dat9

         JNBP1.1,dat0

          JNBP1.2,dat10

          JNBP1.3,dat11

dat9:

  movP2,#6fh ;9

          sjmpZD0R

dat0:

  movP2,#3fh ;0

          sjmpZD0R

dat10:

movP2,#77h ;A

          sjmpZD0R

dat11:

movP2,#7ch ;B

TZD0R:

reti

TZD1:

JNBP1.0,dat12

          JNBP1.1,dat13

          JNBP1.2,dat14

          JNBP1.3,dat15

dat12:

movP2,#39h ;C

          sjmpTZD1R

dat13:

movP2,#5eh ;D

         sjmpTZD1R

dat14:

movP2,#79h ;E

         sjmpTZD1R

dat15:

movP2,#71h ;F

TZD1R:

reti

Delay:

movr7,#10d

     djnzr7,$

     ret

     end     

二、C语言程序(扫描P1)

  #include"reg51.h"

intyu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

inti,j,k,time,temp,dat;

voiddelay(time)

{

 while(time--)

  for(i=0;i<120;i++);

}

voidmain()

{

 P2=0x40;

 TMOD=0x66; //设定定时计数器T0、T1为方式2计数模式

 TH0=0xFF;

 TL0=0xFF;

 TH1=0xFF;

 TL1=0xFF;

 IE=0x8F;   //开总中断和定时计数器两个中断,两个外中断

 IT0=1;

 IT1=1;     //设置外中断为下降沿触发

 TR0=1;

 TR1=1;      //打开定时计数器开始计数

 while

(1)

   {

    P1=0xfe;

    delay

(1);

    P1=0xfd;

    delay

(1);

    P1=0xfb;

    delay

(1);

    P1=0xf7;

    delay

(1);

   }

}

voidintsvr0(void)interrupt0 using1

{

 

 temp=P1;

 switch(temp)

           {

          case0xfe:

key=0;break;

          case0xfd:

key=1;break;

          case0xfb:

key=2;break;

          case0xf7:

key=3;break;

          default:

break;

           }

 P2=yu[dat];

}

voidtimer0(void)interrupt1using1

{

 

 temp=P1;

 if(temp==0xfe) dat=4;

 if(temp==0xfd)dat=5;

 if(temp==0xfb)dat=6;

 if(temp==0xf7)dat=7;  

 P2=yu[dat];

}

voidintsvr1(void)interrupt2using1

{

 

 temp=P1;

  if(temp==0xfe) dat=8;

 if(temp==0xfd)dat=9;

 if(temp==0xfb)dat=10;

 if(temp==0xf7)dat=11;  

 P2=yu[dat];

}

voidtimer1(void)interrupt3using1

{

 intdat;

 temp=P1;

 switch(temp)

           {

          case0xfe:

key=12;break;

          case0xfd:

key=13;break;

          case0xfb:

key=14;break;

          case0xf7:

key=15;break;

          default:

break;

           }

 P2=yu[dat];

  } 

/*************************************************************/

三、C语言(扫描P3的P3.0、P3.1、P3.6、P3.7)

从这个程序也可以看出51单片机I/O口没有方向性,输入输出都可读写,而且在一个寄存器中。

注意该程序对应电路图与上图的区别。

#include"reg51.h"

sbitpp0=P3^0;

sbitpp1=P3^1;

sbitpp2=P3^6;

sbitpp3=P3^7;

intyu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

inti,j,k,time,temp,dat;

voiddelay(time)

{

 while(time--)

  for(i=0;i<120;i++);

}

voidmain()

{

 P2=0x40;

 TMOD=0x66; //设定定时计数器T0、T1为方式2计数模式

 TH0=0xFF;

 TL0=0xFF;

 TH1=0xFF;

 TL1=0xFF;

 IE=0x8F;   //开总中断和定时计数器两个中断,两个外中断

 IT0=1;

 IT1=1;     //设置外中断为下降沿触发

 TR0=1;

 TR1=1;      //打开定时计数器开始计数

 while

(1)

   {

    pp0=0;

    delay(5);

    pp0=1;

    pp1=0;

    delay(5);

    pp1=1;

    pp2=0;

    delay(5);

    pp2=1;

    pp3=0;

    delay(5);

    pp3=1;

     /*以上可用下列这段代替

    P3=0xfe;

    delay(5);

    P3=0xfd;

    delay(5);

    P3=0xbf;

    delay(5);

    P3=0x7f;

    delay(5);*/ 

   }

}

voidintsvr0(void)interrupt0 using1

{

 

 temp=P3;

 switch(temp)                  

   {

     case0xfa:

dat=0;break;   

     case0xf9:

dat=1;break;    

     case0xbb:

dat=2;break; 

     case0x7b:

dat=3;break;

     default:

break;

   }

 P2=yu[dat];

}

voidtimer0(void)interrupt1using1

{

 

 temp=P3;

 if(temp==0xee)dat=8;

 if(temp==0xed)dat=9;

 if(temp==0xaf)dat=10;

 if(temp==0x6f)dat=11;

 P2=yu[dat];

}

voidintsvr1(void)interrupt2using3

{

 

 temp=P3;

 if(temp==0xf6)dat=4;

 if(temp==0xf5)dat=5;

 if(temp==0xb7)dat=6;

 if(temp==0x77)dat=7;

 P2=yu[dat];

}

voidtimer1(void)interrupt3using1

{

 intdat;

 temp=P3;

 switch(temp)                  

   {

     case0xde:

dat=12;break;   

     case0xdd:

dat=13;break;    

     case0x9f:

dat=14;break; 

     case0x5f:

dat=15;break;

     default:

break;

   }

 P2=yu[dat];

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1