PORTB的电平变化中断进行键盘输入

发布者:yanfeng00最新更新时间:2012-12-31 来源: 51hei关键字:PORTB  电平变化中断  键盘输入 手机看文章 扫描二维码
随时随地手机看文章

//该程序通过PORTB的"电平变化中断"进行键盘的输入,使按下K1键时第一个数码管显示1,按下K2
//键时第一个数码管上显示2,按下K3键时第一个数码管上显示3,按下K4键时第一个数码管上显示4
//对键盘的扫描采用中断方式

#include "p18f458.h"

unsigned  char data;
unsigned  int i;
unsigned  char j;
const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};

void InterruptHandlerHigh(void);

/*初始化子程序*/
/* http://www.51hei.com 提供此程序*/
void  initial()
{
 INTCON=0x08;    /*关闭所有中断,B口变位中断允许*/
 INTCON2=0x01;    /*使能B口弱上拉,B口变位中断高优先级*/
 RCONbits.IPEN=1;    /*使能中断优先级*/
 TRISA=0x00;     /*A口设置为输出*/
 TRISB=0XF0;     /*RB1输出,RB4输入*/
 TRISC=0x00;     /*SDO引脚为输出,SCK引脚为输出*/
 TRISE=0x00;     /*E口设置为输出*/
 SSPCON1=0x30;    /*SSPEN=1;CKP=1,FOSC/4*/
 SSPSTAT=0xC0;    /*时钟下降沿发送数据*/
 PIR1=0;      /*清除SSPIF标志*/
 data=0X00;     /*待显示的寄存器赋初值*/ 
 PORTBbits.RB1=0;
 PORTAbits.RA3=0;
 PORTE=0;     /*将K1,K2,K3,K4四条列线置0*/
 PORTB=PORTB;    /*读B口的值,为变位中断创造条件*/ 
}

/*键服务子程序*/ 
void KEYSERVE()
{
 PORTBbits.RB1=0;    /*K1,K2置低电平,K3,K4置高电平*/
 PORTAbits.RA3=0;    /*RB4为0,表示按键为K1,K2中的一个*/
 PORTE=3;     /*RB4为1,表示按键为K3,K4中的一个*/
 if(PORTBbits.RB4==0)
 {
  PORTBbits.RB1=0;   /*K1置低电平,K2置高电平*/
  PORTAbits.RA3=1;   /*RB4为0,表示按键为K1;RB4为1,表示按键为K2*/
  if(PORTBbits.RB4==0) j=0X01;
  else {j=0X02; PORTAbits.RA3=0;}
 }
 else
 {
  PORTEbits.RE0=0;   /*K3置低电平,K4置高电平*/
  PORTEbits.RE1=1;   /*RB4为0,表示按键为K3;RB4为1,表示按键为K4*/
  if(PORTBbits.RB4==0) j=0X03;
  else {j=0X04; PORTEbits.RE1=0;}  
 }
}

/*软件延时子程序*/
void  DELAY()
{
 for(i = 6553; --i ;)
 continue;
}

/*显示子程序*/
void SPILED(char data)
{
 PORTAbits.RA5=0;     /*LACK送低电平,为锁存做准备*/
 SSPBUF=data;      /*启动发送*/
 do
 {
 ;
 }while(PIR1bits.SSPIF==0);   /*等待发送完毕*/
 PIR1bits.SSPIF=0;     /*清除SSPIF标志*/
 PORTAbits.RA5=1;     /*最后给锁存信号,代表显示任务完成*/
}

/*高优先级中断向量*/
#pragma code InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh    /*跳到中断程序*/
  _endasm
}

/*高优先级中断程序*/
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
 INTCONbits.RBIF=0;   /*中断标志清0*/  
 DELAY();     /*软件延时*/
 PORTB=PORTB;    /*读PORTB的值,并改变中断发生的条件,可屏蔽*/
        /*一次按键松开时产生的无效的中断,又可以防止按键*/
        /*时间过长发生连续中断*/
 if(PORTBbits.RB4==0)
 {  
  KEYSERVE();    /*进行键盘的识别*/
  PORTBbits.RB1=0;
  PORTAbits.RA3=0;
  PORTE=0;    /*将K1,K2,K3,K4四条列线置0,以防止键扫描时改变*/ 
        /*K1,K2,K3,K4的电平,从而改变中断条件*/
  INTCONbits.RBIF=0;  /*键扫描时可能会产生"电平变化"而使置1,再清除一次*/
        /*RBIF以求避免额外中断*/  
  data=table[j];    /*获得需要送出显示的段码*/
  SPILED(data);
 }
}

/*主程序*/
main()
{
 initial();      /*系统初始化*/
 INTCONbits.GIE=1;    /*总中断允许*/
 while(1)
 {
 }       /*等待中断*/
}

关键字:PORTB  电平变化中断  键盘输入 引用地址:PORTB的电平变化中断进行键盘输入

上一篇:CCP1模块产生分辨率为10位的PWM波形的程序
下一篇:单片机串行口通信程序汇编语言编写

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

单片机键盘输入及串口发送
#include reg52.h typedef unsigned char uchar; typedef unsigned int uint; //数码管端口控制 sbit SG = P0^0; //控制个位 sbit SS = P0^1; //控制十位 unsigned char code rst ={0xe4,0xc0,0xe0,0xc0,0xe0,0x22};//定义一个code类型 实现软件复位 uchar tab0 = {0x81,0xbd,0x92,0x98,0xac,0xc8,0xc0,0x9d,0x80,0x88}; //0~9 共阳数码管 uchar tab1 ={0xfe,0xfe
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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