各位大虾:
我最近用PIC单片机写了一个按键控制步进电机程序,利用的是RB口的电平变化中断,程序基本上是按照一本教材上的写的,可是写完后用键盘的时候发现第一个按键和第三个按键功能是一样的(就是K5和K7),因为键盘是自己焊的,以为是键盘的问题,可检查后也没发现什么问题,希望各位能够指导一下。
//低优先级中断子程序
void interrupt low_priority LOW_ISR()
{
if(RBIF==1) //PORTB端口电平变化中断
{
//按键扫描子程序
keyscan_portb1_interrupt();
RBIF=0; //清中断标志
}
}
//PORTB(RB5)端口电平变化中断查询键值子程序,K5为手动模式启动按键,K6为手动模式停止按键,K7,K8为电机方向控制按键
void keyscan_portb1_interrupt()
{
if(RB5==0) //有键按下
{
delay(100); //若有键按下,则软件延时100MS防抖动
if(RB5==1)return; //防抖动后无键按下,判定为抖动,不做按键处理
//以下为防按键抖动后仍有键按下的查键值
RD0=0; //设置K5为低电平
RD1=0; //设置K6为低电平
RD2=1; //设置K7为低电平
RD3=1; //设置K8为低电平
if(RB5==0) // 按键是K5,K6中一个
{
RD1=1; //只有K5为低电平输出
if(RB5==0) //仅当K5为低电平时,RB5被下拉,则为K5键按下
{
key=5; //K5启动TMR2,系统开始快速运行
}
else key=6; //K6关闭TMR2,系统停止运行
portb_keyflag=1; //新建按下标志=1,表示有新键按下
RD0=0; //设置电平变化产生中断的初始条件
RD1=0;
RD2=0;
RD3=0;
PORTB=PORTB;
return;
}
RD0=1; //不是K5,K6键按下,则查找K7,K8,设K5,K6为高电平,不查K5,K6
RD1=1;
RD2=0;
RD3=0;
if(RB5==0)
{
RD3=1;
if(RB5==0)
{
key=7;
}
else key=8;
portb_keyflag=1;
RD0=0;
RD1=0;
RD2=0;
RD3=0;
PORTB=PORTB;
}
}
}
void main()
{
initial(); //系统初始化子程序
tm1int(); //TMR1初始化
portb_interrupt_initial(); //PORTB端口电平变化中断初始化
IPEN=1; //使能中断高优先级和低优先级
INTCON=INTCON|0xC0; //开总中断,开外围模块中断
while(1)
{
shoudong_qidong_move();
if(portb_keyflag==1) //若有按键按下
{
// anjian_deal(); //按键处理子程序
portb_keyflag=0; //清按键按下标志
if(key==5)
{
TMR1ON=1;
}
else if(key==6)
{
TMR1ON=0;
}
else if(key==7)
{
RD5=0;
}
else if(key==8)
{
RD5=1;
}
}
}
} |