找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 778|回复: 6
打印 上一主题 下一主题
收起左侧

这个单片机程序运行时从最后一个灯到第一个灯亮,怎样才能互换一下

[复制链接]
跳转到指定楼层
楼主
ID:1126656 发表于 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的位置,因此在右移过程中亮灯的数量不变,只是改变了亮灯的位置.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:452475 发表于 2024-9-23 08:31 | 只看该作者
a=_crol_(a,1);
回复

使用道具 举报

板凳
ID:136485 发表于 2024-9-23 08:45 | 只看该作者
换成左移函数就行了
回复

使用道具 举报

地板
ID:1132112 发表于 2024-9-23 12:56 | 只看该作者
把大循环里的a=_cror_(a,1);改为a=_crol_(a,1);循环左移即可
回复

使用道具 举报

5#
ID:1123322 发表于 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. }
复制代码
回复

使用道具 举报

6#
ID:1132494 发表于 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);
这行代码直接在一行内完成了最低位的获取、右移和重新放置,减少了中间变量的使用。
回复

使用道具 举报

7#
ID:1132494 发表于 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(); // 调用移动函数
    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表