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

692

被折叠的 条评论
为什么被折叠?



