【控制外设2~4】

点亮一个LED

LED发光二极管:Light Emitting Diode

LED正极引脚较长,负极引脚较短

LED正极闪电极较小,负极闪电极较小

SCT89C52单片机的LED是共阳极,我们要控制的是阴极的电平

#include <REGX52.H>
void main()
{
	P2=0x55;
	while(1){
		
	}
}

LED闪烁

调用延时函数

//延时函数
void Delay1ms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
		while(xms){
			
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
 #include <REGX52.H>
 #include <INTRINS.H>  //_nop_()函数所在库voidDelay500ms()       //@11.0592MHz
 {
     unsignedchari, j, k;_nop_();  
     i=4;
     j=129;
     k=119;
     do
     {
         do
         {
             while (--k);
         } while (--j);
     } while (--i);
 }voidmain()
 {
     
     while(1)
     {
         P2=0x00;
         Delay500ms();  
         P2=0xFF;
         Delay500ms();
     }
 }   

LED流水灯

通过P2寄存器的不断延时赋值,实现了肉眼看到的流水灯

#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
		while(xms){
			
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}


void main()
{
	P2=0xFE;
	Delay1ms(100);
	
	P2=0xFD;
	Delay1ms(100);
	P2=0xFB;
	Delay1ms(100);
	
	P2=0xF7;
	Delay1ms(100);
	P2=0xEF;
	Delay1ms(100);
	
	P2=0xDF;
	Delay1ms(100);
	P2=0xBF;
	Delay1ms(100);
	
	P2=0x7F;
	Delay1ms(100);
}

独立按键控制单个LED

轻触按键:按下时开关接通,松开时开关断开

按下则亮

 #include <REGX52.H>
 voidmain(){
     while(1)
     {
         if(P3_1==0)
             P2_0=0;
         else
             P2_0=1;
     }
 }

一按更换亮暗

按键内部的金属弹片受力弹动来实现接通和断开,所以会有抖动时段,我们要把这个时段消除掉
通过延时函数

#include <REGX52.H>
#include <intrins.h>
 
void Delay(unsigned int xms)        //@11.0592MHz
{
    unsigned char i, j;
 
    while(xms)
    {    
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j);
        } while (--i);
    xms--;
    }
}
 
 
void main()
{
    while(1)
    {
            if(P3_1==0)
            {
                Delay(20);
                while(P3_1==0);  //判断按键状态,还在按下状态则会一直循环
                Delay(20);
                P2_0=~P2_0;
            }
    }    
}

独立按键控制LED显示二进制

#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
		while(xms){
			
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}


void main()
{
	int nub=0;
	while(1){
		if(P3_1==0){
			Delay1ms(20);
			while(P3_1==0);
			Delay1ms(20);
			nub++;
			P2=~nub;
		}
	
	}
}

独立按键控制LED移位

P3_1右移,P3_0左移

#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
		while(xms){
			
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

unsigned char nub=0;
void main()
{
	P2=~0x01;
	
	while(1){
		if(P3_1==0){
			Delay1ms(20);
			while(P3_1==0);
			Delay1ms(20);
			nub++;
			if(nub==8)nub=0;
			P2=~(0x01<<nub);
		}
		if(P3_0==0){
			Delay1ms(20);
			while(P3_0==0);
			Delay1ms(20);
			if(nub==0)nub=8;
			nub--;
			
			P2=~(0x01<<nub);
			
		}
	
	}

}

静态数码管显示

位选-段选(4个数码管一组)

#include <REGX52.H>
unsigned char table[]={0x3F,0x06,0x5B,0x4F,0X66,0X6D,0X7D,0x07,0x7F,0x6F};
void Nixie(unsigned char location,unsigned char number){
	switch(location){
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=table[number];
}
void main(){
	Nixie(8,6);
	while(1){
		
	}
	
	
	
}

多个数码管动态显示

多个数码管的位选和段选出现了交叉:位选-段选-位选-段选-位选-段选
我们需要进行消影消影,思路是每一数码管位选-段选后回到全灭状态

#include <REGX52.H>
unsigned char table[]={0x3F,0x06,0x5B,0x4F,0X66,0X6D,0X7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
	while(xms--){
		i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	}

	
}

void Nixie(unsigned char location,unsigned char number){
	switch(location){
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=table[number];
	Delay(1);
	P0=0x00;
}
void main(){
	Nixie(8,6);
	while(1){
		Nixie(8,6);
		Nixie(2,2);
		Nixie(3,3);
		Nixie(6,6);
	}
	
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值