标题: 这个单片机程序运行时从最后一个灯到第一个灯亮,怎样才能互换一下 [打印本页]

作者: 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)就可以了,这两个函数也可以自己实现
  1. unsigned char my_crol(unsigned char num,unsigned char x)
  2. {
  3.         unsigned char temp1,temp2;
  4.         temp1 = num>>(8-x);
  5.         temp2 = num<<(x);
  6.         num = temp1 | temp2;
  7.         return num;
  8. }

  9. unsigned char my_cror(unsigned char num,unsigned char x)
  10. {
  11.         unsigned char temp1,temp2;
  12.         temp1 = num<<(8-x);
  13.         temp2 = num>>(x);
  14.         num = temp1 | temp2;
  15.         return num;
  16. }
复制代码

作者: 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