用单片机控制8个发光二极管依次发光,产生跑马灯的效果,3种效果循环,要求通过按钮切换效果!

作者&投稿:蒲秀 (若有异议请与网页底部的电邮联系)
通过AT89C51单片机控制8个发光二极管发光 5种效果循环,要求通过按钮切换效果 汇编语言~

A_BUFF EQU 0X1F
FLAGEQU 0X1E
CNT EQU 0X1D;闪烁模式计数
TEMPEQU 0X1A;临时变量,用完即放
T24EQU 0X19
T16EQU 0X18
T2EQU 0X17;2中断计数
T4EQU 0X16;4中断计数
T100EQU 0X15;100中断计数
T20EQU 0X14;20中断计数
T200EQU 0X13;200中断计数
CNT5EQU 0X12;旋转5状态计数

KEY_1ST== FLAG.0;第一次按下标志位
T1F== FLAG.1;1中断标志位,1中断置反一次
T2F== FLAG.2;2中断标志位
L2F== FLAG.3;LIGHT2中断标志位
T20F== FLAG.4;20中断标志位
L8F== FLAG.5;LIGHT8中断标志位
DISF== FLAG.6;该位置1时再执行显示
KEY== 0X06.3


ORG 0X00
JMP INIT

ORG 0X08
JMP INTERRUPT

ORG 0X10
TAB_MODE:
ADD PC,A
NOP
NOP
CALL LIGHT8
RET
CALL LIGHT7
RET
CALL LIGHT6
RET
CALL LIGHT5
RET
CALL LIGHT4
RET
CALL LIGHT3
RET
CALL LIGHT2
RET
CALL LIGHT1
RET

TAB_ROT:
ADD PC,A
NOP
RETL @0X09
RETL @0X0A
RETL @0X0C
RETL @0X18
RETL @0X28

TAB_CROSS:
ADD PC,A
NOP
RETL @0X1D
RETL @0X3A
RETL @0X2D
RETL @0X1B
RETL @0X2E

LIGHT1:
JBC T20F
JMP L1_1
MOV A,@0X08
MOV P6,A
RET
L1_1:
MOV A,@0XFF
MOV P6,A
RET

LIGHT2:
JBC L2F
JMP L2_1
MOV A,@0X08
MOV P6,A
RET
L2_1:
JBC T2F
JMP L2_T2F1
MOV A,@0X08
MOV P6,A
RET
L2_T2F1:
MOV A,@0XFF
MOV P6,A
RET
LIGHT3:
JBC T20F
JMP L3_1
MOV A,@0X08
MOV P6,A
RET
L3_1:
JBC T2F
JMP L3_T2F1
MOV A,@0X08
MOV P6,A
RET
L3_T2F1:
MOV A,@0XFF
MOV P6,A
RET

LIGHT4:
JBC T20F
JMP L4_1
MOV A,@0X08
MOV P6,A
RET
L4_1:
JBC T1F
JMP L4_T1F1
MOV A,@0X08
MOV P6,A
RET
L4_T1F1:
MOV A,@0XFF
MOV P6,A
RET

LIGHT5:
MOV A,@0XFF
MOV P6,A
RET

LIGHT6:
MOV A,CNT5
CALL TAB_ROT
MOV P6,A
RET

LIGHT7:
MOV A,CNT5
CALL TAB_CROSS
MOV P6,A
RET

LIGHT8:
JBC L8F
JMP L8_1
CALL LIGHT6
RET
L8_1:
CALL LIGHT3
RET

FLAG_INIT:
MOV A,@2
MOV T2,A
MOV A,@4
MOV T4,A
MOV A,@100
MOV T100,A
MOV A,@20
MOV T20,A
MOV A,@200
MOV T200,A
MOV A,@24
MOV T24,A
MOV A,@16
MOV T16,A
MOV A,@5
MOV CNT5,A
BS T1F
BS T2F
BS L2F
BS T20F
BC L8F
RET

INIT:
MOV A,@0X08
IOW IOC6;定义63脚为输入,其它全部为输出
MOV A,@0X08
MOV R6,A;端口初始化
MOV A,@0X05
CONTW;预分频1:64
MOV A,@0X01
IOW IOCF

BC KEY_1ST
BS DISF
MOV A,@8
MOV CNT,A
CALL FLAG_INIT;标志位初始化

MOV A,@61
MOV TCC,A
ENI

