51单片机独立按键问题

按下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);
        }
    }
}

  • 这篇文章:一、点亮LED程序,代码正确但是LED灯不亮,单板没反应 也许有你想要的答案,你可以看看
  • 除此之外, 这篇博客: 点亮LED灯实验、系统时钟设置、LED灯闪烁实验、 位带操作中的 LED灯闪烁实验 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 主函数

    #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--);
    }