cdmzxh 发表于 2024-4-16 19:46:47

一个i/o口驱动发光二极管并扫描按键


小弟学习51,单片机,根据网上资料试验了用STC15W204S做 一个i/o口驱动发光二极管并扫描按键的电路,程序烧入后按键没反应,请各位大侠不吝赐教程序有何问题,谢谢。



#include <STC15.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit LED1 = P1^0;      //LED端口声明
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;

uchar KeySec=0;//键值变量

/**********************************
1ms延时程序(仅限于STC15W 1T MCU)
**********************************/
void Delay1ms()                //@12.000MHz
{
      unsigned char i, j;
      i = 12;
      j = 169;
      do
      {
                while (--j);
      } while (--i);
}



/**********************************
      按键扫描程序
**********************************/
void key_scan()
{
      static uchar count=0;//静态计数变量
      static bit sign_key=0;                        //静态标志位
       uchar time_key,time_LED;//临时变量

    //    P1M0=0x00;//P1.0~3设置弱上拉
   //   P1M1=0x00;//P1.0~3设置弱上拉

      time_LED=P1&0x0f;//保存4个LED状态

      P1M0=0x00;//P1.0~3设置弱上拉
      P1M1=0x00;//P1.0~3设置弱上拉
      P1|=0x0f; //P1.0~3置高电平      
      if(P1&0x0f!=0x0f)//有键按下
      {
                if(++count>=10 && sign_key==0)//消抖
                {
                        sign_key=1;//自锁
                        time_key=P1&0x0f;//保存P1.0~3状态
                        switch(time_key)
                        {
                              case 0x0e: KeySec=1; break;//输出键值
                              case 0x0d: KeySec=2; break;
                              case 0x0b: KeySec=3; break;
                              case 0x07: KeySec=4; break;
                        }
                }
      }
      else //抬起
      {
                count=0;//计数变量清0
                sign_key=0;//键态标志清0
      }
      P1&=0xf0;    //P1.0~3清0
      P1|=time_LED;//还原4个LED状态
      P1M0=0x0f;   //还原P1.0~3推挽设置
      P1M1=0x00;   //还原P1.0~3推挽设置
}
/*********************************
      按键服务程序
*********************************/
void key_service()
{
      switch(KeySec)
      {
                case 1:      LED1=~LED1;KeySec=0;break;
                case 2:      LED2=~LED2;KeySec=0;break;
                case 3:      LED3=~LED3;KeySec=0;break;
                case 4:      LED4=~LED4;KeySec=0;break;
      }                  
}
/********************************
      主程序
********************************/
void main()
{       
      P1M0=0x0f;//P1.0~3设置推挽
      P1M1=0x00;//P1.0~0设置推挽

                LED1=0;
                LED2=0;
                LED3=0;
                LED4=0;
      while(1)
      {
                key_scan();
                key_service();
                Delay1ms();//控制主循环周期约1ms
      }
}


国学芯用 发表于 2024-4-17 08:52:26

跟着冲哥学
视频教学:《STC32位8051单片机原理及应用》,200万大奖, 送实验箱; 冲哥版

cdmzxh 发表于 2024-4-18 11:35:11






程序修改了一下,弄好了
页: [1]
查看完整版本: 一个i/o口驱动发光二极管并扫描按键