按键实现顺序一次亮2个led,顺序一次灭2个led

使用C语言在keil51环境下编程,实现按键控制LED灯按顺序一次亮2个,一次灭2个的功能。文章探讨了char与uchar数据类型的区别,以及正负数右移时的补位规则。目前能完成一次操作,但需手动复位以进行下一轮循环。实际硬件上已验证功能可行性。

c语言实现编程,keil51,点亮led灯,学习记录。

在以前的基础上实现按一下,亮俩个,按一下,灭俩个。

解决一直存在的问题:

1.char代表的首位为符号位,1为负数,0为正数,所以有效位数为7位;uchar不区分,直接就是8位。

2.关于右移,都是从高位开始补位:

正数:补0

负数:补1。对我来说,从1100 0000右移2位后变成1111 0000,也就是从7.6位灯灭变成7.6.5.4灭。我理解的是符号位也移动,补了俩位1

3.上一篇加一个led是因为a-=0x80代表的是a=a-0x80,并不是代表的是将其变为负数,故存在第一位一直为1,实际进行的还是正数的右移,而这篇直接实现了负数的右移,小进步。

未解决的问题:

可以实现一次,未实现循环,需及时复位才能继续执行下一次。

不加演示了,通过实物可实现功能。

#include <STC8.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
typedef int u16;
typedef char u8;
	
sbit s2 = P1^6;//定义一个独立按键
sbit s1 = P4^4;//定义一个独立按键
void delay(u16 i){
    while(i--);
}
void main(void){  
	uchar led_data=0xfc;   //1111 1100
	
	char led_dataa =0xc0;  //1100 0000
	
   while(1){ 
                
		  if(s1==0)
			delay(50000);
		if(s1==0){
			while(!s1);
			delay(50000);           //延时0.5s
		
		P0=led_data;    //P0 1111 1100
        led_data=led_data<<2;        //实现按一次亮两个,且保持前面的状态                   
		 } 
	  
	  if(s2==0)
			delay(50000);
		  if(s2==0){
			while(!s2);
			delay(50000);           //延时0.5s
		
		P0=led_dataa;     //P0 1100 0000此时第一位为符号位,1代表负数,
			              //右移符号位也移动,且自动补1
		led_dataa=led_dataa>>2;
	 }
		  	  
   }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值