SPI初始化程序
spi 读写数据流程

spi 读写数据流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步的通信总线,常用于微控制器与外部设备之间的数据传输。
SPI初始化

P3OUT=BIT0+BIT1+BIT3;
}
void Init_SPI()
{
U0CTL|= SWRST;
U0CTL|= CHAR + SYNC + MM; // 8-bit, SPI, Master
{
P3OUT |= BIT0;
_NOP();
_NOP();
}
void SendCode(unsigned char code)
{
while ((IFG1 & UTXIFG0) == 0);
TXBUF0=code; //发送命令
ME1 = USPIE0; //SPI0模块允许
U0CTL &= ~SWRST;
IE1 |= URXIE0; //接收中断允许
}
void CLKInit()
ReadTR();
LPM0;
//temp=RXBUF0;
CS_Disable(); //片选禁止
for(i=500;i>0;i--); //至少延迟150us
CS_Enable(); //片选使能
{
unsigned char code;
code=0x08;
SendCode(code);
}
void ReadAY(void) //发送加电指令
{
unsigned char code;
code=0x11;
SendCode(code);
}
SPI初始化程序

//SPI初始化子程序,用于数码管显示void spi_intial(){=0x0047; // 使SPI处于复位方式, 下降沿, 八位数据 =0x0006; //主控模式,般时钟模式,使能talk,闭SPI中断SpiaRegs.SPIBRR =0x007F; //配置波特率=; // 退出复位状态EALLOW;;// 设置通用引脚为SPI引脚EDIS;}//IO初始化子程序void gpio_init(){EALLOW;; //GPIOA11设置为一般I/O口; //把GPIOA11设置为输出//将GPIOE0~GPIOE2配置为一般I/O口输出,作138译码= ;= ;//将GPIOB8~GPIOB15配置为一般I/O口,D0~D7= ;EDIS;; //GPIOA11=0;该端口为74HC595锁存信号}//键扫描子程序K1~K8int Keyscan1(void){EALLOW;//将GPIOB8~GPIOB15配置为输入,D0~D7= ;EDIS;= 0xfff8; //选通KEY低8位for (i=0; i<100; i++){} //延时//判K1~K8是否按下if (({for (i=0; i<30000; i++){} //延时消抖if (({KeyReg1= ; //读键值while (( //判K1~K8是否松开{= !;for (i=0; i<1000; i++){}}return (1);}}return (0);}//键扫描子程序K9~K16int Keyscan2(void){EALLOW;//将GPIOB8~GPIOB15配置为输入,D0~D7 = ;EDIS;= 0xfff9; //选通KEY高8位for (i=0; i<100; i++){} //延时//判K8~K16是否按下if (({for (i=0; i<30000; i++){} //延时消抖if (({KeyReg2= ; //读键值while (( //判K8~K16是否松开{= !;for (i=0; i<1000; i++){}}return (1);}}return (0);}//按键记录次数,显示在16个LED上void LedOut(Uint16 led){EALLOW;//将GPIOB8~GPIOB15配置为输出,D0~D7 = ;EDIS;= 0xfffb; //LEDB选通= ~led; //显示高8位for (i=0; i<100; i++){} //延时= 0xffff; //锁存高8位= 0xfffa; //LEDA选通= ~(led<<8); //显示低8位for (i=0; i<100; i++){}= 0xffff; //锁存低8位}//键散转子程序K1~K8void KeyFunction1(unsigned int KeyReg1) {switch(KeyReg1){case K1: {LEDReg= 0x00; //键号0}break;case K2: {LEDReg= 0x01; //键号1}break;case K3: {LEDReg= 0x02; //键号2}break;case K4: {LEDReg= 0x03; //键号3}break;case K5: {LEDReg= 0x04; //键号4}break;case K6: {LEDReg= 0x05; //键号5}break;case K7: {LEDReg= 0x06; //键号6}break;case K8: {LEDReg= 0x07; //键号7}break;default:break;}}//键散转子程序K9~K16void KeyFunction2(unsigned int KeyReg2) {switch(KeyReg2){case K9: {LEDReg= 0x08; //键号8}break;case K10: {LEDReg= 0x09; //键号9}break;case K11: {LEDReg= 0x0A; //键号A}break;case K12: {LEDReg= 0x0B; //键号B}break;case K13: {LEDReg= 0x0C; //键号C}break;case K14: {LEDReg= 0x0D; //键号D}break;case K15: {LEDReg= 0x0E; //键号E}break;case K16: {LEDReg= 0x0F; //键号F}break;default:break;}}void display (LEDReg) //显示子程序{; //给LACK信号一个低电平SpiaRegs.SPITXBUF =LEDCode[LEDReg]; //给数码管送数while( != 1){}SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF;; //给LACK信号一个高电平为锁存74HC595for(i=0;i<10;i++){} //延时}void main(void){Uint16 keyNum = 0x0000; //按键次数初始化InitSysCtrl(); // 系统初始化程序,该子程序存放在DSP281x_sysctrl.c中DINT; //关闭总中断spi_intial(); //SPI初始化子程序gpio_init(); // I/O初始化子程序IER = 0x0000; // 关闭外围中断IFR = 0x0000; // 清中断标志LedOut(keyNum); // LED指示灯初始化for(i=0;i<8;i++)// 8个数码管清0{SpiaRegs.SPITXBUF =LEDCode[0]; //给数码管送数while( != 1){}SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF;}; //给LACK信号一个高电平为锁存74HC595for(i=0;i<10;i++){}while (1){if (Keyscan1() == 1) // 调用键扫描K1~K8子程序{keyNum=keyNum+1; // 按键记数KeyFunction1(KeyReg1);display (LEDReg); //显示键值LedOut(keyNum); //显示按键次数}if (Keyscan2() == 1) // 调用键扫描K8~K16子程序{keyNum=keyNum+1;KeyFunction2(KeyReg2);display (LEDReg); //显示键值LedOut(keyNum); //显示按键次数}}}。
msp430f149的SPI初始化

// Time for slave to ready // Enter LPM0 w/ interrupt
#pragma vector=USART0RX_VECTOR __interrupt void SPI0_rx (void) {
P1OUT = RXBUF0; }
// RXBUF0 to TXBUF0
初始化数组初始化momexe初始化错误
//*****************************************************************************
*
// MSP-FET430P140 Demo - USART0, SPI Full-Duplex 3-Wire Master P1.x Exchange
//***************************************************************************** */×××××××××××SPI0 接收与发送程序×××××××××××××××××× ×××/
#include <msp430x14x.h>
|
//
|
RST|--+<----|P3.0
|
//
LED <-|P1.0
|
|
P1.4|<-
//
LED <-|P1.1
|
|
P1.5|< -
//
->|P1.4
|
|
P1.0|-> LED
//
->|P1.5
|
|
P1.1|-> LED
//
|
SIMO0/P3.1|<-------|P3.1/SIMO0
STM32 SPI初始化和使用

