;********************************************************************/ /* 实验目的:1、掌握数码管的动态扫描原理 * 2、掌握单片机对按键的控制原理 * 实验内容:通过按一下P3.3按键,数码管做 1 的累加, 实现00~99的计数功能,当计到99时又从00开始 */ ;/* 程序详细功能介绍: ; * 具体的硬件结构,大家可以看 WS 系列产品的原理图 ;* 利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.3管脚接一个轻触开关, ;* 作为手动计数的按钮. 数码管驱动采用动态扫描方式用单片机的P0.0-P0.7驱动数码管的段码, ;* P1.3 控制个位数码管的共阳极公共端,P1.2 控制十位数码管的共阳极公共端 ;* 大家可自行修改程序,扩展到0000~9999的计数范围 ;*/ Count EQU 30H AN BIT P3.3 WEI BIT 00H;按键消除振荡位标志 ORG 0000H CLR P2.7 LJMP START ORG 0100H START: MOV Count,#00H NEXT: MOV A,Count MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A ;十位的显示处理 CLR P1.2 LCALL DELY10MS SETB P1.2 MOV A,B MOVC A,@A+DPTR MOV P0,A ;个位的显示处理 CLR P1.3 LCALL DELY10MS SETB P1.3 ;***************************** ;********按键方法一*********** ;***************************** ;JB AN,NEXT ;按键检测 ;LCALL DELY10MS; ;LCALL DELY10MS; ;LCALL DELY10MS; ;LCALL DELY10MS; ;JB AN,NEXT ;LCALL DELY10MS ;LCALL DELY10MS ;LCALL DELY10MS ;***************************** ;*****按键方法二************** ;***************************** JB AN,NEXT1 ;按键检测 JB WEI,NEXT ;在程序循环过来时,若按键没有放开,则不执行下面的程序 SETB WEI ;对按键标志位置1 LJMP NEXT2 ;执行计数加1程序 NEXT1:CLR WEI;若按键放开,则对按键标志位清0, LJMP NEXT ;在执行显示程序,实现按键的消除振荡 NEXT2: ; INC Count ;计数加一 MOV A,Count CJNE A,#100,NEXT LJMP START DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE: DB 0C0H;0 DB 0F9H;1 DB 0A4H;2 DB 0B0H;3 DB 099H;4 DB 092H;5 DB 082H;6 DB 0F8H;7 DB 080H;8 DB 090H;9 END