MAIN:
JBS DISF
JMP MAIN
BC DISF
MOV P6,P6
JBC KEY
JMP MAIN_KEY1
MOV A,@0X08
MOV P6,A
JMP MAIN
MAIN_KEY1:
MOV A,CNT
ADD A,CNT
CALL TAB_MODE
JMP MAIN

INTERRUPT:;25ms
MOV A_BUFF,A
MOV A,@61
MOV TCC,A
CLR RF
BS DISF

MOV P6,P6
JBC KEY
JMP FL_KEY1
JBC KEY_1ST
JMP FL_KEY_1ST1
BS KEY_1ST
JMP T1F_COM
FL_KEY_1ST1:
MOV A,@0X08
MOV P6,A
JMP T1F_COM

FL_KEY1:
JBC KEY_1ST
JMP FL_KEY_1ST11
JMP T1F_COM;非第一次释放
FL_KEY_1ST11:;第一次释放
BC KEY_1ST
CALL FLAG_INIT
DJZ CNT;切换一个状态
JMP T1F_COM
MOV A,@8
MOV CNT,A

T1F_COM:;25ms标志位置反
JBC T1F
JMP T1F_1
BS T1F
JMP L2F_COM
T1F_1:
BC T1F

L2F_COM:
JBC L2F
JMP L2F_1
DJZ T16
JMP T2F_COM
MOV A,@16;
MOV T16,A
BS L2F
L2F_1:
DJZ T24
JMP T2F_COM
MOV A,@24
MOV T24,A
BC L2F

T2F_COM:;50ms标志位置反
DJZ T2
JMP T4F_COM
MOV A,@2
MOV T2,A
JBC T2F
JMP T2F_1
BS T2F
JMP T4F_COM
T2F_1:
BC T2F

T4F_COM:;100ms
DJZ T4
JMP T20F_COM
MOV A,@4
MOV T4,A
DJZ CNT5;旋转5状态计数
JMP T20F_COM
MOV A,@5
MOV CNT5,A

T20F_COM:;500ms标志位置反
DJZ T20
JMP L8F_COM
MOV A,@20
MOV T20,A
JBC T20F
JMP T20F_1
BS T20F
JMP L8F_COM
T20F_1:
BC T20F

L8F_COM:;25*250ms标志位置反
JBC L8F
JMP L8F_1
DJZ T100
JMP INTRET
MOV A,@100
MOV T100,A
BS L8F
L8F_1:
DJZ T200
JMP INTRET
MOV A,@200
MOV T200,A
BC L8F

INTRET:
MOV A,A_BUFF
RETI

END

CLR
P1
没有这种操作
CLR只能对位变量进行操作
你想对P1口全部清除的话,改为:MOV
P1,#0
同样
MOV
P2,#0
程序最末端处,应加上END
DJNZ
R2,L1
DJNZ
R4,L3
RET
END
;告诉编译器,程序结束
时间太晚了,至于程序功能是否正确,就看不了了。汇编别人看起来费力,而且你一个字的注释都没有,这不是好习惯。

这个程序的关键点是要在显示子程序执行的过程中,多对按键进行检测。检测到有按键按下时,即退出子程序,返回到主函数的按键检测,对num
加一。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^5;
uchar temp;
uchar num;

void delay(uint z)//延时程序
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void display0()//显示效果1
{
uchar i;
temp=0xfe;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0x7f;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_cror_(temp,1);
delay(50);
}

}
void display1()//显示效果2
{
uchar i;
temp=0xf8;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0x1f;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_cror_(temp,1);
delay(50);
}
}
void display2()//显示效果3
{
uchar i;
temp=0x99;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0xcc;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_cror_(temp,1);
delay(50);
}
}

void anjian()
{
if(key1==0)//按键检测
{
delay(5);//按键消抖延时
if(key1==0)
{
num++;
if(num==3) num=0;
}
while(!key1);
}
}

void main()
{
while(1)
{
anjian();//按键检测并赋num值
switch(num)
{
case 0:display0();break;
case 1:display1();break;
case 2:display2();break;
}
}

}

提供个思路,8个led接单片机P0口,按键接P1口,定义一个临时变量,按键一次加1,加到2以后清零,主循环监测这个变量,0 1 2三种状态去点亮8个led,可以是1~8点亮,也可以是8~1点亮,或者1 3 5 7点亮然后2 4 6 8点亮。

