Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Торгаев С.Н.docx
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

3.3.6. Программа, реализующая эффект бегущей единицы

Программа реализует эффект бегущей единицы на восьми светодиодах, подключенных к порту C. Направление задается с помощью кнопки, по прерыванию. Кнопка подключена к нулевому выводу порта A.

#include "stm32f10x_rcc.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_exti.h"

u16 a; //объявление переменной

int k; //объявление переменной

static __IO uint32_t TimingDelay; //объявление переменной для системной

//задержки

//основная программа

int main(void)

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //включение тактирования

RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN , ENABLE); //включение тактирования

GPIO_InitTypeDef GPIO_InitStruct; //объявление структуры настройки портов

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All; //выбор настраиваемых выводов

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //определение

//максимальной частоты

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //режим - вывод,

//тип - push-pull

GPIO_Init(GPIOC, &GPIO_InitStruct); //заполнение объявленной структуры

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0; //выбор настраиваемых выводов

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; //режим –

//дифференциальный вход

GPIO_Init(GPIOA, &GPIO_InitStruct); //заполнение объявленной структуры

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //назначение вывода 0 порта А источником внешних прерываний

EXTI_InitTypeDef EXTI_InitStruct; //объявление структуры настройки

//внешних прерываний

EXTI_InitStruct.EXTI_Line=EXTI_Line0; //выбор настраиваемой линии

EXTI_InitStruct.EXTI_LineCmd=ENABLE; //разрешение внешнего

//прерывания на выбранной линии

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; //режим прерывания

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising; //прерывание по

//переднему фронту

EXTI_Init(&EXTI_InitStruct); //заполнение объявленной структуры

NVIC_EnableIRQ (EXTI0_IRQn); //разрешение прерывания

SysTick_Config(240); //настройка системного таймера

k=0x01;

a=0x00;

GPIOC->ODR=k; //вывод переменной в порт

while(1) //бесконечный цикл

{

if(a==0x0000)

{

if(k!=0x80)

{

k <<=1; //побитный сдвиг влево

GPIOC->ODR=k;

Delay_x10us(20000); //задержка

}

else

{

k=0x01;

}

}

if(a==0xFFFF)

{

if(k!=0x01)

{

k >>=1; //побитный сдвиг вправо

GPIOC->ODR=k;

Delay_x10us(20000); //задержка

}

else

{

k=0x80;

}

}

}

}

//обработчик прерывания EXTI0

void EXTI0_IRQHandler(void)

{

a=~a; //инверсия переменной

EXTI->PR|=0x01; //очистка флага прерывания

}

//функция временной задержки

void Delay_x10us(__IO uint32_t nTime)

{

TimingDelay = nTime;

while(TimingDelay != 0);

}

//подпрограмма декремента переменной для задержки

void TimingDelay_Decrement(void)

{

if (TimingDelay != 0x00)

{

TimingDelay--; //декремент переменной для задержки

}

}

//обработчик прерывания системного таймера

void SysTick_Handler(void) {

{

TimingDelay_Decrement(); //вызов подпрограммы декремента переменной для задержки

}}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]