📄 spidisp.c
字号:
/*************************************** Copyright (c) ***************************************
POLAR STAR
北天星国际贸易(深圳)有限公司
http://www.po-star.com
* 文件名:SPIDISP.C
* 功 能:使用硬件SPI接口输出显示。(硬件:74HC595输出控制数码管D1显示)
* 说 明:将跳线器JP7短接。
****************************************************************************/
#include "..\inc\config.h"
/* 数据码显示控制对应表,如下:
a
-------
| |
f| |b
| g |
-------
| |
e| |c
| d |
------- 。h
Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 DAT HEX OUT
h f g e d c b a
0 0 1 1 1 1 1 1 0 3f C0
0 0 0 0 0 1 1 0 1 06 F9
0 1 0 1 1 0 1 1 2 5b A4
0 1 0 0 1 1 1 1 3 4f B0
0 1 1 0 0 1 1 0 4 66 99
0 1 1 0 1 1 0 1 5 6d 92
0 1 1 1 1 1 0 1 6 7d 82
0 0 0 0 0 1 1 1 7 07 F8
0 1 1 1 1 1 1 1 8 7f 80
0 1 1 0 1 1 1 1 9 6f 90
0 1 1 1 0 1 1 1 A 77 88
0 1 1 1 1 1 0 0 B 7c 83
0 0 1 1 1 0 0 1 C 39 C6
0 1 0 1 1 1 1 0 D 5e A1
0 1 1 1 1 0 0 1 E 79 86
0 1 1 1 0 0 0 1 F 71 8E
--注:请根据硬件的原理修改对应关系(Q0~Q7与a~h的关系)及输出值(OUT)*/
const U8 SEGMENT_DATA[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E };
/****************************************************************************
* 名称:Delay()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void Delay(U32 dly)
{
U32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
/****************************************************************************
* 名称:MSpiIni()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void MSpiIni(void)
{ SPI_SPCCR = 0x52; // 设置SPI时钟分频
SPI_SPCR = (0<<3)|
(1<<4)|
(1<<5)|
(0<<6)|
(0<<7); // 设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}
/****************************************************************************
* 名称:MSendData()
* 功能:向SPI总线发送数据。
* 入口参数:data 待发送的数据
* 出口参数:返回值为读取的数据
****************************************************************************/
void MSendData(U8 data)
{
IO0CLR = RCK|SCLK|MOSI; // 片选
SPI_SPDR = data;
while( 0==(SPI_SPSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
}
/****************************************************************************
* 名称:Display()
* 功能:把发送到SPI总线的数据在数码管上显示。
* 入口参数:data 待发送的数据
* 出口参数:返回值为读取的数据
****************************************************************************/
void Display( U8 j)
{
MSendData(SEGMENT_DATA[j/10]);
MSendData(SEGMENT_DATA[j%10]);
IO0SET = RCK;
IO0CLR = RCK;
}
void PLL_Init()
{
PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
}
/****************************************************************************
* 名称:main()
* 功能:使用硬件SPI接口输出0-F的数据,控制LED显示。
****************************************************************************/
void main(void)
{ U8 i;
PINSEL0 = (PINSEL0&0xFFFF00FF)|0x00001500; // 设置SPI管脚连接
PINSEL1 = 0x00000000;
IO0DIR = RCK|SCLK|MOSI; //设置为输出
PLL_Init();
MSpiIni(); // 初始化SPI接口
while(1)
{
for(i=0;i<99; i++)
{
Display(i); // 显示数据
Delay(10);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -