文章还是基于51单片机(stc89c52RC)来实现的,学习江科大教程的学习日志
单片机上电所有IP口默认高电平
由图可知,当按键未按下,读寄存器的值为1,按下后接地读寄存器的值为0
CPU可以直接访问寄存器
要用到51单片机的位声明
了解运算的逻辑可以实现不同的效果
C51基本语句
按键抖动,信号不稳定,对按键检测造成干扰,要进行消抖(软件方法:delay函数延时){按键消抖一般用在按下和松开后只显示一种状态的情形,若按下一种状态,松开一种状态则不需要消抖}
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);//先消抖即在松开后才会执行下一句,接收到第一个信号就开始消抖(让cpu空转)
Delay(20);
P2_0=~P2_0;
}
接下来用上消抖来使P2寄存器的LED显示二进制
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LED_Num=0;//这种类型有八位正好对应寄存器,可以看作一个寄存器
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
//1111 1111上电热高电平
LED_Num++;//八位二进制
P2=~LED_Num;//由此可知,可以将一个八位或一个字节来带入到寄存器来显示他的状态
}
}
}
最后要实现的效果为按键移位(LED从低到高位亮灭)
首先演示的是单个按键控制单顺序移位
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
unsigned char LED_Num; //全局变量上电默认为1
void main()//按位左移0000 0001 / 0000 0010/0000 0100
{
P2=~0x01;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LED_Num++;
if(LED_Num>=8)
LED_Num=0;//不加花括号,需要加缩进且只识别第一行
P2=~(0x01<<LED_Num);//注意运算顺序,将状态用二进制表示,然后改变二进制,再重新付给寄存器
}
接下来是两个按键控制左右移位
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
unsigned char LED_Num; //全局变量上电默认为1
void main()//按位左移0000 0001 / 0000 0010/0000 0100
{
P2=~0x01;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LED_Num++;
if(LED_Num>=8)
LED_Num=0;//不加花括号,需要加缩进且只识别第一行
P2=~(0x01<<LED_Num);//注意运算顺序,将状态用二进制表示,然后改变二进制,再重新付给寄存器
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LED_Num==0)
LED_Num=7;
else
LED_Num--;
P2=~(0x01<<LED_Num);//都是左移,只改变变量原本的结构并没有改变
}
结束,LED和按键圆满结束!