C语言按键,廷时,中断,显示程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// 该程序通过 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);
/* 初始化子程序 */
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)
{
} /* 等待中断 */
}

相关文档
最新文档