汇编语言实现跑马灯
在Keil μVision2集成开发环境下分别 用51汇编语言编程实现跑马灯,即控制与实验箱上的P6.0~P6.7引脚相连的8个LED循环点亮(如图),请用参考代码的方法、查表法和循环指令三种方法来实现跑马灯并在实验箱上验证。
Fosc_KHZ EQU 24000 ;24000KHZ
STACK_POIRTER EQU 0D0H ;堆栈开始地址
;*******************************************************************
;*******************************************************************
P4 DATA 0C0H
P5 DATA 0C8H
P6 DATA 0E8H
P7 DATA 0F8H
P0M1 DATA 0x93 ; P0M1.n,P0M0.n =00--->Standard, 01--->push-pull
P0M0 DATA 0x94 ; =10--->pure input, 11--->open drain
P1M1 DATA 0x91 ; P1M1.n,P1M0.n =00--->Standard, 01--->push-pull
P1M0 DATA 0x92 ; =10--->pure input, 11--->open drain
P2M1 DATA 0x95 ; P2M1.n,P2M0.n =00--->Standard, 01--->push-pull
P2M0 DATA 0x96 ; =10--->pure input, 11--->open drain
P3M1 DATA 0xB1 ; P3M1.n,P3M0.n =00--->Standard, 01--->push-pull
P3M0 DATA 0xB2 ; =10--->pure input, 11--->open drain
P4M1 DATA 0xB3 ; P4M1.n,P4M0.n =00--->Standard, 01--->push-pull
P4M0 DATA 0xB4 ; =10--->pure input, 11--->open drain
P5M1 DATA 0xC9 ; P5M1.n,P5M0.n =00--->Standard, 01--->push-pull
P5M0 DATA 0xCA ; =10--->pure input, 11--->open drain
P6M1 DATA 0xCB ; P6M1.n,P6M0.n =00--->Standard, 01--->push-pull
P6M0 DATA 0xCC ; =10--->pure input, 11--->open drain
P7M1 DATA 0xE1 ;
P7M0 DATA 0xE2 ;
;*******************************************************************
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:;
;端口初始化
MOV P0M1, #0 ;设置P0为准双向口
MOV P0M0, #0
MOV P1M1, #0 ;设置P1为准双向口
MOV P1M0, #0
MOV P2M1, #0 ;设置P2为准双向口
MOV P2M0, #0
MOV P3M1, #0
MOV P3M0, #0
MOV P4M1, #0
MOV P4M0, #0
MOV P5M1, #0
MOV P5M0, #0
MOV P6M1, #0
MOV P6M0, #0
MOV P7M1, #0
MOV P7M0, #0
MOV P6, #0FFH
;变量初始化
CLR A ; 清空A
CLR P4^0; 流水灯总开关打开
CLR P0^0; 打开矩阵键盘第一列
SETB P0^4; P0^4置1
LOOP: ;相当于while(1)
JUDGE:
JB P0^4, CONTINUE;P0^4为1时跳到CONTINUE
MOV R3, #01H;记录P0^4是否按下过,只要按下过就一直执行,直到按下其他键
DJNZ R3, CONTINUE;当R3不为1时,跳到CONTINUE
START:
MOV A, #0FEH;给P6富初值0x1111 1110
Output:
MOV P6, A
RL A ;每次把A左移循环
LCALL DELAY;使用延时函数
LJMP Output
SJMP JUDGE
CONTINUE:
SJMP LOOP
DELAY:;三重循环
MOV R0, #20
MOV R1, #0
MOV R2, #0
DELAY1:
DJNZ R2, DELAY1
DJNZ R1, DELAY1
DJNZ R0, DELAY1
RET
END
1、软件延时的原理是什么?能否将例程中延时函数调用改为delay(300)?参数类型定义与实际延时时间有关吗?
软件延时的原理是重复的执行无意义指令,执行次数越多延迟时间自然也就越长。
不能改为300,在定义时用的u8,也就是unsigned char型,只有8位,最多可定义255,若想改为300则需要改为u16,也就是unsigned int型。
2、对照实验一的C51和实验二汇编语言方法,对两种语言在头文件、赋值语句、循环语句、函数声明、调用子程序方法各方面的不同做出归纳总结。
C51的头文件在最开始,汇编的头文件在最末尾,二者均可自己定义。
C51赋值可以直接使用“=”号,而汇编用MOV赋值
C51循环可用while 和for循环,汇编使用CJNE等判断指令,多次跳转实现循环
C51函数在主函数之后时需要声明,汇编不需要声明函数
3、如果增加一个开关(譬如实验箱上SW17,与P3.2相接,如图2所示),用来控制流水灯流动的方向,请用汇编编程实现开关控制流水灯方向的跑马灯。
主页还有多篇STC8H8K和其他语言的学文章,以及原理图和实验报告等多种资源,以后写完的东西也会立马发布的,欢迎各位观看,万分感谢!
基于ESP8266与STC单片机的天气时钟(包括DS18B20、TFT、串口、外部中断、ESP8266、STC、API等)
STC8H8K系列汇编和C51实战——实现跑马灯(51版)
STC8H8K系列汇编和C51实战——实现跑马灯(汇编版)
STC8H8K系列汇编和C51实战——实现键控不同方式数码管动态显示(C51版与汇编版)
STC8H8K系列汇编和C51实战——开关控制定时器秒表(C51版)
STC8H8K系列汇编和C51实战——开关控制定时器秒表(汇编版)
STC8H8K系列汇编和C51实战——双中断控制定时器流水灯
STC8H8K系列汇编和C51实战——双中断加减计数器
STC8H8K系列汇编和C51实战——简易频率计
STC8H8K系列汇编和C51实战——秒倒计时器(汇编版)
STC8H8K系列汇编和C51实战——秒倒计时器(51版)
STC8H8K系列汇编和C51实战——秒倒计时器(可自行设定初值)(51版)
STC8H8K系列汇编和C51实战——按键允许按键计数(51版)
STC8H8K系列汇编和C51实战——按键允许按键计数(汇编版)
STC8H8K系列汇编和C51实战——按键允许按键计数(定时器去抖动51版)
STC8H8K系列汇编和C51实战——按键允许按键计数(利用下降沿中断控制)
STC8H8K系列汇编和C51实战——计算机串口控制单片机LED
STC8H8K系列汇编和C51实战——串口发送菜单界面选择不同功能
STC8H8K系列汇编和C51实战——数码管显示ADC、串口显示ADC按键与数值