在一本书上看到这么一个程序,感觉没错误。但用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()); //按键未释放,则等待
}
}
|