单片机类型有要求吗?

你有什么问题要解决啊?
还是要别人帮你做整个设计啊?


用c语言编写单片机流水灯程序,(8个发光二极管从左至右循环点亮)_百度...
P3=0xfe;\/\/第一个灯亮 delay();\/\/延时 P3=0xfd;\/\/第二个灯亮 delay();P3=0xfb;\/\/第三个灯亮 delay();P3=0xf7;\/\/第四个灯亮 delay();P3=0xef;\/\/第五个灯亮 delay();P3=0xdf;\/\/第六个灯亮 delay();P3=0xbf;\/\/第七个灯亮 delay();P3=0x7f;\/\/第八个灯亮 delay();}...

用五一单片机c语言编程,p1口控制八个发光二极管,实现每隔一秒,两两点亮...
一、#include<reg51.h> void delay(unsigned char Xms)\/\/延时Xms { int i,j;for(X = i; X>0; X--)for(j=110;j>0;j--);} void main(){ P0 = 0x00; \/\/P0.0~P0.7分别接八个发光二极管,刚开始全灭 while(1){ delay(1000);P0 = 0xc0;\/\/点亮前两个发光二极管P0.0和P...

求单片机设计8个led灯同时闪烁,并且led灯亮的时候控制蜂鸣器发生,led...
ORG 0 CALL PRG1 ; 亮且发音 CALL PRG2 ; 灭且静音 SJMP 0 ;--- PRG1:MOV P0, #0 ; 8个led灯亮 MOV R2, #200 LP1:CPL P1.0 ; 蜂鸣器响 DJNZ R6,DJNZ R7, $ - 2 DJNZ R2, LP1 MOV P0, #255 ; 8个led灯灭 RET ;--- PRG2:MOV P0, #255 ;...

...P1.0接按键k1,P1.1接按键k2,P0口的8位接8个发光二极管
汇编程序如下:; 花样流水灯(8个发光二极管以各种形式循环点亮); 功能:流水灯(8个发光二极管循环以1S间隔以各种形式循环点亮)ORG H ;伪指令,指定程序从H开始存放 LJMP MAIN ;跳转指令,程序跳转至MAIN处执行 ORG H ;伪指令,指定程序从H开始存放 MAIN: MO SP, #60H ;给堆栈...

