附源程序希望大神帮忙看看,示波器测试波形都是有的。
#include "my_include.h"
#define MCP_ADDR 0x40
#define IODIRA 0x00
#define IODIRB 0x01
#define IOCONA 0x0A
#define IOCONB 0x0B
#define GPIOA 0x12
#define GPIOB 0x13
#define OLATA 0x14
#define OLATB 0x15
#define SPIF 0x80
#define WCOL 0x40
sbit CS2 = P1^0; //U2片选
sbit CS3 = P1^1; //U3片选
sbit CS4 = P1^2; //U4片选
sbit CS5 = P1^6; //U5片选
sbit CS6 = P1^7; //U6片选(低有效)
sbit LED19 = P2^4;
sbit LED18 = P2^5;
sbit LED17 = P2^6;
sbit LED21 = P3^7;
void GPIO_config (void)
{
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P2,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_7; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
}
void SPI_init (void)
{
SPCTL = 0xD0;
SPDAT = 0;
SPSTAT = SPIF | WCOL;
}
void SPI_Write_Byte (u8 dat)
{
SPDAT = dat;
while (!(SPSTAT & SPIF));
SPSTAT=SPIF|WCOL;
}
u8 SPI_Read_Byte (void)
{
u8 SPI_dat;
SPDAT=0xFF;
while (!(SPSTAT & SPIF));
SPI_dat=SPDAT;
SPSTAT=SPIF|WCOL;
return SPI_dat;
}
void Wirte_MCP23S17 (u8 Device_Add, u8 Reg_Add, u8 dat)
{
CS6 = 0;
SPI_Write_Byte (Device_Add);
SPI_Write_Byte (Reg_Add);
SPI_Write_Byte (dat);
CS6 = 1;
}
void Init_MCP23S17 ()
{
Wirte_MCP23S17 (MCP_ADDR,IODIRA,0x00);
Wirte_MCP23S17 (MCP_ADDR,IODIRB,0x00);
Wirte_MCP23S17 (MCP_ADDR,GPIOA,0xFF);
Wirte_MCP23S17 (MCP_ADDR,GPIOB,0xFF);
}
void main (void)
{
LED19 = 0;
GPIO_config ();
GPIO_PWMInit(GPIO_PWM2,GPIO_PullUp);//设置为准双向口 凡是跟PWM相关的IO口上电都是高阻输入态
GPIO_PWMInit(GPIO_PWM3,GPIO_PullUp);
GPIO_PWMInit(GPIO_PWM4,GPIO_PullUp);
GPIO_PWMInit(GPIO_PWM5,GPIO_PullUp);
GPIO_PWMInit(GPIO_PWM6,GPIO_PullUp);
GPIO_PWMInit(GPIO_PWM7,GPIO_PullUp);
SPI_init ();
Init_MCP23S17 ();
while (1)
{
Wirte_MCP23S17 (MCP_ADDR,GPIOA,0x00);
Wirte_MCP23S17 (MCP_ADDR,GPIOB,0x00);
}
} |