在一本书上看到这么一个程序,感觉没错误。但用proteus仿真执行起来,不对。请指教电路图
- #include<avr/io.h>
- #include<util/delay.h>
- #define uchar unsigned char
- #define uint unsigned int
- const uchar seg_code[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~9,A~F,共阴数码管
- uchar key_num=16; //表示无按键
- //判断是否有键按下
- uchar key_press()
- {
- //高四位输出全零,低四位输入
-
- DDRD=0XF0;
- PORTD=0X0F;_delay_ms(1);
- return PIND!=0X0F?1:0;
- }
- //键盘扫描
- uchar key_scan()
- {
- /按键后,00001111变为0000XXXX,X中有一个0,其余为1
- //下面判断按键发生在哪一行,赋值为行初值
- switch(PIND)
- {
- case 0B00001110:key_num=0;break;
- case 0B00001101:key_num=4;break;
- case 0B00001011:key_num=8;break;
- case 0B00000111:key_num=12;break;
- default:key_num=0xff;
- }
- //高四位输入,低四位输出全零
- DDRD=0X0F;PORTD=0xF0;_delay_ms(1);
- //按键后,11110000变为XXXX0000,X中有一个0,其余为1
- //下面判断按键发生在第几列
- switch(PIND)
- {
- case 0B11100000:key_num+=0;break;
- case 0B11010000:key_num+=1;break;
- case 0B10110000:key_num+=2;break;
- case 0B01110000:key_num+=3;break;
- default:key_num=0xff;
- }
- return key_num;
- }
- void main(void)
- {
- uchar l;
- DDRC=0XFF;PORTC=0X00;
- while(1)
- {
- if(key_press())
- l=key_scan();
- else continue;
- if(key_num<16)
- PORTC=seg_code[l];
- while(key_press()); //按键未释放,则等待
- }
- }
|