串行外设接口(SPI)。
初始化步骤:1、连接SPI外设时钟,通过RCC->APB2ENR设置。
2、连接被复用的GPIO的外设时钟,也是通过RCC->APB2ENR设置为什么还要连接GPIO时钟,参见STM32参考手册8.1.4节。
手册上这么说的:对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
3、设置被复用的GPIO为推挽输出,并设置时钟。
不能设置为开漏输出。
设置成开漏输出时,示波器上看输出是锯齿波,而不是需要的方波。
4、通过配置SPIx->CR1来设置SPI 的工作模式。
最后使能SPI5、收发数据。
收发数据可以使用同一个函数,因为SPI是同步输入输出的,在发送数据的时候已经在接受数据。
配置SPI1代码如下:void SPI1_Init(void){RCC->APB2ENR |= 1<<12;//使能SPI1 时钟RCC->APB2ENR |= 1<<2;//配置服用功能输出GPIOA->CRL&=0X000FFFFF;GPIOA->CRL|=0XBBB00000;//PA5.6.7 复用,推挽输出50M时钟(不能配置成开漏,否则输出为锯齿波)GPIOA->ODR|=0X7<<5;SPI1->CR1|=0<<11;//8bit数据格式SPI1->CR1|=0<<10;//全双工模式SPI1->CR1|=1<<9; //软件nss 管理SPI1->CR1|=1<<8;SPI1->CR1|=0<<7; //MSBfirstSPI1->CR1|=7<<3; //设置时钟Fsck=Fcpu/256SPI1->CR1|=1<<2; //SPI 主机SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始SPI1->CR1|=1<<6; //使能SPI}现在可以读写数据了:u8 SPI1_ReadWriteByte(u8 data){//while((SPI1->SR && 1<<7) == 0); //等待SPI1空闲while((SPI1->SR && 1<<1)==0); //等待发送缓冲区空SPI1->DR = data;while((SPI1->SR && 1<<0)==0);return SPI1->DR;}。
stm32spi配置

STM32 SPI 主模式下配置(神州三号开发板spi.c解析上)#include "spi.h"#include <STM32F10X_SPI.h>#include <STM32F10X_GPIO.h>#include <STM32F10X_RCC.h>//包含头文件//串行外设接口SPI的初始化,SPI配置成主模式//本例程选用SPI1对W25X16进行读写操作,对SPI1进行初始化void SPIx_Init(void){/*定义结构体,下面NSS配置时也要用到GPIO所以这里一起定义*/SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* 使能SPI1 & GPIOA 时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Perip h_AFIO, ENABLE);/* Configure SPI1 pins: NSS, SCK, MISO and MOSI */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);//SPI1 NSS for W25X16GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC, GPIO_Pin_4);//SPI1 NSS for EthernetGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_4);/* SPI1 configuration */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI1设置为两线全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI1为主模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行时钟在不操作时,时钟为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //第二个时钟沿开始采样数据SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件(使用SSI位)管理SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //定义波特率预分频的值:波特率预分频值为8SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1 */SPI_Cmd(SPI1, ENABLE); //使能SPI1外设}-----spi.c#include "spi.h"/***************************************************************************功能描述:STM32f103 SPI接口配置的初始化函数隶属模块:STM32 SPI(1)SPI1在没有重映射的条件下NSS->PA4SCK->PA5MISO->PA6MOSI->MOSI由于STM32要处于主机模式且用软件模式,所以NSS不用(2)初始化GPIO管脚和SPI的参数设置:建立SPI和GPIO的初始化结构体(3)在配置GPIO的PA5、PA6、PA7时将其配置为复用输出,在复用功能下面,输入输出的方向完全由内部控制,不需要程序处理。
STM32的SPI通信总结(含DMA)

STM32---SPI(DMA)通信的总结(库函数操作)本文主要由7项内容介绍SPI并会在最后附上测试源码供参考:1.SPI的通信协议2.SPI通信初始化(以STM32为从机,LPC1114为主机介绍)3.SPI的读写函数4.SPI的中断配置5.SPI的SMA操作6.测试源码7.易出现的问题及原因和解决方法一、SPI的通信协议SPI(Serial Peripheral Interface)是一种串行同步通讯协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而完成数据的交换。
SPI 接口一般由4根线组成,CS片选信号(有的单片机上也称为NSS),SCLK时钟信号线,MISO数据线(主机输入从机输出),MOSI数据线(主机输出从机输入),CS 决定了唯一的与主设备通信的从设备,如没有CS 信号,则只能存在一个从设备,主设备通过产生移位时钟信号来发起通讯。
通讯时主机的数据由MISO输入,由MOSI 输出,输入的数据在时钟的上升或下降沿被采样,输出数据在紧接着的下降或上升沿被发出(具体由SPI的时钟相位和极性的设置而决定)。
二、以STM32为例介绍SPI通信1.STM32f103 带有3个SPI模块其特性如下:2SPI 初始化初始化SPI 主要是对SPI要使用到的引脚以及SPI通信协议中时钟相位和极性进行设置,其实STM32的工程师已经帮我们做好了这些工作,调用库函数,根据自己的需要来修改其中的参量来完成自己的配置即可,主要的配置是如下几项:引脚的配置SPI1的SCLK, MISO ,MOSI分别是PA5,PA6,PA7引脚,这几个引脚的模式都配置成GPIO_Mode_AF_PP 复用推挽输出(关于GPIO的8种工作模式如不清楚请自己百度,在此不解释),如果是单主单从, CS引脚可以不配置,都设置成软件模式即可。
通信参数的设置1.SPI_Direction_2Lines_FullDuplex把SPI设置成全双工通信;2.在SPI_Mode 里设置你的模式(主机或者从机),3.SPI_DataSize是来设置数据传输的帧格式的SPI_DataSize_8b是指8位数据帧格式,也可以设置为SPI_DataSize_16b,即16位帧格式4.SPI_CPOL和SPI_CPHA是两个很重要的参数,是设置SPI通信时钟的极性和相位的,一共有四种模式在库函数中CPOL有两个值SPI_CPOL_High(=1)和SPI_CPOL_Low ( =0). CPHA有两个值SPI_CPHA_1Edge (=0) 和SPI_CPHA_2Edge(=1)CPOL表示时钟在空闲状态的极性是高电平还是低电平,而CPHA则表示数据是在什么时刻被采样的,手册中如下:我的程序中主、从机的这两位设置的相同都是设置成1,即空闲时时钟是高电平,数据在第二个时钟沿被采样,实验显示数据收发都正常。
(二)原创调试W5500芯片--W5500的初始化过程

(⼆)原创调试W5500芯⽚--W5500的初始化过程⼀、SPI的配置过程1.使能SPI时钟1/**2 * @brief 使能SPI时钟3 * @retval None4*/5static void SPI_RCC_Configuration(void)6 {7 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1,ENABLE);8 }2.配置指定SPI的引脚1/**2 * @brief 配置指定SPI的引脚3 * @retval None4*/5static void SPI_GPIO_Configuration(void)6 {7 GPIO_InitTypeDef GPIO_InitStruct;8//PA4->CS,PA5->SCK,PA6->MISO,PA7->MOSI9 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7;10 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;11 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;12 GPIO_Init(GPIOA, &GPIO_InitStruct);13//初始化⽚选输出引脚14 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;15 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;16 GPIO_Init(GPIOA, &GPIO_InitStruct);17 GPIO_SetBits(GPIOA,GPIO_Pin_4);18 }3.根据外部SPI设备配置SPI相关参数1/**2 * @brief 根据外部SPI设备配置SPI相关参数3 * @retval None4*/5void SPI_Configuration(void)6 {7 SPI_InitTypeDef SPI_InitStruct;89 SPI_RCC_Configuration();1011 SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;12 SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;13 SPI_InitStruct.SPI_Mode = SPI_Mode_Master;14 SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;15 SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;16 SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;17 SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;18 SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;19 SPI_InitStruct.SPI_CRCPolynomial = 7;20 SPI_Init(SPI1,&SPI_InitStruct);2122 SPI_GPIO_Configuration();2324 SPI_SSOutputCmd(SPI1, ENABLE);25 SPI_Cmd(SPI1, ENABLE);26 }⼆、W5500初始化过程注册SPI函数、初始化Socket Buffer、PHY状态检查、初始化Network等⼯作1void wizchip_user_init(void)2 {3 uint8_t tmp;4 uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};56// First of all, Should register SPI callback functions implemented by user for accessing WIZCHIP7/* Critical section callback */8 reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注册临界区函数9/* Chip selection call back */10#if _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_11 reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注册SPI⽚选信号函数12#elif _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_13 reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); // CS must be tried with LOW.14#else15#if (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SIP_) != _WIZCHIP_IO_MODE_SIP_16#error "Unknown _WIZCHIP_IO_MODE_"17#else18 reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);19#endif20#endif21/* SPI Read & Write callback function */22 reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注册读写函数2324/* WIZCHIP SOCKET Buffer initialize */25if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){26 printf("WIZCHIP Initialized fail.\r\n");27while(1);28 }2930/* PHY link status check */31do{32if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){33 printf("Unknown PHY Link stauts.\r\n");34 }35 }while(tmp == PHY_LINK_OFF);3637/* Network initialization */38 network_init();39 }⽹络初始化1/**2 * @brief Intialize the network information to be used in WIZCHIP3 * @retval None4*/5void network_init(void)6 {7 uint8_t tmpstr[6];8 ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);9 ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);1011// Display Network Information12 ctlwizchip(CW_GET_ID,(void*)tmpstr);13 printf("\r\n=== %s NET CONF ===\r\n",(char*)tmpstr);14 printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],15 gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);16 printf("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);17 printf("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);18 printf("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);19 printf("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);20 printf("======================\r\n");21 }三、下⾯着重介绍⼏个重要的函数:3.1 函数原型:ctlwizchip(ctlwizchip_type cwtype,void* arg) 参数1:cwtype 参数2:arg 功能:控制WIZCHIP芯⽚,重置WIZCHIP和内部PHY,配置PHY模式,监视PHY(链接,速度,半/全/⾃动),控制中断和屏蔽等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//SPI初始化子程序,用于数码管显示void spi_intial(){SpiaRegs.SPICCR.all =0x0047; // 使SPI处于复位方式, 下降沿, 八位数据SpiaRegs.SPICTL.all =0x0006; //主控模式,般时钟模式,使能talk,闭SPI中断SpiaRegs.SPIBRR =0x007F; //配置波特率SpiaRegs.SPICCR.all =SpiaRegs.SPICCR.all|0x0080; // 退出复位状态EALLOW;GpioMuxRegs.GPFMUX.all=0x000F;// 设置通用引脚为SPI引脚EDIS;}//IO初始化子程序void gpio_init(){EALLOW;GpioMuxRegs.GPAMUX.bit.TDIRA_GPIOA11=0; //GPIOA11设置为一般I/O口GpioMuxRegs.GPADIR.bit.GPIOA11=1; //把GPIOA11设置为输出//将GPIOE0~GPIOE2配置为一般I/O口输出,作138译码GpioMuxRegs.GPEMUX.all = GpioMuxRegs.GPEMUX.all&0xfff8; GpioMuxRegs.GPEDIR.all = GpioMuxRegs.GPEDIR.all|0x0007;//将GPIOB8~GPIOB15配置为一般I/O口,D0~D7GpioMuxRegs.GPBMUX.all = GpioMuxRegs.GPBMUX.all&0x00ff;EDIS;GpioDataRegs.GPADAT.bit.GPIOA11=0; //GPIOA11=0;该端口为74HC595锁存信号}//键扫描子程序K1~K8int Keyscan1(void){EALLOW;//将GPIOB8~GPIOB15配置为输入,D0~D7GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all&0x00ff;EDIS;GpioDataRegs.GPEDAT.all = 0xfff8; //选通KEY低8位for (i=0; i<100; i++){} //延时//判K1~K8是否按下if ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff){for (i=0; i<30000; i++){} //延时消抖if ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff){KeyReg1=GpioDataRegs.GPBDAT.all ; //读键值while ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff) //判K1~K8是否松开{GpioDataRegs.GPDDAT.bit.GPIOD1 = !GpioDataRegs.GPDDAT.bit.GPIOD1;for (i=0; i<1000; i++){}}return (1);}}return (0);}//键扫描子程序K9~K16int Keyscan2(void){EALLOW;//将GPIOB8~GPIOB15配置为输入,D0~D7GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all&0x00ff;EDIS;GpioDataRegs.GPEDAT.all = 0xfff9; //选通KEY高8位for (i=0; i<100; i++){} //延时//判K8~K16是否按下if ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff){for (i=0; i<30000; i++){} //延时消抖if ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff){KeyReg2=GpioDataRegs.GPBDAT.all ; //读键值while ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff) //判K8~K16是否松开{GpioDataRegs.GPDDAT.bit.GPIOD1 = !GpioDataRegs.GPDDAT.bit.GPIOD1; for (i=0; i<1000; i++){}}return (1);}}return (0);}//按键记录次数,显示在16个LED上void LedOut(Uint16 led){EALLOW;//将GPIOB8~GPIOB15配置为输出,D0~D7GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xff00;EDIS;GpioDataRegs.GPEDAT.all = 0xfffb; //LEDB选通GpioDataRegs.GPBDAT.all = ~led; //显示高8位for (i=0; i<100; i++){} //延时GpioDataRegs.GPEDAT.all = 0xffff; //锁存高8位GpioDataRegs.GPEDAT.all = 0xfffa; //LEDA选通GpioDataRegs.GPBDAT.all = ~(led<<8); //显示低8位for (i=0; i<100; i++){}GpioDataRegs.GPEDAT.all = 0xffff; //锁存低8位}//键散转子程序K1~K8void KeyFunction1(unsigned int KeyReg1){switch(KeyReg1){case K1: {LEDReg= 0x00; //键号0}break;case K2: {LEDReg= 0x01; //键号1}break;case K3: {LEDReg= 0x02; //键号2}break;case K4: {LEDReg= 0x03; //键号3}break;case K5: {LEDReg= 0x04; //键号4}break;case K6: {LEDReg= 0x05; //键号5}break;case K7: {LEDReg= 0x06; //键号6}break;case K8: {LEDReg= 0x07; //键号7}break;default:break;}}//键散转子程序K9~K16void KeyFunction2(unsigned int KeyReg2) {switch(KeyReg2){case K9: {LEDReg= 0x08; //键号8}break;case K10: {LEDReg= 0x09; //键号9}break;case K11: {LEDReg= 0x0A; //键号A}break;case K12: {LEDReg= 0x0B; //键号B}break;case K13: {LEDReg= 0x0C; //键号C}break;case K14: {LEDReg= 0x0D; //键号D}break;case K15: {LEDReg= 0x0E; //键号E}break;case K16: {LEDReg= 0x0F; //键号F}break;default:break;}}void display (LEDReg) //显示子程序{GpioDataRegs.GPADAT.bit.GPIOA11=0; //给LACK信号一个低电平SpiaRegs.SPITXBUF =LEDCode[LEDReg]; //给数码管送数while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF;GpioDataRegs.GPADAT.bit.GPIOA11=1; //给LACK信号一个高电平为锁存74HC595 for(i=0;i<10;i++){} //延时}void main(void){Uint16 keyNum = 0x0000; //按键次数初始化InitSysCtrl(); // 系统初始化程序,该子程序存放在DSP281x_sysctrl.c中DINT; //关闭总中断spi_intial(); //SPI初始化子程序gpio_init(); // I/O初始化子程序IER = 0x0000; // 关闭外围中断IFR = 0x0000; // 清中断标志LedOut(keyNum); // LED指示灯初始化for(i=0;i<8;i++)// 8个数码管清0{SpiaRegs.SPITXBUF =LEDCode[0]; //给数码管送数while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF;}GpioDataRegs.GPADAT.bit.GPIOA11=1; //给LACK信号一个高电平为锁存74HC595 for(i=0;i<10;i++){}while (1){if (Keyscan1() == 1) // 调用键扫描K1~K8子程序{keyNum=keyNum+1; // 按键记数KeyFunction1(KeyReg1);display (LEDReg); //显示键值LedOut(keyNum); //显示按键次数}if (Keyscan2() == 1) // 调用键扫描K8~K16子程序{keyNum=keyNum+1;KeyFunction2(KeyReg2);display (LEDReg); //显示键值LedOut(keyNum); //显示按键次数}}}。