【STC8H8K64U单片机】按键控制LED翻转,逐行详细解释代码!

先上代码!!!

#include <STC8h.H>

sbit Key = P3^4;
sbit Led14 = P6^4;
sbit Led17 = P6^7;

void Delay10ms()		//@24.000MHz
{
	unsigned char data i, j, k;

	i = 2;
	j = 56;
	k = 172;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	P0M0 = 0x00; P0M1 = 0x00; 
	P1M0 = 0x00; P1M1 = 0x00; 
	P2M0 = 0x00; P2M1 = 0x00; 
	P3M0 = 0x00; P3M1 = 0x00; 
	P4M0 = 0x00; P4M1 = 0x00; 
	P5M0 = 0x00; P5M1 = 0x00; 
	P6M0 = 0x00; P6M1 = 0x00; 
	P7M0 = 0x00; P7M1 = 0x00; 

	P4 = 0;
	Led14 = 1;
	Led17 = 1;
	
	while(1)
	{
		if(Key == 0)
		{
			Delay10ms();
			if(Key == 1)
			{
				Delay10ms();
				Led14 ^= 1;
				Led17 ^= 1;
			}
		}
	}
}

代码解释:

#include <STC8h.H>

这里引用的是8h8k的头文件

 在代码中直接右键可以看到添加<stc8.h>的头文件,但是这里需要注意,如果我们直接点击生成的是#include <STC8.H>头文件,这个头文件在Keil编译中会报错找不到对应的头文件,我们需要的是在STC8后边加上一个H,这样Keil在编译中就不会找不到头文件而报错了

sbit Key = P3^4;
sbit Led14 = P6^4;
sbit Led17 = P6^7;

sbit 是一个关键字或指令,用于声明一个位(bit)变量。它通常用于嵌入式系统或微控制器编程中,用于控制硬件寄存器的某个特定位。在这里,我们使用 sbit 来声明一个位变量并设置其值

 

第一行意思:将P3端口的第4位声明为Key变量,并将其设置为1,P3^4就是控制的SW21按键

 

第二行意思:将P6端口的第4位声明为Led14变量,并将其设置为1,P6^4控制的就是LED14

第三行意思:将P6端口的第7位声明为Led17变量,并将其设置为1,P6^7控制的就是LED17

当然我们在这里点亮的是LED14和LED17 

void Delay10ms()		//@24.000MHz
{
	unsigned char data i, j, k;

	i = 2;
	j = 56;
	k = 172;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

这一段很简单,是STC烧录软件直接生成的,我们需要注意的是系统所对应的频率,我们这里使用的是24.000MHz。以及我们在选择8051指令集时要选择对应型号的STC-Y6。

至于我们为什么使用延时10ms,是因为在按键按下时会产生一段的抖动,如果我们不延时一段时间去消除这段时间产生的抖动的话,按键信号就会产生不稳定和误触发,当按键被按下或释放时,由于机械弹性和电气噪声等原因,会产生一系列的快速开闭动作,这些抖动可能会导致按键被误识别为多次按下或释放,从而引发错误的操作。我们一般都是用软件消抖,就是在编程时延时一段时间,来避免抖动,软件消抖的优点是不增加额外硬件成本,灵活性高,但可能会占用一定的CPU资源。

    P0M0 = 0x00; P0M1 = 0x00; 
	P1M0 = 0x00; P1M1 = 0x00; 
	P2M0 = 0x00; P2M1 = 0x00; 
	P3M0 = 0x00; P3M1 = 0x00; 
	P4M0 = 0x00; P4M1 = 0x00; 
	P5M0 = 0x00; P5M1 = 0x00; 
	P6M0 = 0x00; P6M1 = 0x00; 
	P7M0 = 0x00; P7M1 = 0x00; 

主函数中这段代码,是将P2口配置成准双向口,设置单片机(MCU)的端口模式寄存器。每个端口都有两个模式寄存器,P0M0、P1M0等表示端口0的模式寄存器0,P0M1、P1M1等表示端口0的模式寄存器1。这些寄存器的值被设置为0x00,意味着将端口的所有引脚配置为默认输入模式。

主要目的是初始化单片机的端口模式,将所有端口的引脚都设置为默认输入模式。这样可以防止在系统启动时,由于端口引脚的随机状态导致的意外行为。同时,这也是为了后续对端口进行特定操作(如输入、输出或特殊功能)做准备。

当然这段代码也不需要我们自己来写,STC烧录软件中的I/O口配置工具已经为我们配置好了,只需要将你的选择输入进去即可。

    P4 = 0;
	Led14 = 1;
	Led17 = 1;

 

第一句话,将端口P4的所有引脚设置为逻辑低电平(0),在电路中,P4口接到了三极管是控制其开合的引脚,我们将它配置为低电平电路导通

第二句话,将变量Led14的值设置为1,Led14控制LED14引脚

第三句话,将变量Led17的值设置为1,Led17控制LED17引脚

我们可以看到LED正极接到了VCC上此时就代表着正极接入了高电平,只有负极产生低电平时才会导通使LED发光,我们先将Led14和Led17的值设置为1,代表着先将LED熄灭

	while(1)
	{
		if(Key == 0)
		{
			Delay10ms();
			if(Key == 1)
			{
				Delay10ms();
				Led14 ^= 1;
				Led17 ^= 1;
			}
		}
	}

主函数中while(1)是死循环,有单片机基础的同学都知道,while(1)是主函数中必不可少的循环用来执行主程序。

代码首先检查按键(Key)是否被按下(Key == 0)。如果按键被按下,它会延迟10毫秒(Delay10ms())(延时的作用在于消抖),然后再次检查按键的状态。如果按键仍然被按下(Key == 1),则再次延迟10毫秒。

Led14 ^= 1;:这行代码使用异或运算符(^)来切换Led14的值。如果Led14当前为0,它将变为1;如果Led14当前为1,它将变为0。这相当于切换了与Led14相关联的LED灯的状态。
Led17 ^= 1;:这行代码的作用与上一行类似,只是它切换了与Led17相关联的LED灯的状态。

这段代码的目的是在按键被按下时,交替地打开和关闭与Led14Led17相关联的LED灯。 

  • 42
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值