单片机流水灯的汇编程序看不懂~~~

单片机流水灯的汇编程序看不懂~~~,第1张

ORG 0000H ;程序起始地址

LJMP MAIN ;初始跳转到主程序

ORG 0030H ;主程序开始地址

MAIN: MOV SP,#2FH ;堆栈初始地址设定为0x2F

MOV A,#0FEH ;对A 赋值

LOOP:MOV P2,A ;P2口输出寄存器A中数据

LCALL DELAY ;延时

LCALL DELAY

LCALL DELAY

RR A ;循环右移一位

RR A ;循环右移一位

LJMP LOOP ;跳转到loop, 实现跑马灯 *** 作

DELAY:MOV R7,#250 ;延时程序

LP1: MOV R6,#200

LP0:NOP

NOP

DJNZ R6,LP0

DJNZ R7,LP1

RET

END

关于0FEH而不是FEH, 汇编中规定,首位为字母的字节,前边必须加0, 如果是数字,就没有必要,例如:21H, 就没必要一定要写为021H

org  0000h

ljmp start

org  1000h

start:mov sp,#4fh   ;堆栈段

MOV R0,#06H    ;循环6次

mov A,#0f8H    ;123灯亮

ATT: mov P1,A

acall delay

RL A            ;左移1位

DEC R0         ;循环次数自减1

CJNE R0,#00H,ATT    ;自减完后的数和00比较不相等跳到ATT相等往下执行

MOV P1,#0FFH

MOV A,#0F8H

MOV R0,#06H

ATL: MOV P2,A

ACALL DELAY

RL A

DEC R0

CJNE R0,#00H,ATL

MOV P2,#0FFH

AJMP START

delay:MOV R1,#0FFH

LOOP0:MOV R2,#0FFH

LOOP1:nop

nop

NOP

NOP

DJNZ R2,LOOP1

DJNZ R1,LOOP0

ret

END

假设:1开关接在p10口上

2led灯在p2口上,=0亮

ORG 0H

mov p1,#0ffh ;输入初始化

stat:

jb p10,jt ;p10=1转交替显示

mov a,#0feh ;00000001>A

loop:

acall yss ;显示及延时

rl a ;左移

cjne a,#1,loop ;不等于1继续

ajmp stat ;一圈结束查键值

jt:

mov a,#0aah ;01010101>A

acall yss ;显示及延时

cpl a ;取反 10101010

acall yss ;显示及延时

ajmp stat ;查键值

yss:

mov p2,a ;送显示

ys: ;延时

djnz r6,ys ;r6-1不等于0转ys

djnz r7,ys ;r7-1不等于0转ys

ret

END

ORG 000H //定位,使程序放在0000H处

MOV P1,#0FFH //使P1口全为高电平,八个灯全灭

L034: MOV A,#0FEH //11111110B值送入A,只使P10为低电平

L033: MOV P1,A //将A值送出P1口,只有D1亮

LCALL SE19 //调用延时子程序(决定每个灯亮的时间长度)

// {可在此再次(或多次)加入“LCALL SE19”使亮的时间增加一倍}

RL A //左循环位移,为了下次只使D2亮(再下次就是D3……)

SJMP L033 //跳转到L033处重新执行,使D1、D2、D3……D1轮流亮

//下面是延时程序,决定每调用一次延时多长时间

ORG 07A0H //定位,将下面的程序(延时程序段)放在07A0H处

SE19: MOV R6,#0A0H //更改#0A0H值

L036: MOV R7,#0FFH //或更改#0FFH值就可以改变其每次调用延时的时间

L035: DJNZ R7,L035

DJNZ R6,L036

RET

END

/

程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器

发出不同音调的同时,LED发光以二进制数字形式指示

当前音调的编号(1~16)

----------------------------------------------------------

测试说明:聆听蜂鸣器发声的音调变化。

/

#include <msp430h>

#include "BoardConfigh"

uchar step = 0xff;

/主函数/

void main( void )

{

uchar i;

WDTCTL = WDTPW + WDTHOLD; //关狗

BoardConfig(0xb0); //关数码管、流水灯和电平转换

/------选择系统主时钟为8MHz-------/

BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器

do

{

IFG1 &= ~OFIFG; //清除晶振失败标志

for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振

}

while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?

BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振

TACCTL0 |= CCIE; //使能比较中断

TACTL |= TASSEL_2 + ID_3 ; //计数时钟选择SMLK=8MHz,1/8分频后为1MHz

TBCCR0 = 40962 - 1; //周期两秒

TBCCTL0 |= CCIE;

TBCTL |= TBSSEL_1 + ID_3 + MC_1; //时钟源ACLK/8,up mode

P6DIR |= BIT7; //蜂鸣器对应IO设置为输出

P2DIR = 0xff;

P2OUT = 0xff;

_EINT();

LPM1;

}

/

函数名称:Timer_A

功 能:定时器A的中断服务函数,在这里驱动

蜂鸣器发声

参 数:无

返回值 :无

/

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A (void)

{

P6OUT ^= BIT7; // Toggle P67

}

/

函数名称:Timer_B

功 能:定时器B的中断服务函数,在这里更改

蜂鸣器发声频率

参 数:无

返回值 :无

/

#pragma vector=TIMERB0_VECTOR

__interrupt void Timer_B (void)

{

if(step == 0xff) //up mode

TACTL |= MC_1;

step++;

switch(step)

{

case 0: TACCR0 = 5000; P2OUT = ~1; break; // 100Hz

case 1: TACCR0 = 2500; P2OUT = ~2; break; // 200Hz

case 2: TACCR0 = 1250; P2OUT = ~3; break; // 400Hz

case 3: TACCR0 = 625; P2OUT = ~4; break; // 800Hz

case 4: TACCR0 = 500; P2OUT = ~5; break; // 1KHz

case 5: TACCR0 = 250; P2OUT = ~6; break; // 2KHz

case 6: TACCR0 = 167; P2OUT = ~7; break; // 3KHz

case 7: TACCR0 = 125; P2OUT = ~8; break; // 4KHz

case 8: TACCR0 = 100; P2OUT = ~9; break; // 5KHz

case 9: TACCR0 = 83; P2OUT = ~10; break; // 6KHz

case 10: TACCR0 = 71; P2OUT = ~11; break; // 7KHz

case 11: TACCR0 = 63; P2OUT = ~12; break; // 8KHz

case 12: TACCR0 = 56; P2OUT = ~13; break; // 9KHz

case 13: TACCR0 = 50; P2OUT = ~14; break; // 10KHz

case 14: TACCR0 = 33; P2OUT = ~15; break; // 15KHz

case 15: TACCR0 = 25; P2OUT = ~16; break; // 20KHz

case 16: step = 0xff; // 循环播放

}

}

TLOW    EQU  0F0H

THIGH   EQU  0D8H

FLAG_DIR    BIT 20H0;FANGXIANG

COUNT_INT   DATA 30H

COUNT_K     DATA 31H

LEDVALUE    DATA 32H

COUNT_KEY   DATA 33H

KEY0    EQU P20

KEY1    EQU P21

KEY2    EQU P22

KEY3    EQU P23

;--------------------------------------------------

ORG  0000H

JMP  MAIN

ORG  0BH

JMP  T0_INT

;--------------------------------------------------

MAIN:

MOV  SP,#60H

CALL  INIT_TIMER

SETB  TR0

    CLR FLAG_DIR

    MOV LEDVALUE,#01H

    MOV COUNT_KEY,#50

    MOV COUNT_K,#50

MAIN_LOOP:

READKEY0:

    JB KEY0,READKEY1

    JNB KEY0,$

    SETB FLAG_DIR

    AJMP READKEYEND

READKEY1:

    JB KEY1,READKEY2

    JNB KEY1,$

    CLR FLAG_DIR

    AJMP READKEYEND

READKEY2:

    JB KEY3,READKEY3

    JNB KEY3,$

    CLR C

    MOV A,COUNT_KEY

    ADDC A,#5

    JNC COUNT_KEY_NOT_OV

    MOV A,#250

COUNT_KEY_NOT_OV:    

    MOV COUNT_KEY,A

    MOV COUNT_K,A 

    AJMP READKEYEND

READKEY3:

    JB KEY2,READKEYEND  

    JNB KEY2,$    

    MOV A,COUNT_KEY

    SUBB A,#5

    JNC COUNT_KEY_NOT_OV2

    MOV A,#5

COUNT_KEY_NOT_OV2:     

    MOV COUNT_KEY,A

    MOV COUNT_K,A

    AJMP READKEYEND

READKEYEND:    

 ;   MOV A,COUNT_KEY

;    MOV COUNT_K,A

JMP MAIN_LOOP

;;-------------------------   

;;-------------------------

INIT_TIMER:                ;初始化定时器

MOV  TMOD,#01H    ;设置定时器0 工作模式为模式1

MOV  IE,  #82H    ;启用定时器0 中断产生

MOV  TL0,#TLOW      ;10MS

MOV  TH0,#THIGH

RET

;;-------------------------

T0_INT:

PUSH  ACC

PUSH  PSW

MOV  TL0,#TLOW

MOV  TH0,#THIGH

    INC COUNT_INT

    MOV A,COUNT_INT

    CJNE A,#1,RUNOUT

    MOV COUNT_INT,#0

    DJNZ COUNT_K,RUNOUT

    MOV A,COUNT_KEY

    MOV COUNT_K,A

RUN:   

    JB  FLAG_DIR,RUN_R;

RUN_L:

    MOV A,LEDVALUE

    RL A

    MOV LEDVALUE,A

    AJMP RUNOUT

RUN_R:

    MOV A,LEDVALUE

    RR A

    MOV LEDVALUE,A

    AJMP RUNOUT  

RUNOUT:

 ;   MOV A,LEDVALUE

    MOV P0,LEDVALUE

T0_T:

POP PSW

   POP  ACC

RETI

;;-------------------------

END

实现流水灯的方式有很多种(中断,定时器,延时等等),看用哪种方式,最简单的是延时做流水灯,那么在死循环里面增加按键检测,判断出有按键按下来时,再进入死循环,程序不往下走就可以暂停,再按跌出死循环。

#include //51系列单片机定义文件

#define uchar unsigned char //定义无符号字符

#define uint unsigned int //定义无符号整数

void delay(uint); //声明延时函数

void main(void)

{

uint i;

uchar temp;

uint Flag1=0;  按键标志位bai

uint Flag2=0;

while(1)

{

Flag1 = keyscan();

if(Flag1==1)(Flag2=~Flag2); //如果一旦检测到一次按键扫描就把标志位2 打开;再次就关闭;

if(Flag2==1)// 如果标志位打开就开始流水灯

{

temp=0x01;

for(i=0;i<8;i++) //8个流水灯逐个闪动

{

P1=~temp;

delay(100); //调用延时函数

temp<<=1;

}

}

扩展资料:

单片机编程就是硬件是单片机,基于单片机进行的程序开发,在有周围外设支持的情况下,用软件来控制的部分通过单片机编程来实现。单片机能识别的语言是硬件语言即汇编,因此编程就是围绕汇编来实现,有直接用汇编程序来编写的,但是较难调试的编写,特别是一上规模就更不易实现,因此常用高级语言来写然后通过编译器转化成汇编。

参考资料来源:百度百科-单片机C语言编程

以上就是关于单片机流水灯的汇编程序看不懂~~~全部的内容,包括:单片机流水灯的汇编程序看不懂~~~、跪求单片机一按键控制8盏流水灯的程序最好有图用汇编语言编程。3Q、单片机程序设计(要求是汇编语言),按键控制流水灯的花色高分求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9338844.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存