按下SW0
键,启动显示(LED灯全部点亮);按下SW1键,关闭显示(LED灯全部熄灭);
按下SW2一次,LED灯左移一位;按下SW3键一次,LED灯右移一位;按下SW4
键一次,LED灯闪烁一次;按下SW5键一次,LED灯做奇偶交替闪烁一次。
P0.0-----P0.5接SW0-----SW5
P1.0-----P1.7接L0-----L7
#include<reg52.h>
sbit SW0 = P0^0; // 定义 SW0 引脚
sbit SW1 = P0^1; // 定义 SW1 引脚
sbit SW2 = P0^2; // 定义 SW2 引脚
sbit SW3 = P0^3; // 定义 SW3 引脚
sbit SW4 = P0^4; // 定义 SW4 引脚
sbit SW5 = P0^5; // 定义 SW5 引脚
sbit LED = P1; // 定义 LED 引脚
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void main()
{
LED = 0xFF; // 初始状态 LED 灯全部熄灭
while(1)
{
if(SW0 == 0) // 按下 SW0 键,启动显示(LED灯全部点亮)
LED = 0x00;
else if(SW1 == 0) // 按下 SW1 键,关闭显示(LED灯全部熄灭)
LED = 0xFF;
else if(SW2 == 0) // 按下 SW2 键一次,LED灯左移一位
{
LED = LED << 1;
if(LED == 0x00)
LED = 0x01;
}
else if(SW3 == 0) // 按下 SW3 键一次,LED灯右移一位
{
LED = LED >> 1;
if(LED == 0x00)
LED = 0x80;
}
else if(SW4 == 0) // 按下 SW4 键一次,LED灯闪烁一次
{
LED = 0x00;
delay(500);
LED = 0xFF;
delay(500);
}
else if(SW5 == 0) // 按下 SW5 键一次,LED灯做奇偶交替闪烁一次
{
LED = 0x55;
delay(500);
LED = 0xAA;
delay(500);
}
}
}
主函数
#include "stm32f10x.h"
#include "led.h"
int main()
{
RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9); //36M;自定义时钟函数
LED_Init();//LED初始化函数
while(1)
{
GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//
delay(6000000);//延迟函数
GPIO_SetBits(LED_PORT,GPIO_Pin_0);
delay(6000000);
}
}
自定义时钟函数
void RCC_HSE_Config(u32 div,u32 pllm) //
{
RCC_DeInit(); //
RCC_HSEConfig(RCC_HSE_ON);//
if(RCC_WaitForHSEStartUp()==SUCCESS) //
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//
RCC_PCLK1Config(RCC_HCLK_Div2);//
RCC_PCLK2Config(RCC_HCLK_Div1);//
RCC_PLLConfig(div,pllm);// 修改PLL时钟源和倍频系数【只需要修改此处】相关定义查看stm32f10x_rcc.h头文件
//div表示时钟源,取值为RCC_PLLSource_HSE_Div1 或 RCC_PLLSource_HSE_Div2
//pllm为锁相环,提供倍频系数,取值为RCC_PLLMul_2-RCC_PLLMul_16。PLLMul表示倍频器。从2倍到16倍之间。
RCC_PLLCmd(ENABLE); //
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//
while(RCC_GetSYSCLKSource()!=0x08);//
}
}
开发板使用的HSE是8M晶振,经过PLLMUL9倍频可以输出72M时钟频率给PLLCLK。
RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9)//72M
RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9)//36M
如果我们选择的HSE是PLL的时钟源,PLL是SYSCLK的时钟源,那么SYSCLK为72M。也就是SystemInit配置的最终系统时钟。
RCC_PLLSource_HSE_Div2 HSE表示经过2分频之后,成为PLL的时钟源。
RCC_PLLSource_HSE_Div1 HSE表示 直接成为PLL的时钟源。
不要把系统时钟设置超过72M。
延迟函数
void delay(u32 i)
{
while(i--);
}