4*4键盘 中断方式为PROTB口的RB7-RB4电平变化中断; RB7-RB4接行扫描线,RB3-RB0接列扫描; 具体电路见张明峰的《PIC单片机入门与实战》第172页。 出现的问题是。能正常显示扫描码(外接了一个带字库的LCD屏。但是同时按下一行(4个)按键程序就死了(LCD屏上的扫描码不刷新了 ——没开看门狗)。 请前辈指点下,谢谢了。
//端口的初始化; void port_init() { ADCON1=0X07; // 初始化I/O,使其工作在数字I/O状态 TRISA = 0xFF; //ff; 0 out; 1 in
//初始化RB口为电平变化中断 TRISB = 0xF0; //RB口设置为输入,低输出; RBPU=0; //使用RB口弱上拉 PORTB=0; //PORTB 低4位输出0 INTCON=0; // 清除INTCON 所有中断禁止; RBIE=1 ; //允许RB口电平变化中断;
//****在这里没有打开全局中断*************** TRISC = 0x3E; //fe "0011 1110" TRISD = 0x00; TRISE = 0x01; //df; "0000 0001" busy(输入) req(输出) }
static uchar key_t,key_i; uchar key_a=200; void interrupt INTS(void) { if(RBIE && RBIF) { if(PORTB!=0xf0) { while(key_a--); //有键按下消抖后再判断; if(PORTB!=0xf0) { PORTB=0xfe; //准备扫描码; NOP(); NOP(); for(key_i=0;key_i<4;key_i++) //最多扫4次; { if((PORTB&0xf0)!=0xf0) {key=PORTB; //得到的扫描码。 press++; break; } else {CARRY=1; //置位进位标志。 PORTB=PORTB<<1; NOP(); NOP(); } } } else { interfere++; //可能干扰; }
} else { rebound++;//按键弹起; } } end: enter++; //中断进入次数;
PORTB=0; // 清0 RB口;进行下一次扫描; key_t=PORTB; //读一次RB口清中断标志; RBIF=0; //清软件中断标志 GIE=1; //开中断; }
|