dsp335的数码管同步异步显示(文章未能完善的完美)
#include “DSP2833x_Device.h” // DSP2833x Headerfile Include File
#include “DSP2833x_Examples.h” // DSP2833x Examples Include File
/宏定义数码管位选 IO 接口***********/
#define SET_BIT4 GpioDataRegs.GPCSET.bit.GPIO70 = 1 //与外设板 8_LEDS 端子的 IO70 对应
#define RST_BIT4 GpioDataRegs.GPCCLEAR.bit.GPIO70 = 1 //与外设板 8_LEDS 端子的 IO70 对应
#define SET_BIT3 GpioDataRegs.GPCSET.bit.GPIO71 = 1 //与外设板 8_LEDS 端子的 IO71 对应
#define RST_BIT3 GpioDataRegs.GPCCLEAR.bit.GPIO71 = 1 //与外设板 8_LEDS 端子的 IO71 对应
#define SET_BIT2 GpioDataRegs.GPCSET.bit.GPIO72 = 1 //与外设板 8_LEDS 端子的 IO72 对应
#define RST_BIT2 GpioDataRegs.GPCCLEAR.bit.GPIO72 = 1 //与外设板 8_LEDS 端子的 IO72 对应
#define SET_BIT1 GpioDataRegs.GPCSET.bit.GPIO73 = 1 //与外设板 8_LEDS 端子的 IO73 对应
#define RST_BIT1 GpioDataRegs.GPCCLEAR.bit.GPIO73 = 1 //与外设板 8_LEDS 端子的 IO73 对应
/*****************************************************************************************************/
void display();
void display1();
void delay_loop();
void Gpio_select(void);
void spi_init();
void spi_fifo_init();
void spi_xmit(Uint16 a);
void Sellect_Bit(Uint16 i);
Uint16 Loop = 0;//循环扫描变量
Uint32 i,j;
unsigned char a[10]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8}; //段码:0~7
void main()
{
InitSysCtrl();
InitSpiaGpio(); //这个要加入一个spi的文件
Gpio_select(); //GPIO初始化函数
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
spi_fifo_init(); // spi的FIFo初始化
spi_init(); // spi的初始化
// display(); //数码管异步
display1(); //数码管同步
}
//GPIO初始化函数
void Gpio_select(void)
{
EALLOW;
GpioCtrlRegs.GPCPUD.bit.GPIO70= 0; // Enable pullup on GPIO11
GpioDataRegs.GPCSET.bit.GPIO70 = 1; // Load output latch
GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 0; // GPIO16 = GPIO
GpioCtrlRegs.GPCDIR.bit.GPIO70 = 1; // GPIO16 = output
GpioCtrlRegs.GPCPUD.bit.GPIO71= 0; // Enable pullup on GPIO11
GpioDataRegs.GPCSET.bit.GPIO71 = 1; // Load output latch
GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 0; // GPIO16 = GPIO
GpioCtrlRegs.GPCDIR.bit.GPIO71 = 1; // GPIO16 = output
GpioCtrlRegs.GPCPUD.bit.GPIO72 = 0; // Enable pullup on GPIO11
GpioDataRegs.GPCSET.bit.GPIO72 = 1; // Load output latch
GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 0; // GPIO17 = GPIO
GpioCtrlRegs.GPCDIR.bit.GPIO72 = 1; // GPIO17 = output
GpioCtrlRegs.GPCPUD.bit.GPIO73 = 0; // Enable pullup on GPIO11
GpioDataRegs.GPCSET.bit.GPIO73 = 1; // Load output latch
GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 0; // GPIO19 = GPIO
GpioCtrlRegs.GPCDIR.bit.GPIO73 = 1; // GPIO19 = output
EDIS;
RST_BIT1; //先使数码管全部关闭,因为数码管会默认打开的,如果不关闭,打开一个数码管,就会全部都亮
RST_BIT2;
RST_BIT3;
RST_BIT4;
}
/*****************************************************************************************************/
/异步显示***/
void display()
{
for(Loop=0;Loop<4;Loop++) //显示数组前4位四位 0到3
{
Sellect_Bit(Loop); //选择要扫描的数码管位
spi_xmit(a[Loop]); //串行输出要显示的数字
delay_loop(); //延时配合人眼反应时间
}
for(Loop=0;Loop<4;Loop++) //显示数组后4位四位 4到7
{
Sellect_Bit(Loop); //选择要扫描的数码管位
spi_xmit(a[Loop+4]); //串行输出要显示的数字
delay_loop(); //延时配合人眼反应时间
}
}
/*****************************************************************************************************/
/同步显示***/
void display1()
{
for(Loop=0;Loop<8;Loop++) //4个同时显示0到7
{
SET_BIT4;
SET_BIT3;
SET_BIT2;
SET_BIT1;
spi_xmit(a[Loop]); //串行输出要显示的数字
delay_loop(); //延时配合人眼反应时间
}
}
/*****************************************************************************************************/
/延时***/
void delay_loop()
{
for(i=0;i<15;i++)
for(j=0;j<200000;j++) {}
}
/*****************************************************************************************************/
/Spi初始化***/
void spi_init()
{
SpiaRegs.SPICCR.all =0x004F; // Reset on, rising edge, 16-bit char bits
//0x000F对应Rising Edge,0x004F对应Falling Edge
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.SPICCR.all =0x00DF; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don’t disturb xmission
}
/*****************************************************************************************************/
/Spi模块FIFO设置******/
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
}
/*****************************************************************************************************/
/Spi发送***/
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF=a;
}
/*****************************************************************************************************/
/******************************数码管位选函数(从低位到高位扫描)***************************************************/
void Sellect_Bit(Uint16 i)
{
switch(i)
{
case 0:
RST_BIT4; //关断数码管第四位
SET_BIT1; //选通数码管第一位
break;
case 1:
RST_BIT1; //关断数码管第一位
SET_BIT2; //选通数码管第二位
break;
case 2:
RST_BIT2; //关断数码管第二位
SET_BIT3; //选通数码管第三位
break;
case 3:
RST_BIT3; //关断数码管第三位
SET_BIT4; //选通数码管第四位
break;
default:
break;
}
}