前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【51单片机】初学者必会项目——按键控制LED流水灯模式(定时器&中断系统的应用)(10)

【51单片机】初学者必会项目——按键控制LED流水灯模式(定时器&中断系统的应用)(10)

作者头像
YY的秘密代码小屋
发布2024-02-24 09:45:23
7490
发布2024-02-24 09:45:23
举报
文章被收录于专栏:C++系列C++系列

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含:

在这里插入图片描述
在这里插入图片描述

一.前置知识

  • 在上个实验中,我们已经成功控制小灯以1s为频率闪动

二.设计获取独立按键键码函数 KEY()

1.按键前置知识

2.根据需求配置键码

  • 我们通过1的博客,已经大致了解P31~P33如何操作
  • 我们现在 让P31到P33分别表示数字1~4
代码语言:javascript
复制
/**
  * @brief  获取独立按键键码
  * @param  无
  * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0
  */
unsigned char Key()
{
	unsigned char KeyNumber=0;
	//寄存器值为0时,表示按下
	//Delay操作是为了避免按键抖动带来的误差
	if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
	if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
	if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
	if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
	
	return KeyNumber;
}
  • 主函数也实现功能: 伴随按键按下,LEDmode在0和1之间来回切换
  • 代表的功能分别是: 流水灯向左流水,流水灯向右流水
代码语言:javascript
复制
unsigned char KeyNum,LEDMode;
void main()
{
	P2=0xFE;
	Timer0Init();
	while(1)
	{
		KeyNum=Key();		//获取独立按键键码
		if(KeyNum)			//如果按键按下
		{
			if(KeyNum==1)	//如果K1按键按下
			{
				LEDMode++;	//模式切换
				if(LEDMode>=2)LEDMode=0;
			}
		}
	}
}

三.实现流水灯功能

1.引入函数库INTRINS.H与相关函数_crol_( )lrol( )介绍

  • 进入头文件后,我们可以看到三个函数
  • crol( ,)效果是向左移动1位,代码呈现效果如图所示
  • 与传统左移<<,右移>>不同点在于它是一个类似循环链表的移动方式,即最左边再向左移动会回到最右边的位置
代码语言:javascript
复制
unsgined char a =0x01;
a=_crol_(a,1);    //0x02

unsgined char a =0x80;
a=_crol_(a,1);    //0x01            

2.根据按键功能,设计按键设置中断函数的左右移

代码语言:javascript
复制
unsigned char KeyNum,LEDMode;

void main()
{
	P2=0xFE;//点亮LED
	Timer0Init();
	while(1)
	{
		KeyNum=Key();		//获取独立按键键码
		if(KeyNum)			//如果按键按下
		{
			if(KeyNum==1)	//如果K1按键按下
			{
				LEDMode++;	//模式切换
				if(LEDMode>=2)LEDMode=0;
			}
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;		//T0Count计次,对中断频率进行分频
	if(T0Count>=500)//分频500次,500ms
	{
		T0Count=0;
		if(LEDMode==0)			//模式判断
			P2=_crol_(P2,1);	//LED输出
		if(LEDMode==1)
			P2=_cror_(P2,1);
	}
}

四.烧入单片机观察现象

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.前置知识
  • 二.设计获取独立按键键码函数 KEY()
    • 1.按键前置知识
      • 2.根据需求配置键码
      • 三.实现流水灯功能
        • 1.引入函数库INTRINS.H与相关函数_crol_( )lrol( )介绍
          • 2.根据按键功能,设计按键设置中断函数的左右移
          • 四.烧入单片机观察现象
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com