通过AT89C51单片机控制8个发光二极管发光,实现暗点以1HZ频率由低位到高 ...
1HZ就是1秒,AT89C51,你硬件连接的时候把8个发光二极管放在P2口上,晶振用11.0592M的。include <reg52.h> int ms,tag;void delay_ms(unsigned int ms_number) \/\/ms_number=500,延时1秒 { unsigned int i;unsigned char j;unsigned char ;for(i=0;i<ms;i++){ for(j=0;j<200;j++...

通过AT89C51单片机控制8个发光二极管发光,实现暗点以1HZ频率由低位到高 ...
用一个端口可以控制多路的话 可以采用 74HC4094这个芯片 ,具体实现的代码驱动程序为 void vWrite74HC4094(void){ static UCHAR temp1,temp2;if((temp1!=Plcddata1.ITEM.RAMC)||(temp2!=Plcddata2.ITEM.RAMC)){ temp1=Plcddata1.ITEM.RAMC;temp2=Plcddata2.ITEM.RAMC;Plcddata3.ITEM.RAM...

单片机用8051p1口连接8个发光二极管,让8个发光二极管循环点亮
include<reg51.h> unsigned char c=0;unsigned char xxx[10]={0Xfe, 0Xfc ,0Xf8,0Xf0, 0Xe0, 0Xc0, 0X80,0X00,0XFF};int i;main(){ while(1){ c++;if(c>8)c=0;P1=xxx[c];for(i=0;i<55550;i++);} }

用51单片机控制八个发光二极管
\/\/ 51单片机控制八个发光二极管 左右循环。include<reg52.h> define uchar unsigned char define uint unsigned int unsigned char TAB[]= {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff}; \/\/ 改变这里 LED 各种花样 uchar t...

用51单片机写程序,4个按键灯控制8个彩灯切换九种灯光效果?
P1口接8个LED灯,P3口接4个按键K1~K4,用于控制流水灯的四种效果,仿真图如下。

编程题 硬件电路中由8051单片机P1口控制8个放光二极管,编程实现依次...
首先搞清LED管是高电平导通还是低电平导通。如果是低电平导通,P1赋0x00时,发光管全亮,0xff时,全灭。具体程序:define uint unsigned int define uchar unsigned char void delay(uint time_out){ uint i,j;for(i=0;i<time_out;i++){ for(j=0;j<110;j++){;} } } void main(){...

汉源县15667495986: 用单片机控制8个发光二极管依次发光,产生跑马灯的效果,3种效果循环,要求通过按钮切换效果! -
度泼痛克: 这个程序的关键点是要在显示子程序执行的过程中,多对按键进行检测.检测到有按键按下时,即退出子程序,返回到主函数的按键检测,对num 加一. #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned ...

汉源县15667495986: 用单片机编写一段程序,使下面八个发光二极管从左到右间隔一定时间,依次亮一边(有图) -
度泼痛克: 从图上看只要让P0口的各引脚依次置0,则可满足要求. 汇编程序如下:MOV P0,#0FEH X11:LCALL DELAYMOV A,P0RL AMOV P0,ASJMP X11

汉源县15667495986: 求单片机c51用汇编语言写的程序,功能为:8只发光二极管依次点亮,从左向右移动,时间间隔2秒 -
度泼痛克: 51单片机汇编语言编程,5261流水灯如P1口8个Ⅰ4102/O依次输出低电平点亮发光二极管,思路可以1653用定时器中断+计数来定时,可以用位移输出或者用状态表(查表版法)输出,如表01111111、10111111、---、11111110,就是查表取状态字节权再写入P1口.

汉源县15667495986: 单片机外部中断程序,8个二极管依次点亮—— - 急急急 -
度泼痛克: 把各个花样写在子函数,中断中对变量加1,在判断是否大于5,大于5就对变量清零.因为你要5种花样.主函数判断变量的值,1时执行从左到右依次点亮,2时执行从左到右逐个依次熄灭.依次下去

汉源县15667495986: 单片机控制8个发光二极管从左到右间隔1s依次点亮,当最右边发光二极管亮1s后,又从右到左间隔1s依次点... -
度泼痛克: mov a, #01h mov r2, #8 Output: mov P1, a rl a call Delay djnz r2, Output Delay: 类似这样,由于字数限制,你可以上网搜一下.

汉源县15667495986: 各位单片机达人帮个忙 用汇编语言做一个 发光二极管循环点亮的程序 要求 使八只发光二极管做循环点亮一次 -
度泼痛克: ORG 00HJMP MAINORG 30H MAIN: MOV A,#0FFH ;设置左移初值CLR C ;C=0MOV R2,#08H ;设置左移次数 LOOP: RLC A ;左移1位MOV P1,A ;输出到P1CALL DELAY ;延时DJNZ R2,LOOP ;左移7次MOV R2,#07H ; LOOP1: ...

汉源县15667495986: 编写一个51单片机程序实现八个发光二极管交叉点亮,即D1、D3、D5、D7亮,其他不亮,直到电源关 -
度泼痛克: pre t="code" l="cpp"> ORG 0000H MOV END 即可; P1, #01010101B SJMP $

汉源县15667495986: 利用AT89C51单片机结合8个发光二极管L0~L7,要求每间隔0.5秒依次点亮一盏 -
度泼痛克: 假设高电平点亮LED,LED接在P0口,主要程序语句如下: uchar c=0; uchar i; while(c<3) { for(i=0;i<8;i++} { P0=1<<i; DELAY_MS(500); } c++; } P0=0X00;

汉源县15667495986: 单片机编程:8个发光二极管高电位点亮,按下K1低点位,二极管交替闪亮,急求,求编完!谢谢了 -
度泼痛克: MOV P0,#55H S0: SETB P1.3 JB P1.3,$ XRL P0,#0FFH CALL DELAY AJMP S0 DELAY: MOV R6,#0 MOV R7,#0 DJNZ R7,$ DJNZ R6,$-4 RET END

汉源县15667495986: 我想用单片机的一个按键控制8个发光二极管的发光样式,要三种样式,样式都要是循环的,用C语言来编写, -
度泼痛克: 第一种方法:使用扫描的方法,一个大循环:先读按键状态,然后根据读出来的按键状态输出电平去控制LED 第二种方法:主函数是一个大循环,根据读出来的按键状态输出电平去控制LED.按键状态在中断程序里进行扫描.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网