一、使用Proteus设计原理图
1.新建工程,添加元器件
2.元件连线:
3.导入keil5编译生成的.hex文件
代码在下方
4.仿真效果:
二、实验运行
1.程序设计思路
1.查找数据,对端口寄存器进行配置
2.编写代码
代码如下(示例):
void LEDInit( void )
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8 推挽输出
GPIOA->ODR|=1<<8; //PA8 输出高
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRH&=0XFFFFFF0F;
GPIOB->CRH|=0X00000030;//PB9 推挽输出
GPIOB->ODR|=1<<9; //PB9 输出高
RCC->APB2ENR|=1<<4; //使能PORTC时钟
GPIOC->CRH&=0XFF0FFFFF;
GPIOC->CRH|=0X00300000; //PC13 推挽输出
GPIOC->ODR|=1<<13; //PC13 输出高
}
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8)) //LED0为PA8引脚
#define LED1 MEM_ADDR(BITBAND(GPIOB_ODR_Addr,9)) //LED1为PB9引脚
#define LED2 MEM_ADDR(BITBAND(GPIOC_ODR_Addr,13))//LED3为PC13引脚
volatile unsigned long * LED_[3]={0}; //四个LED的数组
int main(void)
{
LEDInit();
unsigned int flag=0;//点亮LED标志
LED_[0]=&LED0;
LED_[1]=&LED1;
LED_[2]=&LED2; //给地址数组进行赋值
while (1)
{
if(flag>2)
{
flag=0;
}
*LED_[flag]=0; //LED亮
Delay_ms(500); //延时
*LED_[flag]=1; //LED灭
flag++;
}
}
3.编译下载,烧录程序