
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、单片机程序设计(要求是汇编语言),按键控制流水灯的花色高分求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)