#includestm32f10x.h
#includestdio.h
//延时函数
voiddelay(void)
{
volatileuint32_tcnt=0x20000;
while(cnt--);
}
voidled_init(void)
{
//LED初始化函数
GPIO_InitTypeDefGPIO_InitStruct;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开时钟
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,GPIO_InitStruct);
}
//led按键初始化
voidkey_init(void)
{
GPIO_InitTypeDefGPIO_InitStruct;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,GPIO_InitStruct);
}
//按键函数
voidkey_anjian(void)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)//判断按键是否按下
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1);//等待按键完成按下并弹起
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1)//判断引脚状态
{
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}
else
{
GPIO_SetBits(GPIOB,GPIO_Pin_1);
}
}
}
//NVIC配置函数
voidnvic_init(void)
{
NVIC_InitTypeDefNVIC_InitStruct;//定义结构体
//NVIC配置外部中断0
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//优先级分组配置
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//主优先级,抢占优先级别(0~1)
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级设置,响应优先级别(0~7)
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能通道
NVIC_Init(NVIC_InitStruct);//初始化,写入
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//主优先级,抢占优先级别(0~1)
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;//子优先级设置,响应优先级别(0~7)
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能通道
NVIC_Init(NVIC_InitStruct);//初始化,写入
}
//串口初始化
voidusart_init(void)
{
USART_InitTypeDefUSART_InitStruct;
GPIO_InitTypeDefGPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);//开启AFIO和USART1的时钟
//PA9-Tx
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;//设置GPIO引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//设置引脚为浮空输入模式
GPIO_Init(GPIOA,GPIO_InitStruct);//完成引脚PA10配置初始化
//PA10-Rx
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;//设置GPIO引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//设置引脚为浮空输入模式
GPIO_Init(GPIOA,GPIO_InitStruct);//完成引脚PA10配置初始化
USART_InitStruct.USART_BaudRate=9600;//设置波特率为9600位
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//设置数据长度为8位
USART_InitStruct.USART_Parity=USART_Parity_No;//设置奇偶校验位失能
USART_InitStruct.USART_StopBits=USART_StopBits_1;//设置停止位位
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//设置硬件流失能
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//设置串口模式为发送模式与接收模式
USART_Init(USART1,USART_InitStruct);//完成串口配置初始化
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);//串口失能
}
//定时器TIM2初始化函数72MHZ
voidtim(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStruct;//定义一个定时器
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2时钟
TIM_TimeBaseInitStruct.TIM_Period=(10000-1);//ARR数值
TIM_TimeBaseInitStruct.TIM_Prescaler=(800-1);//分频系数
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重复次数为0,每次溢出更新
TIM_TimeBaseInitStruct.TIM_ClockDivision=0;//时钟分割,技术模式种无意义
TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中断种类设定
TIM_Cmd(TIM2,ENABLE);//计数器开始工作
}
voidusart1_sendbyte(charsendbyte)
{
USART_SendData(USART1,sendbyte);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==0);
}
voidusart1_sendstring(char*sendstring)
{
uint8_tcnt=0;
do
{
usart1_sendbyte(*(sendstring+cnt));
cnt++;
}
while(*(sendstring+cnt)!=\0);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==0);
}
//数码管初始化函数,初始化全部引脚
voidled_y(void)
{
GPIO_InitTypeDefGPIO_InitStruct;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,GPIO_InitStruct);
}
//数码管按键初始化
voidkey_y(void)
{
GPIO_InitTypeDefGPIO_InitStruct;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,GPIO_InitStruct);
}
//数码管按键右移
voidkey_right(void)
{
//key
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)//判断按键按下
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1);//等待按键完成按下并弹起的动作
//右移
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
GPIO_SetBits(GPIOB,GPIO_Pin_8);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_14);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_7);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
}
}
//数码管按键左移
voidkey_left(void)
{
//key
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)//判断按键按下
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1);//等待按键完成按下并弹起的动作
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_7);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
}
elseif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_14);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
}
}
}
intmain(void)
{
//led_init();//led初始化
//key_init();//按键初始化
usart_init();//串口初始化
nvic_init();//NVIC初始化
led_y();//初始化数码管引脚
key_y();//按键初始化
//tim();//时钟初始化
//usart1_sendstring(杨皓添的实验二);
while(1)
{
//key_anjian();
key_right();
key_left();
}
}
中断服务函数:
voidUSART1_IRQHandler(void)
{
uint8_trcv_data=0;
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==1)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
rcv_data=USART_ReceiveData(USART1);
//usart1_sendbyte(rcv_data);
if(rcv_data==1)
{
//第1位
GPIO_SetBits(GPIOB,GPIO_Pin_0);//低电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_SetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_SetBits(GPIOB,GPIO_Pin_7);//高电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
elseif(rcv_data==2)
{
//第2位
GPIO_ResetBits(GPIOB,GPIO_Pin_0);//低电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_SetBits(GPIOB,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);//高电位有效
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
elseif(rcv_data==3)
{
//第3位
GPIO_ResetBits(GPIOB,GPIO_Pin_0);//低电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);//高电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
elseif(rcv_data==4)
{
//第4位
GPIO_SetBits(GPIOB,GPIO_Pin_0);//低电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_SetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);//高电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
elseif(rcv_data==5)
{
//第5位
GPIO_ResetBits(GPIOB,GPIO_Pin_0);//低电位有效
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);//高电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
GPIO_SetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
elseif(rcv_data==6)
{
//第6位
GPIO_ResetBits(GPIOB,GPIO_Pin_0);//低电位有效
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);//高电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
elseif(rcv_data==7)
{
//第7位
GPIO_ResetBits(GPIOB,GPIO_Pin_0);//低电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_SetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);//高电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}
elseif(rcv_data==8)
{
//第8位
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);//低电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//高电位有效
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_SetBits(GPIOB,GPIO_Pin_14);
}
}
}
voidTIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==1)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}
else
{
GPIO_SetBits(GPIOB,GPIO_Pin_1);
}
}
}
飞卢小说,飞要你好看!