江科大自动化单片机学习记录
记录学习单片机的过程
使用到的设备以及软件
普中科技的嵌入式开发实验仪,keil uvision5,普中isp(用来程序下载),stc-isp(用来生成对应的需要的代码)
今天的学习内容
独立按键控制LED显示二进制的显示以及控制LED移位
控制LED进行二进制的显示
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main(){
unsigned char LEDNum=0;
while(1){
if(P3_3==0)
{
Delay(20);
while(P3_3==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
- 注意到unsigned char LEDNum的作用:
- 假设没有这个值,那么P2的位置(即所有的灯都会亮起),或者说该亮的地方没亮,但是不该亮的地方全都亮了
- 然后就需要我们进行按位取反
- 但是按位取反之后1111 1111溢出(因为进行P2++导致了溢出)就回变成 0000 0000,然后使用~进行按位取反之后又变成了1111 1111,至始至终没有改变,所以就需要使用到LEDNum这一个值进行一个代换
控制LED进行移位
练习按位左移<<
0000 0001 0x01<<0
0000 0010 0x01<<1
0000 0100 0x01<<2
最后得到这样的代码:
#include <REGX52.H>
unsigned char LEDNum=0;
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main(){
while(1){
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
{
LEDNum=0;
}
P2=~(0x01<<LEDNum);
}
}
}
对P2进行初始化并按位取反:
#include <REGX52.H>
unsigned char LEDNum=0;
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main(){
P2=~0x01;
while(1){
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
{
LEDNum=0;
}
P2=~(0x01<<LEDNum);
}
}
}
再进行按键的不同处理方式得到:
#include <REGX52.H>
unsigned char LEDNum=0;
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main(){
P2=~0x01;
while(1){
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
{
LEDNum=0;
}
P2=~(0x01<<LEDNum);
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0)
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);
}
}
}
最终实现的就是按动P3_0进行右移(注意,这里是因为按位取反然后变成了LED的右移),
心得体会
在写完一个函数程序之后我们要尝试去调用它,然后看 其是否符合我们想要的要求