📄 main.c
字号:
/****************************************Copyright (c)***************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info--------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**-------------------------------------------------------------------------------------------------------
** Created by: Litiantian
** Created date: 2007-01-04
** Version: 1.0
** Descriptions: SSP用作SPI主机,控制74HC595驱动流水灯
**
**-------------------------------------------------------------------------------------------------------
** Modified by: xuxiaoqun
** Modified date: 2008-05-08
** Descriptions: 对代码风格和注释进行了调整、校对
**
**-------------------------------------------------------------------------------------------------------
** Modified by: wankai
** Modified date: 2008-07-04
** Descriptions: 修改了程序代码风格与注释的格式
**
*********************************************************************************************************/
#include "config.h"
#define SSPCR1_SSE (1 << 1) /* SSP使能 */
/*********************************************************************************************************
** 函数名称:SSP_Init
** 函数功能:将SSP控制器设置为主机
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void SSP_Init(void)
{
PCONP |= (1 << 21); /* 在外设功率控制寄存器里 */
/* 使能SSP外设,默认情况下, */
/* 该外设已被使能 */
#if 1
/*
* 初始化P0.16(SSEL0)、P0.15(SCK0)、P0.17(MISO0)、P0.18(MOSI0)为SSP接口引脚,
* 不用另外的IO口作从机选择线,直接用SSEL0完成片选595的功能
*/
PINSEL0 = ((PINSEL0 & 0x3FFFFFFF) | 0x80000000);
PINSEL1 = ((PINSEL1 & 0xFFFFFFC0) | 0xFFFFFF2A);
#else
/*
* 初始化P2.22(SCK0)、P2.23(SSEL0)、P2.26(MISO0)、P2.27(MOSI0)为SSP接口引脚,
* 不用另外的IO口作从机选择线,直接用SSEL0完成片选595的功能
*/
PINSEL5 |= (0x03 << 12) | (0x03 << 14) | (0x03 << 20) | (0x03 << 22);
#endif
/* 设置数据长度为8位,帧格式SPI,SCK高有效,第一个时钟沿采样,位速率为默认值 */
SSP0CR0 = 0x47;
SSP0CPSR = 0x02; /* 设置SSP从PCLK获得的分频 */
/* 值,主模式下有效, */
/* 最小值为0x02 */
SSP0CR1 = SSPCR1_SSE; /* 设置SSP为主机模式, */
/* 不使用回写模式,并使能 */
SSP0CR1 |= (0x01 << 0); /* LBM 使用回写模式 */
}
/*********************************************************************************************************
* 函数名称:SSP_SendData
* 函数功能:SSP接口向SSP总线发送数据
* 入口参数:data 待发送的数据
* 出口参数:返回值为读取的数据
*********************************************************************************************************/
uint16 SSP_SendData(uint8 data)
{
while ((SSP0SR & 0x02) == 0); /* 等待发送FIFO留出空间 */
SSP0DR = data;
while ((SSP0SR & 0x10) == 0x10); /* 等待数据帧发送完毕 */
return ((uint16)SSP0DR);
}
/*********************************************************************************************************
** 函数名称:DelayNS
** 函数功能:长软件延时
** 入口参数:dly 延时参数,值越大,延时越久
** 出口参数:无
*********************************************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i = 0;
for (; dly > 0; dly--) {
for (i = 0; i < 50000; i++);
}
}
volatile uint32 RcvDat = 0;
/* 流水灯花样,低电平点亮,注意调用时候用了取反操作 */
const uint8 LED_TBL[] =
{
0x00, 0xFF, /* 全部熄灭后,再全部点亮 */
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, /* 依次逐个点亮 */
0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, /* 依次逐个叠加 */
0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, /* 依次逐个递减 */
0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, /* 两个靠拢后分开 */
0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 /* 从两边叠加后递减 */
};
/*********************************************************************************************************
** 函数名称:main
** 函数功能:使用硬件SSP0,74HC595驱动控制8盏LED动态显示
** 入口参数:无
** 出口参数:无
** 调试说明:需将JP1上的/CS,MOSI,SCLK,MISO分别和P2.23、P2.27、P2.22、P2.26
或P0.16、P0.18、P0.15、P0.17短接,取决于引脚初始化时的选择。
** 注 意:由于片外Flash读写比较慢,凡涉及延时的地方,均需缩短延时,大约为片内的1/10。
*********************************************************************************************************/
int main(void)
{
uint32 i = 0;
SSP_Init(); /* 初始化SSP接口 */
while (1) {
for (i = 0; i < 42; i++) {
DelayNS(20); /* 延时,控制显示时间 */
RcvDat = SSP_SendData(LED_TBL[i]); /* 发送显示数据 */
}
}
return (0);
}
/*******************************************************************************************************
** End Of File
*******************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -