如果你的点灯是低电平 那么编码如下:0x7e,0xbd,0xdb,0xe7;这四个编码实现从两边向中间流0xdb,0xbd,0x7e;由上面的四个编码加上下面的四个编码就达到了从中间向两边显示的效果了循环显示这七个编码就OK
include
;左移 LOOP1:MOV R7,#8 MOV A ,#01 RL A MOV P1,A CALL DELAY DJNZ R7,LOOP1 ;全亮 MOV P1,#0FFH CALL DELAY ;右移 LOOP2:MOV R7,#8 MOV A ,#01 RR A MOV P1
;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时60秒 LCALL DELAY ;延时60秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY ;延时60秒
1、先从右到左逐个亮灭,再从左到右逐个亮灭。2、由两侧向中间,再中间向两侧亮灭。3、先右再左逐个亮起,不熄灭;再从左到右逐个熄灭。4、先左再右逐个亮起,不熄灭再从右到左逐个熄灭。
;用汇编语言编程如下:.ORG 0000H MOV A, #7FH MOV R2, #7 L: JNB F0, R RL A JMP O R: RR A O: MOV P1, A CALL DL_500ms ;延时500ms DJNZ R2, L MOV R2,
求五颗灯依次亮、两头往中间亮、先向右亮后再向左亮的流水灯程序?
MAIN:MOV DPTR,#TAB MOV R2,#4 LOOP:CLR A MOV A,@A+DPTR MOV P0,A INC DPTR LCALL DELAY DJNZ R2,LOOP SJMP MAIN DELAY:MOV R3,#200 DELAY1:MOV R4,#250 DJNZ R4,DJNZ R3,DELAY1 RET TAB:DB 7EH,0BD
如果你的点灯是低电平 那么编码如下:0x7e,0xbd,0xdb,0xe7;这四个编码实现从两边向中间流 0xdb,0xbd,0x7e;由上面的四个编码加上下面的四个编码就达到了从中间向两边显示的效果了 循环显示这七个编码就OK
DB 07EH 03CH 018H 000H 000H 018H 03CH 07EH ;两边叠加后递减 DB 000H ;全亮 END ;程序结束指令 C语言程序如下:/* 该实验是花样流水灯(8个发光二极管以各种方式循环点亮),功能是花样流水灯(8个发光二极管
include
单片机流水灯由两边向中间流再由中间向两边流的汇编语言怎么写?
可以用一个数组存放LED灯的状态,在定时器里面为LED赋值数组里面的值就行 例如 LED_arr[10]= {0x81,0x42,0x24,0x18,0x24,0x42,0x81};LED = LED_arr[pos++];
一个灯从上往中间轮流点亮,另一个灯从下往中间轮流点亮,循环间隔约1秒。4、采用ROR、ROL循环移位语句(p77)及 LOOP语句(p81),实现一个灯从第1个循环点亮到第8个,从第8个循环点亮至第1个,一直上下循环。
0xff,0xe7,0xc3,0x81,0x00,//中间开始逐渐点亮 0xff,0x7e,0x3c,0x18,0x00//两边开始逐渐点亮 } void delay(int ms){ uchar i;while(ms--)for(i=0;i<120;i++);} main(){ uchar i;while(1){ for(
如果只用一个端口的话,你可以建一个表,如果LED是高电平点亮的话,里面存放数据0x81,0x42,0x24,0x18 如果LED是低电平点亮的话,里面存放数据 0x7e,0xbd,0xdb,0xe7 然后在循环里一直按照数组下标0到3递增3到0递减将
如果你的点灯是低电平 那么编码如下:0x7e,0xbd,0xdb,0xe7;这四个编码实现从两边向中间流 0xdb,0xbd,0x7e;由上面的四个编码加上下面的四个编码就达到了从中间向两边显示的效果了 循环显示这七个编码就OK
while(P1!=0xff); //等待按键释放,源程序有点错误需要加分号;return Key_NO;}
MAIN: MOV SP, #60H ;给堆栈指针赋初值 MOV P1,#0FFH ;给P1口赋值 MOV DPTR,#TABLE;查表 LIGHT: MOV R4,#42 ;设置循环次数 LOOP: MOV A,#42 ;给A赋初值 SUBB A,R4 ;将A的值与R4的值
单片机流水灯用汇编语言写怎么从两边向中间亮再从中间
答疑解难 跑马灯程序 ORG 0000H LJMP MAIN ORG 0100H MAIN: JB P0.7,MAIN ;等待开始键按下 LCALL YS ;按键延时 JB P0.7,MAIN MOV A,#7FH ;是开始键按下 则跑马灯开始
程序1:ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV SP,#5FH LOOP:MOV A,P2 MOV B,A MOV P0,A MOV P1,#0FFH LOOP1:LCALL DELAY MOV C,P1.7 MOV A,P0 RLC A MOV P0,A MOV A,P1 RLC A MOV P1,A MOV
ORG 0000H MAIN:MOV A,#0FEH MOV R2,#8 LP1: ;左移 MOV P0,A RL A LCALL DELAY DJNZ R2,LP1 MOV R2,#8 LP2: ;右移 MOV P0,A RR A LCALL DELAY DJNZ R2,LP2 MOV R2,#8 LP3: ;闪烁右移
LJMP MAIN ORG 0030H MAIN:MOV DPTR,#TAB MOV R2,#4 LOOP:CLR A MOV A,@A+DPTR MOV P0,A INC DPTR LCALL DELAY DJNZ R2,LOOP SJMP MAIN DELAY:MOV R3,#200 DELAY1:MOV R4,#250 DJNZ R4,DJNZ R3,DELAY1
两边往中间的跑马灯汇编语言程序
这个简单,采用带进位移位指令就可以实现,假如是高有效,程序如下。 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV A,#01H MOV P1,#01H MOV P2,#00H MOV P3,#00H MOV R2,A MOV R3,#00H MOV R4,#00H LOOP: MOV P1,R2 MOV P2,R3 MOV P3,R4 LCALL DELAY CLR C MOV A,R2 RLC A MOV R2,A MOV A,R3 RLC A MOV R3,A MOV A,R4 RLC A MOV R4,A MOV A,R2 MOV ACC.0,C MOV R2,A LJM,P LOOP DELAY: MOV R5,#200 DLY1: MOV R6,#250 DJNZ R6,$ DJNZ R5,DLY1 RET END跑马灯程序用汇编是很好实现的,只要用好循环移位指令就可以,以下是程序。 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV A,#0FEH LOOP: MOV P1,A ;将控制字送端口 RL A ;控制字循环左移 LCALL DELAY ;延时 SJMP LOOP DELAY: ;延时大概1秒 MOV R2,#10 DLY1: MOV R3,#200 DLY2: MOV R4,#250 DJNZ R4,$ DJNZ R3,DLY2 DJNZ R2,DLY1 RET END
#include #define uchar unsigned char #define uint unsigned int uchar TS_Count,TM_Count,TH_Count,count_N; sbit LED_H=P3^0; sbit LED_M=P3^1; sbit LED_S=P3^2; void DelayMS(uint x) //延时函数 { uchar t; while(x--) { for(t=120;t>0;t--); } } void dis_time(uchar H_t,uchar M_t,uchar S_t) { uchar i; uchar code DSY_CODE[]= { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf, }; //定义数码管显示0~9的控制码 uchar code PS_CODE[]={0x01,0x02,0x04,0x08,0x010,0x20,0x40,0x80}; //这是数码管第n位的控制码 //以下几行是给每一个要显示的数码管赋值 uchar dis_bit[8]; dis_bit[0]=H_t/10%10; //千位 dis_bit[1]=H_t%10; //百位 dis_bit[2]=10; //十位 dis_bit[3]=M_t/10%10; dis_bit[4]=M_t%10; //千位 dis_bit[5]=10; //百位 dis_bit[6]=S_t/10%10; //十位 dis_bit[7]=S_t%10; for(i=0;i<8;i++) { P2=PS_CODE[i]; //第i个数码管的位控制字 P0=DSY_CODE[dis_bit[i]]; //第i个数码管的段码控制字 DelayMS(5); //延时5毫秒。 } } void disp_mode(uchar mode_1) //这个函数控制三个LED灯 { switch(mode_1) { case 0: //模式0,全灭 LED_H=1; LED_M=1; LED_S=1; TR0 = 1; break; case 1: //模式1,LED_S亮 LED_H=1; LED_M=1; LED_S=0; TR0 = 0; break; case 2: //模式2,LED_M亮 LED_H=1; LED_M=0; LED_S=1; TR0 = 0; break; case 3: //模式3,LED_H亮 LED_H=0; LED_M=1; LED_S=1; TR0 = 0; break; } } uchar Key_code() //这个函数检测按键 { uchar Key_NO; if(P1==0xfe) //P1.0按键返回键值0 {Key_NO=0;} if(P1==0xfd) //P1.1按键返回键值1 {Key_NO=1;} if(P1==0xfb) //P1.2按键返回键值2 {Key_NO=2;} while(P1!=0xff); //等待按键释放,源程序有点错误需要加分号; return Key_NO; } void main() {uchar y=-1; uchar mode_N=0; TMOD=0X00; //定义定时器工作在模式0,13位定时器模式 TH0=(8192-5000)/32; //赋初值 TL0=(8192-5000)%32; IE=0X82; //开启定时器中断和总中断 TR0=1; //启动定时器 while(1) { if(P1!=0xff) //等待按键,如果有按键按下,获取键值 y=Key_code(); //获取键值 switch(y) { case 0: //第一个按键按下 mode_N++; //模式控制变量加1 if( mode_N>3) mode_N=0; break; case 1: //第二个按键按下控制数据加 switch( mode_N) { case 1:if(TS_Count<59) TS_Count++; break; case 2:if(TM_Count<59) TM_Count++; break; case 3:if(TH_Count<23) TH_Count++; break; } break; case 2: //第三个按键按下,控制数据减 switch( mode_N) { case 1:if(TS_Count>0) TS_Count--; break; case 2:if(TM_Count>0) TM_Count--; break; case 3:if(TH_Count>0) TH_Count--; break; } break; } y=-1; disp_mode(mode_N); dis_time(TS_Count,TM_Count,TH_Count); //dis_time(25,26,27); } } void LED_Flash()interrupt 1 //中断服务程序,定时用。 { TH0=(8192-5000)/32; TL0=(8192-5000)%32; if(++count_N>5) {if(++TS_Count==60) { TS_Count = 0; if(++TM_Count==60) { TM_Count = 0; if(++TH_Count==24) TH_Count = 0; } } count_N=0; } }
ORG 0000HLJMP MAINORG 0030HMAIN: MOV 30H,#7EH MOV 31H,#0BDH MOV 32H,#0DBH MOV 33H,#0E7H MOV R0,#30H MOV R2,#4LOOP: MOV A,@R0 MOV P1,A LCALL DELAY INC R0 DJNZ R2,LOOP MOV R2,#4LOOP1: DEC R0 MOV A,@R0 MOV P1,A LCALL DELAY DJNZ R2,LOOP1 MOV R2,#4 SJMP LOOPDELAY: MOV R3,#200DLY: MOV R4,#250 DJNZ R4,$ DJNZ R3,DLY RET END
嘿嘿 这个俺会 有加分吗? 可以将让流水灯由两边向中间亮的代码即0FFH、 07EH、 0BDH、 0DBH、 0E7H五个代码 连续存放到片内数据存储器中,然后循环每隔一定的时间,将它们分别取出 送给单片机I/O口 (即控制小灯进行由两边向中间亮的流水控制) 呵呵 满意就个满意回答吧
KEYR EQU P1.0//改下端口 忘记 p3口 是低还是高了KEYL EQU P1.1LED EQU P0ORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN: MOV TMOD,#01H MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB ET0 SETB EA MOV A,#0FEH MOV LED,A MOV R2,#0 CLR 00HLOOP: CLR TR0LOOPL: JB KEYL,LOOPR SETB TR0 RL A MOV LED,A JNB 00H,$ CLR 00H SJMP LOOPLLOOPR: JB KEYR,LOOP SETB TR0 RR A MOV LED,A JNB 00H,$ CLR 00H SJMP LOOPRT0ISR: CLR TR0 MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB TR0 INC R2 CJNE R2,#20,T0E MOV R2,#0 SETB 00HT0E: RETI END
如果你的点灯是低电平 那么编码如下:0x7e,0xbd,0xdb,0xe7;这四个编码实现从两边向中间流0xdb,0xbd,0x7e;由上面的四个编码加上下面的四个编码就达到了从中间向两边显示的效果了循环显示这七个编码就OK
;左移 LOOP1: MOV R7,#8 MOV A ,#01 RL A MOV P1,A CALL DELAY DJNZ R7,LOOP1 ;全亮 MOV P1,#0FFH CALL DELAY ;右移 LOOP2: MOV R7,#8 MOV A ,#01 RR A MOV P1,A CALL DELAY DJNZ R7,LOOP2 ;不想写了