可以产生中断,但得不到按键码,求高手指教 采用AVRMEGA16单片机,CH452的DOUT接PD2, 以下为进入中断后调用的键盘程序: #define ch452_dclk_H PORTB|=BIT(7) #define ch452_dclk_L PORTB&=~BIT(7) #define ch452_din_H PORTB|=BIT(5) #define ch452_din_L PORTB&=~BIT(5) #define ch452_load_H PORTB|=BIT(6) #define ch452_load_L PORTB&=~BIT(6) #define ch452_dout PIND&=0x04 void get_keycode(void) { uchar keycode,i; uchar data; GICR=0x00;//中断禁止 data=0X07; ch452_load_L; for(i=0;i<4;i++) { if((data&0x01)==1) ch452_din_H; else ch452_din_L; ch452_dclk_L; data>>=1; ch452_dclk_H; } ch452_load_H;//高电平加载数据 keycode=0; for(i=0;i<7;i++) { keycode<<=1;//数据移入keycode,高位在前,低位在后 if(ch452_dout) keycode++ ;//从高到低读入452的数据 ch452_dclk_L;//产生时钟下升沿通知CH452输出下一位 ch452_dclk_H; } GIFR=0X40;//清除中断标志 GICR=0x40;//中断允许 }
建议将keycode设置为全局变量,然后全速运行测试一下。中断来了,说明芯片已经检测到按键了,只要在中断中读键值就可以了。
不行啊,这是我的主函数,问题是进入主函数后,有按键按下时,中断标志位有变化,但是读不到按键值 void main() { uint fuc,data,ad_c,i,j; uint ch452_system=0x0403,ch452_display=0x0580; uchar x; init_devices(); ch452_write(ch452_system); //设定系统参数,按键中断低电平有效,低速闪烁(1Hz), //字驱动DIG输出低电平有效,启动键盘扫描,允许显示驱动 ch452_write(ch452_display);//设定显示参数,选择BCD译码,扫描极限为8 for(i=0;i<6;i++) { ad_c=a[i]+i; ch452_write(ad_c); } while(1) { if(GIFR&0x40) { for(i=0;i<6;i++)//如有按键按下,各个数码管闪烁显示 { ch452_write(b[i]); delay(2); } if(keycode==0x46)//如按键1按下,显示F00 { key_flag=~key_flag; for(i=3;i<5;i++) { x=EEPROM_read(0x00); x=a[i]+0; ch452_write(x);//加载显示数据 } ch452_write(a[5]+0x0F); ch452_write(b[0]);//DS0闪烁 } } } }
你的keycode在get_keycode子程序中是一个局部变量,然后你到主程序中使用这个keycode,这怎么可以呢?另外,只要能进中断,就说明芯片已经正常工作了,至于能否读到键值,就要看你程序了。你现在把keycode设置为全局变量试试。
我已经将keycode设为全局变量了
我已经将keycode设为全局变量了
呵呵!那现在是一个什么现象呢?
怎么不能传图片?现在老样子!按键按下后,中断标志位为置一,可以进入for语句闪烁显示,但是接下来keycode还是0,没读出来。
你这样吧!你把整个程序发到我有的邮箱,帮你看一下!
你邮箱是多少啊?
技术支持的邮箱tech@wch.cn或者我的邮箱zyq@wch.cn。
搞定了,是中断设置的问题,谢谢了
求CH452按键程序,我用的是ATmega64,不知道你的程序还有没有,能给我发一份吗?602309197这是我邮箱
资料已发送,请查收。