// 返回值 : void //
///////////////////////////////////////////////////////////////////////
static void delayus(Xuint16 delay) {
volatile Xuint16 i, j; for (i = 0; i < delay; i++) for (j = 0; j < 10; j++) ; }
static void delayms(Xuint16 delay) {
volatile Xuint16 i,j; for(i=0;i /************************************************* Function: key_scan() 3、scription: 扫描键盘并返回键值 Calls: nono Called By: main Table Accessed: Table Updated: / Input: /。 Output: Return: 按键值 Others: *************************************************/ Xuint8 key_scan() { Xuint8 value; Xuint8 temp,sccode,recode; pio_SetDataDirection(&key,1,0x00);//设置为输出 //P1=0xf0; XGpio_DiscreteWrite(&key,1,0xf0);//输出0xf0 17 delayus(1); XGpio_SetDataDirection(&key,1,0xf0);//设置为输入 if((XGpio_DiscreteRead(&key,1)&0xf0)!=0xf0) //若读回值不是0xf0 { delayms(5); if((XGpio_DiscreteRead(&key,1)&0xf0)!=0xf0) { //P1=0xf0; XGpio_SetDataDirection(&key,1,0x00);//设置为输出 XGpio_DiscreteWrite(&key,1,0xf0);//输出0xf0 //temp=P1; XGpio_SetDataDirection(&key,1,0xf0);//设置为输入 temp=XGpio_DiscreteRead(&key,1); //读回值 sccode=temp&0xf0;//取高四位 //P1=0x0f; XGpio_SetDataDirection(&key,1,0x00);//设置为输出 XGpio_DiscreteWrite(&key,1,0x0f);//输出0x0f //temp=P1; XGpio_SetDataDirection(&key,1,0x0f);//设置为输入 temp=XGpio_DiscreteRead(&key,1); //读回值 recode=temp&0x0f;//取低四位 temp=sccode|recode; //xil_printf(\ switch(temp) { case 0xEE:value=0;break; case 0xDE:value=1;break; case 0xBE:value=2;break; case 0x7E:value=3;break; case 0xED:value=4;break; case 0xDD:value=5;break; case 0xBD:value=6;break; case 0x7D:value=7;break; case 0xEB:value=8;break; case 0xDB:value=9;break; case 0xBB:value=10;break; case 0x7B:value=11;break; case 0xE7:value=12;break; case 0xD7:value=13;break; case 0xB7:value=14;break; case 0x77:value=15;break; default: value=16;break; 18 } }else value=16; } else value=16; return (value); } int main (void) { u16 result; XGpio_Initialize(&key,XPAR_KEYBOARD_DEVICE_ID); //初始化键盘接口 XGpio_Initialize(&output,XPAR_OUTPUT_DEVICE_ID);//初始化输出接口/* XGpio_SetDataDirection(&output,1,0x0); while(1) { if((result=key_scan())!=16) { xil_printf(\ switch(result) { case 0:// VGA显示的开关 if(vga_on_off) vga_on_off=0; else vga_on_off=1; out_put=out_put&ox3bfff(vga_on_off<<14); while(key_scan()==result); break; case 1://调节水平显示的时间单位 ++h_scale; if(h_scale==3) h_scale=0; out_put=out_put&0x3cfff|(h_scale<<12); while(key_scan()==result); xil_printf(\ 19 break; case 2://调节垂直显示幅度单位 ++v_scale; if(v_scale==3) v_scale=0; out_put=out_put&0x3f3ff|(v_scale<<10); xil_printf(\ while(key_scan()==result); break; case 3: //增加数字信号的频率 ++freq; if(freq==11) freq=0; out_put=out_put &0x3fc3f|(freq<<6);s xil_printf(\ while(key_scan()==result); break; case 4: //减小数字信号的频率 if(freq==0) freq=11; --freq; out_put=out_put &0x3fc3f|(freq<<6); xil_printf(\ while(key_scan()==result); break; case 5: //存储波形 trig=1; out_put=out_put&0x3ffdf|(trig<<5); xil_printf(\ while(key_scan()==result); break; case 6: //回放波形 disp=1; out_put=out_put&0x3ffef|(disp<<4); xil_printf(\ while(key_scan()==result); break; case 7: //通道选择 ++channel; 20

