二、单片机学习——独立按键实验

实验目的:掌握 led 灯的点亮原理;
     理解并掌握独立按键的操作原理及操作方法;
实验模块:核心板+8 位流水灯与独立按键模块
实验内容:用按键控制对应的 led 灯点亮,即第一个按键按下点亮第一个 led
     灯,点亮后不熄灭;第二个按键按下点亮第二个 led 灯,第三个按键按下点亮第
       三个 led 灯,第四个按键按下熄灭所有的 led 灯。

模块连接图:

电路原理图:

功能描述: 当按下S17~S21中的任一个按键,有对应的LED被点亮
硬件连接:  用8位杜邦线将J8与J13连接,
            用5位杜邦线将J9_7与J7_s17、J9_6与J7_s18、J9_5与J7_s19、J9_4与J7_s20、J9_3与J7_s21

实验源码:

#include "reg51.h"       //包含头文件
sbit s17=P3^7;           //定义S17按键控制IO
sbit s18=P3^6;           //定义S18按键控制IO
sbit s19=P3^5;           //定义S19按键控制IO
sbit s20=P3^4;           //定义S20按键控制IO
sbit s21=P3^3;           //定义S21按键控制IO
#define uchar unsigned char
#define uint  unsigned int
uchar keyValue;          //定义扫描结果参数
//**************************************************************************************************
//延时函数
//**************************************************************************************************
delay(uint time)              //int型数据为16位,所以最大值为65535           
 {
  uint  i,j;                  //定义变量i,j,用于循环语句
  for(i=0;i<time;i++)         //for循环,循环50*time次
     for(j=0;j<50;j++);       //for循环,循环50次
 }
//**************************************************************************************************
//1*5按键扫描函数
//**************************************************************************************************
keyScan()                            
 {
   P3=P3|0xf8;                //P3高5位置1,设置为输入
   if((P3&0xf8)!=0xf8)        //判断是否有按键按下
    {
     delay(20);               //延时肖抖
     if((P3&0xf8)!=0xf8)      //再次判断是否有按键按下
       keyValue=(P3&0xf8);    //读取扫描结果
    }
 }
//**************************************************************************************************
//1*5按键扫描结果处理函数
//**************************************************************************************************
keyHandle()                    
 {     
        switch(keyValue)        
          {
            case 0x78:           //如果S17按键按下 
    {
                 P1=~0x01;       //点亮一个发光二极管 
                 break;         
                }
            case 0xb8:           //如果S18按键按下
    {
                 P1=~0x02;       //点亮一个发光二极管 
                 break;
                }
            case 0xd8:           //如果S19按键按下
    {
                 P1=~0x04;       //点亮一个发光二极管 
                 break;
                }
            case 0xe8:           //如果S20按键按下
    {
                 P1=~0x08;       //点亮一个发光二极管 
                 break;
                }
            case 0xf0:           //如果S21按键按下
    {
                 P1=~0x10;       //点亮一个发光二极管 
                 break;
                }
            default:
     break;
          }
 }
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main()                   //主函数
{
   
     while(1)                 //进入while死循环
      {
        keyScan();            //按键扫描
        keyHandle();          //处理扫描结果
      }        
}
原文地址:https://www.cnblogs.com/breads/p/12684703.html