找回密码
 立即注册
查看: 579|回复: 2

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2024-04-24 10:09:13

3

主题

1

回帖

65

积分

注册会员

积分
65
发表于 2024-4-16 19:46:47 | 显示全部楼层 |阅读模式
小弟学习51,单片机,根据网上资料试验了用STC15W204S做 一个i/o口驱动发光二极管并扫描按键的电路,程序烧入后按键没反应,请各位大侠不吝赐教程序有何问题,谢谢。
无标题ss.png


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


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2024-4-17 08:52:26 | 显示全部楼层
热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2024-04-24 10:09:13

3

主题

1

回帖

65

积分

注册会员

积分
65
发表于 2024-4-18 11:35:11 | 显示全部楼层
bae0e19c4568bf74cebc36b1e39ed1a.jpg




程序修改了一下,弄好了
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:41 , Processed in 0.150264 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表