实验要求

  ARM Cortex-M3微处理器使用端口GPIOA控制一片七段数码管(共阳极),按键K连接GPIOA15管脚。
  实现下述功能:使用查询方式查询按键状态,当按键打开时, GPIOA15管脚为“0” ,数码管显示0;当按键闭合时,GPIOA15管脚为“1”,数码管显示自己的学号,每隔1秒显示1位,显示结束后,数码管灯关闭。

实现流程

流程图

实验代码

写入中断向量

	AREA RESET,CODE
EXPORT __Vectors
EXPORT Reset_Handler
__Vectors
DCD __initial_sp
DCD Reset_Handler
SPACE 39*4
IMPORT DISPLAY
DCD DISPLAY
Reset_Handler PROC
IMPORT main
ldr r1,=main
bx r1
B .
ENDP

NOP

AREA STACK,DATA
SPACE 0x100
__initial_sp

END

程序代码

#include "usrt1.h"

void INIT()
{
//使能GPIOA
RCC->APB2ENR = 1 << 2;
//使能TIM1
RCC->APB2ENR = 1 << 11;
//配置GPIOA的输入输出模式
//PA15为上拉/下拉输入模式
//PA8-14为输出模式
GPIOA->CRH = 0x43333333;
//f=8M/(7999+1)=1kHz;
TIM1->PSC = 7999;
//自动重装载寄存器值为999
TIM1->ARR = 999;
NVIC->ISER[0] = 0x1 << 25;
}
//计数变量
int Cout = 0;

//学号直接定义在数组中
//假设数码管为共阳七段数码管,而输出为GPIOA8-14,一共7个管脚
//字形码对应为 0-0x40 1-0x79 2-0x24 3-0x30 4-0x19
// 5-0x12 6-0x02 7-0x78 8-0x00 9-0x10
//自己的学号为21009102029
int NUM[11];
void NUM_INIT()
{
NUM[0] = 0x2400; //2
NUM[1] = 0x7900; //1
NUM[2] = 0x4000; //0
NUM[3] = 0x4000; //0
NUM[4] = 0x1000; //9
NUM[5] = 0x7900; //1
NUM[6] = 0x4000; //0
NUM[7] = 0x2400; //2
NUM[8] = 0x4000; //0
NUM[9] = 0x2400; //2
NUM[10] = 0x1000; //9
}

void DISPLAY()
{
//状态寄存器清零
TIM1->SR = 0;
//输出学号
GPIOA->ODR = NUM[Cout];
Cout++;
}

int main()
{
//输入标志变量
int Flag;

//程序初始化
INIT();
NUM_INIT();
while(1)
{
//将PA15的值传递到Flag
Flag = GPIOA->IDR >> 15;
//显示为0
if(Flag == 1)
{
//允许更新中断并使能计数器
TIM1->DIER = 1;
TIM1->CR1 = 0x81;
//不显示
if(Cout > 11)
GPIOA->ODR = 0x7f00;
}
else
GPIOA->ODR = 0x4000;
}
}

代码演示

点此查看视频