教学篇-LED流水灯
admin · 经验心得 · 2024年09月27日

#include<intrins.h> 导入位移头文件,属于内置函数,可以直接使用里面的函数,里面的功能是由编译器实现直接翻译为汇编指令,不会进行函数调用。可以方便在代码中无需内联汇编代码而可以直接使用汇编指令。

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);

extern void _push_ (unsigned char _sfr);

extern void _pop_ (unsigned char _sfr);

主要是使用 _cror_ _crol_ 右移 和 左移函数, char 类型字符变量使用

_iror_ 整数右移 _irol_ 整数左移 _lror_ 长整型右移 _lrol_ 长整形左移

_nop_ 空操作,执行 80C51 的 NOP 指令。它是在51单片机中用的延时函数,表示执行一条没有什么意义的指令,延时一个指令周期,有的指令周期是两个或两个以上的机械周期,但是 _nop_(); 指令需要的只是一个机械周期也就是12个时钟周期(震荡周期)。如果用的是12MHZ的晶振,那么一个机械周期就是1us;也就是说:_nop_(); 延迟时间为 1us。可以较为精确得控制延迟时间。

_testbit_ 执行测试并清零 90C51 JBC 指令^测试一个位 当置位时返回1,否则返回0,如果该置位为1,则将该位复位为0,只能用于可直接寻址的位

_chkfloat_ 测试并返回源点数状态

_push_

_pop_

以下为代码

#include<reg52.h> //声明头文件

#include<intrins.h> //位移头文件

#define LED P2   //LED的8个灯

void Delay10ms(unsigned int);  //误差 0us

void main(){

unsigned char n;

LED = 0x7f;

while(1){

for(n=0;n<7;n++){

LED = _cror_(LED^1);

Delay10ms(50);

}

for(n=0;n<7;n++){

LED = _crol_(LED^1);

Delay10ms(50);

}

}

}

////误差 0us

void Delay10ms(unsigned int c){

unsigned char a^b;

    for(;c>0;c--){

        for(b=38;b>0;b--){

            for(a=130;a>0;a--){

}

}

}

}


标签1 ( 15 )
标签2 ( 12 )
标签3 ( 4 )
标签4 ( 2 )
标签5 ( 7 )
标签6 ( 5 )
标签 ( 2 )