📄 spi.c
字号:
/****************************************Copyright (c)**************************************************
**
** 北天星国际有限公司
** http://www.po-star.com
**
**------------------------------------------------------------------------------------------------------
名称:SPI.C
功能:模拟SPI总线实现数码管显示
说明:跳线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 };
/***************************** 延时子程序*******************/
void Delay(int ms)
{
U16 k;
while(ms--)
{
for(k=0; k<1000; k++);
}
}
/*********************************初始化*********************************/
void SPI_Init()
{
IO0DIR=SCLK|MOSI|RCK|LED_MASK;
IO0CLR=SCLK|RCK;
}
/***************************向SPI总线上写一个字节的数据**************************/
void WriteByte(U8 data)
{
U8 i;
for(i=0;i<8;i++)
{
if(data&0x80) IO0SET=MOSI;
else IO0CLR=MOSI;
IO0SET=SCLK;
data<<=1;
IO0CLR=SCLK;
}
}
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;
}
/******************主函数***************************************************/
void main( )
{
U8 i;
PINSEL0 = 0x00000000; // 设置I/O连接到UART0
PINSEL1 = 0x00000000;
IO0DIR =MOSI|RCK|SCLK;
PLL_Init();
IO0CLR=SCLK;
IO0SET=RCK;
SPI_Init();
while(1)
{
for(i=0;i<100;i++)
{
WriteByte(SEGMENT_DATA[i/10]);
WriteByte(SEGMENT_DATA[i%10]);
IO0SET=RCK;
IO0CLR=RCK; //发送两个字节以后发送一个RCK信号,实现一次传送16位数据,点亮两个数码管
Delay(1000);
}}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -