标题: 本人写的单片机左移到头接着右移,右移到头再左移的花样流水灯程序,求大师指点疑问 [打印本页]

作者: zhhdok    时间: 2019-2-9 20:19
标题: 本人写的单片机左移到头接着右移,右移到头再左移的花样流水灯程序,求大师指点疑问
本人纯属自学单片机一下程序是我自己写
写了一个左移到头接着右移,右移到头再左移的花样流水灯程序
以下程序运行完好,但是如果把此句”delay(100);“延时函数放在P1=~(0x01<<k);的后边然后烧到板子上8个led灯从右移动到左第八位全亮,但是从左移动到右就好像哪种电流很小的样子led等很暗很暗,这是为什么?
板子是郭天祥的TX1C
我的程序哪里有错误请高手指点或者还有什么更简洁的方法?

单片机源码如下:
----------------------------------------------------------------------
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint i,j,k,ms,m;//定义变量
void delay(ms)//延时函数
{
for(i=ms;i>0;i--)
    for(j=110;j>0;j--);
}
void main() //主函数
{
    while(1)//死循环
    {

    delay(100);//调用延时函数并赋值100
    P1=~(0x01<<k);//P1口赋初值0x01左移k位
    k++;    //k值自加1
    if(k>=8) //如果左移程序中k值大于等于8则运行右移程序,如果右移程
                //序中的m值大于等于8则k,m值归0.
        {
        P1=~(0x80>>m);
            m++;        
        if(m>=8)
            {
                k=0;
                m=0;
            }
        }
    }
}



作者: xuyaqi    时间: 2019-2-10 10:17
差别在于没改前,每执行一次P1= --- 后都有 delay(100);延时;改了后,P1=~(0x01<<k);后有延时,P1=~(0x80>>m);后就没了延时。
作者: 就你****    时间: 2019-2-10 10:43
自己再调调看,太基础的东西
作者: 熇熇熇    时间: 2019-2-10 17:14
改了之后,当执行过P1=~(0x80>>m);之后,程序回到死循环开始,会执行先P1=~(0x01<<k);这相当于没有进行延时就又把P1口的信号改变了
作者: wulin    时间: 2019-2-11 15:56
//利用循环左移和循环右移函数完成的花样流水灯程序
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//uint i,j,k,ms,m;//定义变量
uchar num;
void delay(uint ms)//延时函数
{
        uint i,j;
        for(i=ms;i>0;i--)
            for(j=110;j>0;j--);
}
void main() //主函数
{
        num=1;
        P1=0xfe;
        delay(500);
        while(1)//死循环
        {       
                if(num==1)
                {
                        P1=_crol_(P1,1);//循环左移
                        delay(500);
                        if(P1==0x7f)
                                num=0;
                }
                else
                {
                        P1=_cror_(P1,1);//循环右移
                        delay(500);
                        if(P1==0xfe)
                                num=1;
                }
        }
}
作者: sheng7533967    时间: 2019-2-12 01:29

当执行过P1=~(0x80>>m);之后,程序回到死循环开始,会执行先P1=~(0x01<<k);这相当于没有进行延时就又把P1口的信号改变了
作者: zhhdok    时间: 2019-2-13 15:58
wulin 发表于 2019-2-11 15:56
//利用循环左移和循环右移函数完成的花样流水灯程序
#include
#include

这个程序比我的要完美,我的那个程序运行一个来回要停顿一小会虽然时间很短但是看着总有些别扭,这个很连续,再弱弱的问一哈#include <intrins.h>这个头文件是干嘛用的
作者: zhhdok    时间: 2019-2-13 15:58
xuyaqi 发表于 2019-2-10 10:17
差别在于没改前,每执行一次P1= --- 后都有 delay(100);延时;改了后,P1=~(0x01m);后就没了延时。

感谢啦
作者: wulin    时间: 2019-2-13 17:56
zhhdok 发表于 2019-2-13 15:58
这个程序比我的要完美,我的那个程序运行一个来回要停顿一小会虽然时间很短但是看着总有些别扭,这个很连 ...

#include <intrins.h>这个头文件包含循环左移和循环右移函数,不用自己写了。
/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
作者: 406443550    时间: 2019-2-14 11:30
这个程序有问题,左移的操作一直在执行,不管你的k>=8的时候;全亮就是因为delay(100)停顿下,让你看到了1左移了9位,那么P1=0了,当然全亮
作者: iofree    时间: 2019-2-16 16:24
zhhdok 发表于 2019-2-13 15:58
这个程序比我的要完美,我的那个程序运行一个来回要停顿一小会虽然时间很短但是看着总有些别扭,这个很连 ...

intrins.h包含几个很有用的KEILC内部函数,有点汇编语言的意思:
_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
_nop_ 空操作 (相当于8051 NOP 指令)
_testbit_ 测试并清零位 (相当于8051 JBC 指令)




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1