找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 985|回复: 7
收起左侧

请教一个单片机Keil uVision4流水灯编程问题

[复制链接]
ID:1013744 发表于 2022-3-28 16:35 | 显示全部楼层 |阅读模式
P0=((p<<i)&0x0F)|(0xF0&(p>>i));和  P0=((p&0xF0)<<i)|((p&0x0F)>>i);是啥意思啊刚学看不明白

void move_to_m(unsigned char p)
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        P0=((p<<i)&0x0F)|(0xF0&(p>>i));
        delay(20000);      
    }
}

void move_from_m(unsigned char p)
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        P0=((p&0xF0)<<i)|((p&0x0F)>>i);
        delay(20000);
    }
}
回复

使用道具 举报

ID:46065 发表于 2022-3-28 21:09 | 显示全部楼层

P0=P左移i位后的低四位(&0x0F)+P右移i位后的高四位(0xF0&)
回复

使用道具 举报

ID:860248 发表于 2022-3-29 01:13 | 显示全部楼层
你好, 这个是我的练习, 看看能帮到你吗

/**********************************************
** 文件名:   广告灯.c                                               **
** 晶振频率: 11.0592MHZ                                              **
** 日  期:   2022年03月28日                                      **
** 程  序:   利用移位指令实现拉幕闭幕式                      **
**********************************************/

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P0

/********* 时间延时程序 *********/

void delayms(uint ms)
{
         uint t;
        while(ms--)
        {
                for(t=0; t<100; t++);
        }
}

/************ 主程序 ************/

void main(void)
{
         uchar i, HW, LW;                                                        //HW 高4位  LW 低4位
        while(1)
        {
                LW = 0x08;                                                        //LW=0000 1000
                HW = 0x10;                                                        //HW=0001 0000

                for(i=0; i<4; i++)                                                //由於 8个LED, 中间作拉开及向中关闭 所以只需要移动 4次                                                           
                {
                        LED = ~(HW|LW)        ;                                //HW|LW = 0001 0000 | 0000 1000 = 0001 1000 ~反相= 1110 0111
                        delayms(250);
                        LW=(LW>>1)|0x08;                                        //LW移位後补1  LW原 0000 1000 >>移位 0000 0100 || 0000 1000 = 0000 1100
                        HW=(HW<<1)|0x10;                                        //HW移位後补1  HW原 0001 0000 >>移位 0010 0000 || 0001 0000 = 0011 0000
                }                                                                        //HW|LW 0011 0000 || 0000 1100 = 0011 1100 ~反相 1100 0011                                                           

                LW = 0x01;                                                        //LW=0000 0001
                HW = 0x80;                                                        //HW=1000 0000
                                                                                                
                for(i=0; i<4; i++)                                                //由於 8个LED, 中间作拉开及向中关闭 所以只需要移动 4次
                {
                        LED = HW|LW        ;                                        //HW|LW = 1000 0000 | 0000 0001 = 1000 0001
                        delayms(250);
                        LW=(LW<<1)|0x01;                                        //LW移位後补1  LW原 0000 0001 >>移位 0000 0010 || 0000 0001 = 0000 0011
                        HW=(HW>>1)|0x80;                                        //HW移位後补1  HW原 1000 0000 >>移位 0100 0000 || 1000 0000 = 1100 0000
                }                                                                        //HW|LW 1100 0000 || 0000 0011 = 1100 0011                                                           
        }
}

广告灯.pdf

54.67 KB, 下载次数: 7

回复

使用道具 举报

ID:844772 发表于 2022-3-29 09:16 | 显示全部楼层
总共八个灯,两种流水方式,第一个函数是两边往中间移动;第二个是从中间往两边移动。
回复

使用道具 举报

ID:1013744 发表于 2022-3-29 23:21 | 显示全部楼层
glinfei 发表于 2022-3-29 09:16
总共八个灯,两种流水方式,第一个函数是两边往中间移动;第二个是从中间往两边移动。

感谢你的回答。
回复

使用道具 举报

ID:1013744 发表于 2022-3-29 23:22 | 显示全部楼层
wxxl 发表于 2022-3-28 21:09
P0=P左移i位后的低四位(&0x0F)+P右移i位后的高四位(0xF0&)

谢谢你的回答
回复

使用道具 举报

ID:1013744 发表于 2022-3-29 23:22 | 显示全部楼层
kscheang 发表于 2022-3-29 01:13
你好, 这个是我的练习, 看看能帮到你吗

/**********************************************

十分感谢你的帮助
回复

使用道具 举报

ID:1011864 发表于 2022-3-30 10:57 | 显示全部楼层
赋值的意思,
把想要赋值的数字移到相应的位
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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