请看看这个按键的历程
#include "DSP28_Device.h"
void WriteLED(unsigned char data);
void delay(unsigned long t);
Uint16 GetKey(void);
unsigned int * SPI_CS = (unsigned int *) 0x4500;
unsigned int * KeyReg = (unsigned int *) 0x4800;
unsigned long int a;
Uint16 SpiCode[]={0xFFFF,0x7E7E,0x2929,0x2c2c,0x6666,0xa4a4,0xa0a0,0x3e3e,0x2020};
void main(void)
{ unsigned int i,k;
/*初始化系统*/
InitSysCtrl();
/* 关中断 */
DINT;
IER = 0x0000;
IFR = 0x0000;
/* 初始化PIE控制寄存器 */
InitPieCtrl();
/* 初始化PIE参数表 */
InitPieVectTable();
/* 初始化外设寄存器 */
InitPeripherals();
///初始化IO口
InitGpio();
///初始化SPI
InitSpi();
/*设置CPU*/
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
*SPI_CS=0x00;
for(;;)
{
k=GetKey(); //读取键值
i=0;
while(k!=0)
{
k=k>>1;
i++;
} //转换为键码,1~8分别对应1,2,4,8,16,32,64,128
WriteLED(SpiCode); //将所获得的键码显示在数码管上
delay(1000);
}
}
void WriteLED(unsigned char data)
{
if(Spi_TxReady() == 1)
SpiaRegs.SPITXBUF = data;
while( Spi_TxReady()!=1);
delay(1000);
*SPI_CS=0x01;
*SPI_CS=0x00;
}
void delay(unsigned long t)
{
while(t>0)
t--;
}
unsigned int GetKey(void)
{
unsigned int temp,temp1;
temp = *KeyReg;
temp = temp & 0xff;
delay(100);
temp1 = *KeyReg;
temp1 = temp1 & 0xff; //去抖动
if(temp1==temp)
return(~temp & 0xff); //这里取反是为了观察方便
else
return 0xff;
}
CS是不是就是那个开关片选 然后直接对地址操作! 还有 CPLD的代码是在头文件里已经写好了吗? 在哪可以查看啊 谢谢啦
|