大家好,请帮我看看以下问题 1.为什么我PC0不能输出1,我就将R20直接接到VCC。 2.为什么我按SW1~SW6,能在LED上显示正确的1~6数示。按其它的按键就显示乱码了。 3.还有按键要按好几下才能动作。 /*采用内部1M晶振*/ #include <iom16v.h> #include <macros.h> /*LED共阳代码*/ unsigned char KEY_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; unsigned char temp,key; /*端口初始化*/ void key_init(void) { DDRA = 0xF0; PORTA= 0x0F; DDRB = 0xFF; PORTB= 0xFF; DDRC = 0xFF; PORTC= 0x01; DDRD = 0xFB; PORTD= 0x04; } /*中断初始化*/ void int0_init(void) { GICR = 0x40; MCUCR= 0x00; SEI(); } void delay_ms(unsigned int i) { unsigned int j; unsigned int k; for(k=0;k<i;k++) { for(j=0;j<225;j++); {; } } } #pragma interrupt_handler Int0: 2 /*外部中断INT0*/ void Int0(void) { do { unsigned char temp; CLI(); temp=PINA; //引脚上的电平 temp&=0x0F; temp=~(temp|0xF0); if(temp==1) key=0; else if(temp==2) key=4; else if(temp==4) key=8; else if(temp==8) key=12; else key=16; DDRA = 0x0F; PORTA= 0xF0; delay_ms(100); temp=PINA; temp&=0xF0; temp=~((temp>>4)|0xF0); if(temp==1) key+=0; else if(temp==2) key+=1; else if(temp==4) key+=2; else if(temp==8) key+=3; else key=16; key_init(); } while(PIND==0x04) SEI(); } int main(void) { key_init(); /*PROTB初始化*/ int0_init(); /*中断初始化*/ while(1) { PORTB=KEY_table[key]; delay_ms(100); MCUCR=0x40; /*开启SLEEP*/ } } |