
START: CLR P1.0点亮发光二极管
LCALL DELAY 调用延时子程序(亮1秒钟)
SETBP1.0 关掉发光二极管
LCALL DELAY 调用延时子程序(关1秒钟)
LJMPSTART 跳到START标号处执行
DELAY: 1秒延时子程序(12MHz晶振)
MOV R5,#8 R5寄存器加载8次
D0:MOV R7,#250 R7寄存器加载250次数
D1:MOV R6,#250 R6寄存器加载250次数
D2:DJNZR6,D2D2循环执行R6次
DJNZR7,D1D1循环执行R7次
DJNZR5,D0D0循环执行R5次
RET 返回主程序
END 主程序结束
#include <reg51.h>#define LED P1 //宏定义,使用LED代替P1口(相当于LED=P1)
#define uchar unsigned char //用uchar代替unsigned char方便 *** 作
#define uint unsigned int
/*------------------time ms延时函数-----------------*/
void delay_ms(uint time)
{
uchar tres
for(time>0time--)
{
tres=150
while(tres--)
}
}
void main()
{
uchar t
LED=0X01//P1=00000001B
while(1)//死循环,不停的点亮和熄灭LED
{
for(t=0t<8t++)
{
LED=~LED//按位取反,点亮一个LED
delay_ms(100)//延时0.1s
LED=~LED//按位取反
LED<<=1//左移一位,点亮不同的LED
}
LED=0X80//P1=10000000B
for(t=0t<8t++)
{
LED=~LED//按位取反,点亮一个LED
delay_ms(100)//延时0.1s
LED=~LED//按位取反
LED>>=1//右移一位,点亮不同的LED
}
LED=0X01//P1=00000001B
}
}
程序:ORG
0000H
LJMP
MAIN
ORG
4000H
MAIN:MOV
R5,#04H
LOOP:MOV
R1,#00H
MOV
A,#0FEH
L1:MOV
P1,A
LCALL
DELAY
RL
A
INC
R1
CJNE
R1,07H,L1
MOV
R2,#00H
MOV
A,#01H
L2:MOV
P1,A
LCALL
DELAY
RR
A
INC
R2
CJNE
R2,07H,L2
DJNE
R5,LOOP
DELAY:MOV
R6,#02H
D1:MOV
R7,#0FFH
D2:DJNZ
R7,D2
DJNE
R6,D1
RET
END
电路:
连接灯的阴极至P1口上即可,复位和震荡电路不需要我说了吧
说明一下,延时时间不准确,不过基本接近1ms的
t=(256*2+1)*2+1+2=1028
如果想做到精确延时的话建议在DELAY中使用NOP指令调理,自己试一下吧
最好是用Keil仿真一下确定延时时间。
很久没有汇编了,仔细检查一下,估计有Bug也不一定。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)