写了数码管的程序,由于没有硬件,也不知道对不对;发出来让大家指正
#include "DSP2803x_Device.h"
interrupt void spiaTxFifoIsr(void);
void InitSpiaGpio(void)
{
EALLOW;
/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
// GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up on GPIO19 (SPISTEA)
/* Set qualification for selected pins to asynch only */
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3; // Asynch input GPIO5 (SPISIMOA)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3; // Asynch input GPIO3 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
/* Configure SPI-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be SPI functional pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
// GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 2; // Configure GPIO5 as SPISIMOA
// GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
// GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2; // Configure GPIO3 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
// GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
EDIS;
}
void spia_init(void)
{
//设置中断入口地址
EALLOW;
// This is needed to write to EALLOW protected registers
PieVectTable.SPITXINTA = &spiaTxFifoIsr;
EDIS;
// This is needed to disable write to EALLOW protected registers
//初始化 SPI FIFO
// Initialize SPI FIFO registers
SpiaRegs.SPICCR.bit.SPISWRESET = 0; // Reset SPI
SpiaRegs.SPICCR.all = 0x001F; //16-bit character, Loopback mode
SpiaRegs.SPICTL.all = 0x0017; //Interrupt enabled, Master/Slave XMIT enabled
SpiaRegs.SPISTS.all = 0x0000;
SpiaRegs.SPIBRR = 0x0063; // Baud rate
SpiaRegs.SPIFFTX.all = 0xC022; // Enable FIFO's, set TX FIFO level to 4
SpiaRegs.SPIFFRX.all = 0x0022; // Set RX FIFO level to 4
SpiaRegs.SPIFFCT.all = 0x00;
SpiaRegs.SPIPRI.all = 0x0010;
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Enable SPI
SpiaRegs.SPIFFTX.bit.TXFIFORESET = 1;
//中断使能
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER6.bit.INTx2 = 1; // Enable PIE Group 6, INT 2 SPIA发送中断使能
IER = 0x20; // Enable CPU INT6
}
unsigned char finish=0;
interrupt void spiaTxFifoIsr(void)
{
GpioDataRegs.GPADAT.bit.GPIO6 =1; //输出1 上升沿使595的数据加载到输出端
GpioDataRegs.GPADAT.bit.GPIO6 =0; //595恢复平常状态
finish=1;//FIFO缓冲区的数据都已经发送出去了,置为标志
SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ACK
}
/*
***说明:数码管初始化
***
***
*/
void Display_init(void)
{
InitSpiaGpio();
spia_init();
//配置595加载数据引脚
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; // Enable pullup on GPIO6
GpioDataRegs.GPASET.bit.GPIO6 = 1; // Load output latch
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; // GPIO6 = GPIO6
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1; // GPIO6 = output
GpioDataRegs.GPADAT.bit.GPIO6 =0; //输出0
}
/*
***说明:数码管显示
***
***@led:每一位代表一个led
***@digitron1:数码管1显示的数据
***@digitron0:数码管0显示的数据
*/
const unsigned char DigitronCode[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0x7F // "."
};
unsigned char ledData;//LED灯
unsigned char integralledData1,decimalledData1; //数码管组1的整数部分和小数部分
unsigned char integralledData0,decimalledData0; //数码管组0的整数部分和小数部分
/*
* 有数据需要显示时调用
*/
void updateData(unsigned char *led,
unsigned char *integral_1,unsigned char *decimal_1,
unsigned char *integral_0,unsigned char *decimal_0)
{
ledData=*led;
integralledData1=*integral_1;
decimalledData1=*decimal_1;
integralledData0=*integral_0;
decimalledData0=*decimal_0;
}
/*
* 周期调用
*/
#define YES 1
#define NO 0
void Display(void)
{
static unsigned char Buf[4];
static unsigned char scan=0;
if(finish==0) return; //当SPI FIFO没有没有完成发送时,是不能再发送的
Buf[3]=ledData;
switch(scan)
{
case 3://取整数十位
Buf[2]=0x77; //0111 0111
Buf[1]=integralledData1/10;
Buf[0]=integralledData0/10;
break;
case 2://取整数个位
Buf[2]=0xBB; // 1011 1011
Buf[1]=integralledData1%10;
Buf[0]=integralledData0%10;
break;
case 1://取小数十位
Buf[2]=0xDD; //1101 1101
Buf[1]=decimalledData1/10;
Buf[0]=decimalledData0/10;
break;
case 0://取小数个位
Buf[2]=0xEE; //1110 1110
Buf[1]=decimalledData1%10;
Buf[0]=decimalledData0%10;
break;
}
scan++;
if(scan>=4)scan=0;
//使用SPI发送出去
SpiaRegs.SPITXBUF=Buf[0];
SpiaRegs.SPITXBUF=Buf[1];
SpiaRegs.SPITXBUF=Buf[2];
SpiaRegs.SPITXBUF=Buf[3];
}