#include <reg52.h>//特殊功能的寄存器的头文件 sbit LED0 =P0^0;//LED灯的点亮 sbit LED1 =P0^1; sbit LED2 =P0^2; sbit LED3 =P0^3; sbit LED4 =P0^4; sbit LED5 =P0^5; sbit LED6 =P0^6; sbit LED7 =P0^7; sbit ADDR0 =P1^0;//138的A0口 sbit ADDR1 =P1^1;//138的A1口 sbit ADDR2 =P1^2;//138的A2口 sbit ADDR3 =P1^3;// sbit ENLEAD =P1^4;// void Delay(int i) { while(i--); } int main () { ADDR3 = 1; ENLEAD = 0; /*位定义*/ //while(1) // { // LED0=0; // Delay(50000); // LED0=1; // LED1=0; // Delay(50000); // LED1=1; // LED2=0; // Delay(50000); // LED2=1; // LED3=0; // Delay(50000); // LED3=1; // LED4=0; // Delay(50000); // LED4=1; // LED5=0; // Delay(50000); // LED5=1; // LED6=0; // Delay(50000); // LED6=1; // LED7=0; // Delay(50000); // LED7=1; // Delay(50000); // } /*左移右移*/ while(1) { int j; int g; P0=0Xfe; for(j=0;j<7;j++) { P0=P0<<1; Delay(50000); } for(g=0;g<7;g++) { P0=P0>>1; Delay(50000); } } } 仅供参考 |
流水灯程序,供参考 #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar a,b,c,d,e,f,g; void delay(uchar Nms){ uchar i; while(Nms--){ for(i=0;i<120;i++){;} } } void main() { a=0xff; b=0x55; c=0xfe; d=0x7f; for(e=0;e<5;e++){b=~b;delay(250);P0=b;} P0=a;delay(250); for(f=0;f<8;f++){P0=c;c=_crol_(c,1);delay(250);} P0=a;delay(250); for(g=0;g<8;g++){P0=d;d=_cror_(d,1); delay(250); } } |
这个左移是后面自动补0,你可以定义一个变量移位然后对它取反,或者直接用—crol—(i,1)进行向左移位 |
名字不是重点 发表于 2021-7-17 20:31 好的,谢谢大哥 |
lkc8210 发表于 2021-7-17 22:16 好的,谢谢。 |
地狱火 发表于 2021-7-17 20:25 P0=(P0<<1)&0x01; 或 P0=~(0x01<<i); |
本帖最后由 名字不是重点 于 2021-7-17 20:33 编辑 用这个:_cror_ 指令,这个是带“C”标志移位的。简单地说是就环形移位,省去补“1”的动作 |
名字不是重点 发表于 2021-7-17 20:10 请问要补1的话应该怎么补 |
名字不是重点 发表于 2021-7-17 20:10 是不是就像,0xFE(1111 1110)往左移变成了 1111 1100,所以才不会熄灭。 |
P0=(0XFE<<i) 这个代码是没有补位的。当左移一位后,最低位补进的是“0” ,所以你要作补“1”处理 |
名字不是重点 发表于 2021-7-17 20:07 好的,谢谢 |
名字不是重点 发表于 2021-7-17 20:05 好的,谢谢。 |
代码有问题,你可以学着单步执行跟踪一下,问题就出来了。 |
16灯的程序,给你一个参考: #include <reg51.h> #include <stdio.h> #include <intrins.h> unsigned char i,dir; unsigned int led16; void delay(unsigned int t) { while(t--); } void flash_mode1() { if (dir) led16=0x7fff; else led16=0xfffe; for (i=0;i<16;i++) { P0=led16 & 0x00ff; P2=led16 >>8; delay(5000); if(dir) led16=_iror_(led16,1); else led16=_irol_(led16,1); } dir=~dir; } void main(void) { while (1) { flash_mode1() ; } } |
请各位大佬指教 |