51单片机的c语言 左移右移怎么用?想用来控制流水灯,请帮忙写个完整的c程序,参考下,端口随意

51单片机的c语言 左移右移怎么用?想用来控制流水灯,请帮忙写个完整的c程序,参考下,端口随意,第1张

# include "reg51h" // 包含头文件

#define uchar unsigned char

void delay02s(void) // 延时02s子程序

{

unsigned char i,j,k;

for ( i=2;i>0;i-- )

for (j=200;j>0;j-- )

for (k=250;k>0;k-- );

}

void main (void) // 主函数

{

uchar i,j;

while (1) // 死循环

{

j=0x01; // j初始化为0x01,左移初始值

for(i=0;i<8;i++) // for循环语句,完成8个循环

{

P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出

delay02s( ); // 延时02s

j= j<<1; // 左移1位

}

j=0x80; // 设置右移初始值j为0x80

for (i=0;i<8;i++)

{

P1= ~ j;

delay02s( );

j= j>>1; // 右移1位

}

}

}

#include <reg52h>

#include <intrinsh>

sbit LED7 = P1^7;

sbit LED0 = P1^0;

#define N 1000

//-------------------------------------------------------

//延时Z个ms

//-------------------------------------------------------

void delay(unsigned int z)

{

unsigned int x,y;

for(x = z; x > 0; x--)

for(y = 120; y > 0 ; y--);

}

void main()

{ unsigned int i,j;

while(1)

{

P1 = 0xfc;

for(i=0;i<8;i++) //循环左移

{

P1 =_crol_(P1,2);

delay(N);

}

for(i=0;i<8;i++) //循环右移

{

P1 =_cror_(P1,2);

delay(N);

}

for(i=1;i<=10;i++) //奇、偶交替闪烁10次

{

P1 = 0xaa; //奇数0xaa

delay(N);

P1 = 0x55; //偶数0x55

delay(N);

}

for(j=0;j<8;j++) // 循环左移

{ P1 = 0xfe;

P1 =_crol_(P1,1);

delay(N);

}

for(i=0;i<8;i++) //循环右移

{ P1 = 0x7f;

P1 =_cror_(P1,2);

delay(N);

}

}

}

外部中断,是需要用开关来触发的。

----

你的延时函数,写的有毛病。

编译,根本不过去。

改好后,程序就正常了,可以进入中断。

#include <reg52h>

#include <intrinsh> //启用 循环左移(_crol_),循环右移(_cror_)函数

#define uint unsigned int

#define uchar unsigned char

sbit d1=P1^0; //

char i,m,n,temp,k; //

uchar code table[] = {

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xa7,0xa1,0x06,0x8e};

//定义共阳极数码管

void delay(int x) //延时函数

{

uchar i;

while(x--) for(i=0;i<110;i++);

}

void main() //主函数

{

EA=1;

EX0=1;

IT0=0;

while(1) {

for(i=0;i<16;i++) {

P0=table[i]; //数码管显示

delay(500);

}

}

}

void my_int0() interrupt 0 //中断函数

{

temp=0xfe; //定义temp 1111 1110 即 P10 低电平

P1=temp; //让第一个灯点亮

for(k=0;k<3;k++) { //循环3次

for(m=0;m<7;m++) { //左移7次

delay(500);

temp=_crol_(temp,1); //库函数里面的循环左移函数,将temp的值左移一位后重新赋给temp

P1=temp; //将左移一位后的temp值送P1口显示

}

for(n=0;n<7;n++) { //右移7次

delay(500);

temp=_cror_(temp,1); //库函数里面的循环右移函数,将temp的值左移一位后重新赋给temp

P1=temp;

}

}

delay(200);

d1=1; //P10 高电平

}

哥,您看看您的程序,if(P0 == 0x7f)满足也就是说左移循环完成了之后,你就让它右移一位,接下来,延时函数过后戒指break跳出了while循环,而且这个流水灯来回循环也不是这样写的,就算你不用break跳出,等下一次while循环来的时候又是先左移一位,然后又满足if判断,又右移,然后就这么一直左移,,右移

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

/ 延时函数 /

delay(uint i){while(i--);}

/ 数码管显示子程序开始 /

sbit wr=P2^2;sbit cs1=P2^0;sbit cs2=P2^1;

#define LEDdata P0

uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar buf[8]={7,6,5,4,3,2,1,0}; //显示缓存

display(){

uchar i,j=0x7f;

for(i=0;i<8;i++){

cs1=0;cs2=1; //选中段码锁存IC U3

LEDdata=LEDcode[buf[i]];wr=1;wr=0; //送段码

cs1=1;cs2=0; //选中位选锁存IC U2

LEDdata=j;wr=1;wr=0; //送位选

delay(100); //延时

j=_cror_(j,1); //位选移位

cs1=cs2=0; //选中U2,U3,准备关显示

LEDdata=0xff;wr=1;wr=0; //送0xff,关显示

}

}

/ 数码管显示子程序结束 /

main(){

uchar i,temp,count=0;

while(1){

display(); //显示测试

if(++count==50){

count=0;

temp=buf[0];

for(i=0;i<7;i++)buf[i]=buf[i+1];

buf[7]=temp;

}

}

}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12461689.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存