📄 spidisp.c
字号:
/*************************************** Copyright (c) *************************************************
*
* POLAR STAR
* 北天星国际贸易(深圳)有限公司
* http://www.po-star.com
*
* 文 件 名: SPIDisp.C
* 文件描述:使用硬件SPI接口输出显示。(硬件:74HC595输出控制数码管SMG1、SMG2显示)
*
* 说 明:分别将跳线器JP7的中间管脚与SCK、MISO、MOSI、CS短接;
*
********************************************************************************************************/
#include "config.h"
#define SPI_CS 1<<7 /* P0.7 595的片选引脚,不作SPI的SSEL功能*/
/********************************************************************************************************
*
* 函数名称:Delay(uint32 count)
*
* 功能描述:软件延时。
*
* 入口参数:count
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
void Delay(uint32 count)
{
uint32 tmp;
for(; count>0; count--)
for(tmp=0; tmp<50000; tmp++);
}
/********************************************************************************************************
*
* 函数名称:MasterSpiInit()
*
* 功能描述:初始化SPI接口,设置为主机。
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
void MasterSpiInit(void)
{
//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 设置管脚连接SPI
//PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x15 << 8) ; // SSEL0当作595片选
S0SPCCR = 0x52; // 设置SPI时钟分频
S0SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
(1 << 4) | // CPOL = 1, SCK 为低有效
(1 << 5) | // MSTR = 1, SPI 处于主模式
(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中断被禁止
}
/********************************************************************************************************
*
* 函数名称:MasterSendData()
*
* 功能描述:向SPI总线发送数据。
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
uint8 MasterSendData(uint8 data)
{
IOCLR = SPI_CS; // 片选
S0SPDR = data;
while(0 == (S0SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕
IOSET = SPI_CS;
return(S0SPDR);
}
/* 数据码显示控制对应表,如下:
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 uint8 DISP_TAB[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E };
/********************************************************************************************************
*
* 函数名称:main()
*
* 功能描述:使用硬件SPI接口输出00-FF的数据,控制LED显示。
*
* 入口参数:无
* 出口参数:无
*
* 说 明:
*
********************************************************************************************************/
//uint8 rcv_data;
int main(void)
{
uint8 tmp;
PINSEL0 = 0x00001500; // 设置SPI管脚连接-SSEL0当作595片选,故不作SPI管脚
PINSEL1 = 0x00000000;
IODIR = SPI_CS;
IOSET = SPI_CS;
MasterSpiInit(); // 初始化SPI接口
while(1)
{
for(tmp = 0; tmp < 0x100; tmp++)
{
MasterSendData(DISP_TAB[tmp >> 4]); // 发送显示高位数据
MasterSendData(DISP_TAB[tmp & 0x0f]); // 发送显示低位数据
Delay(80);
}
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -