标题:
这个单片机程序运行时从最后一个灯到第一个灯亮,怎样才能互换一下
[打印本页]
作者:
zyscxr
时间:
2024-9-22 20:12
标题:
这个单片机程序运行时从最后一个灯到第一个灯亮,怎样才能互换一下
#include<reg52.h> //52系列单片机头文件
#include<intrins.h> //包含 _crol_ _cror_(函数所在的头文件 )
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
uchar a; //定义a变量, 用来给P1赋值
//********延时程序***********
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms 即延时约xms亳秒
for(j=110;j>0;j--);
}
//***************************
void main() //主函数
{
a=0xfe; //二进制: 1111 1110
while(1) //大循环
{
P1=a; //点亮发光管
delayms(500); //延时500毫秒
a=_cror_(a,1); //将a循环右移1位后再赋给a
}
}
//循环右移,被移出的放在最高位,来回循环,所以P1中0和1的位数不变,只
//是改变了0 1的位置,因此在右移过程中亮灯的数量不变,只是改变了亮灯的位置.
作者:
夏至浅浅落
时间:
2024-9-23 08:31
a=_crol_(a,1);
作者:
kxcuser
时间:
2024-9-23 08:45
换成左移函数就行了
作者:
proteuslearn
时间:
2024-9-23 12:56
把大循环里的a=_cror_(a,1);改为a=_crol_(a,1);循环左移即可
作者:
123yhk
时间:
2024-9-23 21:12
把a=_cror_(a,1)改为a=_crol_(a,1)就可以了,这两个函数也可以自己实现
unsigned char my_crol(unsigned char num,unsigned char x)
{
unsigned char temp1,temp2;
temp1 = num>>(8-x);
temp2 = num<<(x);
num = temp1 | temp2;
return num;
}
unsigned char my_cror(unsigned char num,unsigned char x)
{
unsigned char temp1,temp2;
temp1 = num<<(8-x);
temp2 = num>>(x);
num = temp1 | temp2;
return num;
}
复制代码
作者:
hdo11103
时间:
2024-9-27 06:30
#include <reg52.h> // 52系列单片机头文件
#define uint unsigned int // 宏定义
#define uchar unsigned char // 宏定义
uchar a; // 定义a变量,用来给P1赋值
//********延时程序***********
void delayms(uint xms) {
uint i, j;
for(i = xms; i > 0; i--) { // i=xms 即延时约xms毫秒
for(j = 110; j > 0; j--);
}
}
//***************************
void main() { // 主函数
a = 0xFE; // 初始值为 1111 1110
while(1) { // 大循环
P1 = a; // 点亮发光管
delayms(500); // 延时500毫秒
// 循环右移,并将被移出的位放到最高位
a = (a >> 1) | ((a & 0x01) << 7); // 直接进行右移与处理
}
}
简化循环右移:
在右移并将最低位放回最高位的过程中,使用了更简洁的表达式:
a = (a >> 1) | ((a & 0x01) << 7);
这行代码直接在一行内完成了最低位的获取、右移和重新放置,减少了中间变量的使用。
作者:
hdo11103
时间:
2024-9-27 06:52
#include <reg52.h> // 52系列单片机头文件
#define uchar unsigned char // 宏定义
#define uint unsigned int // 宏定义
uchar a = 0xFE; // 初始值为 1111 1110
bit direction = 0; // 方向标志,0表示右移,1表示左移
//********延时程序***********
void delayms(uint xms) {
uint i, j;
for(i = xms; i > 0; i--) {
for(j = 110; j > 0; j--);
}
}
//***************************
//********移动函数***********
void moveLED() {
if (direction == 0) { // 右移
a = (a >> 1) | ((a & 0x01) << 7); // 右移并处理最低位
if (a == 0xFE) direction = 1; // 到达初始位置,切换方向
} else { // 左移
a = (a << 1) | ((a & 0x80) >> 7); // 左移并处理最高位
if (a == 0xFE) direction = 0; // 到达初始位置,切换方向
}
}
//***************************
void main() { // 主函数
while(1) { // 大循环
P1 = a; // 点亮发光管
delayms(500); // 延时500毫秒,保持流动效果
moveLED(); // 调用移动函数
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1