前言
大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
- YY的《C++》专栏
- YY的《C++11》专栏
- YY的《Linux》专栏
- YY的《数据结构》专栏
- YY的《C语言基础》专栏
- YY的《初学者易错点》专栏
- YY的《小小知识点》专栏
- YY的《单片机期末速过》专栏
- YY的《C++期末速过》专栏
- YY的《单片机》专栏
- YY的《STM32》专栏
- YY的《数据库》专栏
- YY的《数据库原理》专栏
目录
- 一.前置知识
- 二.设计获取独立按键键码函数 KEY()
- 1.按键前置知识
- 2.根据需求配置键码
- 三.实现流水灯功能
- 1.引入函数库INTRINS.H与相关函数_crol_( )_lrol_( )介绍
- 2.根据按键功能,设计按键设置中断函数的左右移
- 四.烧入单片机观察现象
一.前置知识
- 要实现该项目需要大家先阅读,前置知识:
- 以下是前置知识博客大概内容:传送门在下方
- 【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)
- 在上个实验中,我们已经成功控制小灯以1s为频率闪动
二.设计获取独立按键键码函数 KEY()
1.按键前置知识
- 要设计获取独立按键函数,我们需要查看它的原理图并进行相应配置,相关博客内容传送门在下方
- 【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
- 部分内容如下所示:
2.根据需求配置键码
- 我们通过1的博客,已经大致了解P31~P33如何操作
- 我们现在 让P31到P33分别表示数字1~4
/*** @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之间来回切换
- 代表的功能分别是: 流水灯向左流水,流水灯向右流水
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位,代码呈现效果如图所示
- 与传统左移<<,右移>>不同点在于它是一个类似循环链表的移动方式,即最左边再向左移动会回到最右边的位置
unsgined char a =0x01;
a=_crol_(a,1); //0x02unsgined char a =0x80;
a=_crol_(a,1); //0x01
2.根据按键功能,设计按键设置中断函数的左右移
unsigned char KeyNum,LEDMode;void main()
{P2=0xFE;//点亮LEDTimer0Init();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);}
}
四.烧入单片机观察现象
- 烧入的相关博客传送门在下方,本博客相关资源解压后烧写即可观察现象
- 【51单片机】烧写教程:将代码下载到单片机中(图示&解析)
- 现象:按下k1往左移,再次按下往右移(LEDmode变量起作用)