汇编:电子计数器
一、 实验要求
- 掌握数码管显示方式
- 掌握软件延时方法
- 掌握键盘扫描及去抖动方法
二、 实验设计
1.整体思路
- 主循环中,先检查K1是否被按下。若K1被按下,计数器R1加1,并跳转到显示部分。若K1未被按下,则继续执行下一步。
- 检查K2是否被按下。若K2被按下,计数器R1减1,并跳转到显示部分。若K2未被按下,则继续执行下一步。
- 检查是否长按K1。若K1被长按,计数器R1会连续加1,直到K1被松开。若K1按键未被长按,则跳转回主循环。
- 显示部分将计数器R1的值通过数码管显示出来。首先点亮LED3(百位),然后通过除法运算获取百位的值,并在数码管显示表中查找对应的值,最后将该值输出到P0口供数码管显示。接着依次点亮LED2(十位)和LED1(个位),并进行相应的除法运算和数码管显示操作。
- 最后,通过延时函数控制数码管的稳定性,然后跳转回主循环,继续执行按键检测和数码管显示操作。
2.流程图
3.主要模块设计思路及分析
(1)MAIN模块:
- 检查K1按键是否被按下,如果按下则执行加1操作并跳转到DISPLAY部分进行数码管显示。
- 如果K1未被按下,检查K2按键是否被按下,如果按下则执行减1操作并跳转到DISPLAY部分进行数码管显示。
- 如果K1和K2都未被按下,则继续检查K1是否长按,如果长按则连续执行加1操作。
(2)DISPLAY模块:
- 首先,根据R1的值计算百位、十位和个位,并通过移位操作将各位数值依次送入P0口以控制数码管的显示。
- 每次显示完一位数字后,调用DELAY延时函数以确保数码管有足够的响应时间。
- 最后,跳转回MAIN继续循环执行按键检测和数码管显示。
三、 实现效果
四、 总结
- 延时函数在这个代码中用于产生一定的延时,以确保LED的显示稳定。但是一开始写的代码都无法运行,最后采用了同学的延时函数代码。
- 关于显示函数,采用了之前学习C语言时编写函数的思路,通过个十百位分别除以0、10、100来取各个位最终应该显示的数字。
- 通过这次实验我学会了如何利用单片机的I/O端口控制外围设备(LED和数码管),并通过按键输入来控制计数器的增减。
ORG 0000HMOV R1, #0 ; 初始化R1为0MAIN:; 检查K1是否被按下MOV P3, #0FFHMOV A, P3CPL A JNB ACC.0, CHECK_K2 ; 跳转到检查K2是否被按下; K1被按下,计数器加1INC R1LJMP DISPLAYCHECK_K2:; 检查K2是否被按下MOV P3, #0FFHMOV A, P3CPL AJNB ACC.1, CHECK_K1 ; 跳转到检查K1是否被按下; K2被按下,计数器减1DEC R1LJMP DISPLAYCHECK_K1:; 检查是否长按K1MOV P3, #0FFHMOV A, P3CPL AJNZ MAIN ; 如果没有按键输入,则返回主循环; K1长按,连续加1MOV P3, #0FFHMOV A, P3CPL AJZ CHECK_K1 ; 继续检查是否长按K1DISPLAY:MOV P2, #8 ; 点亮LED3(百位)MOV A, R1 MOV B, #100DIV ABMOV DPTR, #TABLEMOVC A, @A+DPTRMOV P0, ALCALL DELAYMOV P2, #4 ; 点亮LED2(十位)MOV A, BMOV B, #10DIV ABMOVC A, @A+DPTRMOV P0, ALCALL DELAYMOV P2, #0 ; 点亮LED1(个位)MOV A, BMOVC A, @A+DPTRMOV P0, ALCALL DELAYLJMP MAINDELAY: ;延时函数MOV R5, #100
DELAY0:MOV R6, #1
DELAY1:MOV R7, #20
DELAY2:DJNZ R7, DELAY2DJNZ R6, DELAY1DJNZ R5, DELAY0RETTABLE:DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ; 数码管显示表END