数字毫秒计数 3种模式切换
- 格式:docx
- 大小:173.85 KB
- 文档页数:12
Proteus仿真:软件清单:WEI EQU 30H ;定义位码寄存器LED1 EQU 31H ;定义个位显示器缓冲单元LED2 EQU 32H ;定义十位显示器缓冲单元LED3 EQU 33H ;定义百位显示器缓冲单元LED4 EQU 34H ;定义千位显示器缓冲单元lED5 EQU 35H ;定义第5位显示器缓冲单元LED6 EQU 36H ;定义第6位显示器缓冲单元LED7 EQU 37H ;定义第7位显示器缓冲单元LED8 EQU 38H ;定义第8位显示器缓冲单元SEC EQU 40H ;定义秒计数器MSEC EQU 41H ;定义十位和个位毫秒计数器MSEC2 EQU 42H ;定义百位毫秒计数器MODE EQU 43H ;用于切换三个模式MODE2_SEC EQU 44H ;模式三的用T1时的秒计数器MODE2_MSEC EQU 45H ;模式三的用T1时的毫秒计数器MODE2_SEC1 EQU 46H ;模式三的用T1时的毫秒计数器K3F BIT 00H ;用于模式二K3,K4启停标志位K4F BIT 01H ;用于模式二K3,K4启停标志位KEY BIT 02H ;用于模式二K3,K4启停标志位S1 EQU P3.0 ; K1S2 EQU P3.1 ; K2S3 EQU P3.2 ; K3S4 EQU P3.3 ; K4OLD1 EQU 80H ; S1 按下时长OLD2 EQU 81H ; S2 按下时长YEAR DATA 03H ; 比较时长常数DEL1 EQU 7EH ;延时子程序中用的延时常数存放单元DEL2 EQU 7FH ;延时子程序中用的延时常数存放单元ORG 0000HSJMP STARORG 0003HLJMP INT0S ;INT0中断入口ORG 000BHLJMP T0S ;定时器T0入口ORG 0013HLJMP INT1S ;INT1中断入口ORG 001BHLJMP T1S ;定时器T1入口ORG 0030HSTAR:MOV SP,#0DFHMOV LED1,#00H ;显示器缓冲单元中存放的是显示内容MOV LED2,#00H ;显示器缓冲单元中存放的是显示内容MOV LED3,#00H ;显示器缓冲单元中存放的是显示内容MOV LED4,#80H ;该位若要出现小数点,则显示内容加MOV LED5,#00H ;显示器缓冲单元中存放的是显示内容MOV MODE,#0 ;设置模式的初值为0MOV R4,#0MOV R5,#0MOV R7,#0CLR KEYMOV SEC,#00HMOV MSEC,#00HMOV TMOD,#22HMOV TL0,#06HMOV TH0,TL0MOV TL1,#06HMOV TH1,TL1 ;定时器初值设置为6 为250微秒每次MOV TCON,#05H ;外中断INT0 INT1触发方式下降沿触发MOV IE,#8FH ;开T1 INT1 T0 INT0中断;此处可放其他初始化指令MAIN:LCALL KEYAN ;调用键盘扫描LCALL MODE1 ;调用显示函数的模式1进行模式判断LJMP MAIN ;主函数循环;*************************************显示函数******************************* MODE1:MOV A,MODECJNE A,#0,MODE2 ;进行模式判断,如果A为0 进入模式1,不为0去判断是否模式2MODE11:MOV P2,#1CH ;打开LED1的扫描MOV A,#1MOVC A,@A+DPTRMOV P0,A ;调用1的的段码,给P0口LCALL DLYS ;位显示延时MOV P0,#00HLJMP DISP ;显示完模式一,进入计数环节MODE2:CJNE A,#01H,MODE3 ;进行模式判断,如果A为1 进入模式1,不为1去判断是否模式3MODE11:MODE22:MOV P2,#1CHMOV A,#2MOVC A,@A+DPTRMOV P0,ALCALL DLYSMOV P0,#00HLJMP DISPDISP:MOV A,MSEC ;计数环节在此MOV B,#10DIV ABMOV LED2,AMOV LED1,BMOV A,MSEC2MOV LED3,AMOV A,SECMOV B,#10DIV ABMOV LED5,AMOV LED4,BMOV WEI,#00H ;位码初值,显示个位MOV R2,#05H ;扫描显示位计数器,同数码管位数MOV R1,#LED1 ;R1为显示器缓冲单元的地址寄存器DISP1:MOV A,@R1 ;取R1对应显示位的内容MOV DPTR,#TAB ;段码表首址送数据指针MOVC A,@A+DPTR ;取显示内容的段码LCALL DLYSMOV P0,#00HMOV P2,#0FFH ;关显示,消串字鬼影CJNE R2,#02H,NEXTORL A,#80HNEXT:MOV P0,A ;显示内容的段码送P0口MOV P2,WEI ;对应的位码送P2口INC R1 ;显示缓冲单元地址+1MOV A,WEI ;改变显示位ADD A,#4MOV WEI,ALCALL DLYS ;位显示延时,可在此处调用执行主程序LCALL KEYANDJNZ R2,DISP1 ;是否已经遍历所有的显示位LJMP DIS_EXTLJMP DIS_EXTMODE3:CJNE A,#02H,DIS_EXT ;进行模式判断,如果A为2 进入模式3,不为2跳出MODE11:MODE33:LCALL MODE3_DISLJMP DIS_EXTDIS_EXT:RETMODE3_DIS:MOV A,MODE2_MSECMOV B,#10DIV ABMOV LED7,AMOV LED6,BMOV A,MODE2_SECMOV LED8,A ;后3位MOV A,MSECMOV B,#10DIV ABMOV LED2,AMOV LED1,BMOV A,MSEC2MOV LED3,AMOV A,SECMOV B,#10DIV ABMOV LED4,B ;前4位MOV WEI,#00H ;位码初值,显示个位MOV R2,#08H ;扫描显示位计数器,同数码管位数MOV R1,#LED1 ;R1为显示器缓冲单元的地址寄存器MODE3_DISP1:MOV A,@R1 ;取R1对应显示位的内容MOV DPTR,#TAB ;段码表首址送数据指针MOVC A,@A+DPTR ;取显示内容的段码LCALL DLYSMOV P0,#00HMOV P2,#0FFH ;关显示,消串字鬼影CJNE R2,#01H,NEXT1ORL A,#80HNEXT1:CJNE R2,#04H,NEXT2MOV LED5,#10MOV A,LED5MOV DPTR,#TABMOVC A,@A+DPTRNEXT2:CJNE R2,#05H,MODE3_NEXTORL A,#80HMODE3_NEXT:MOV P0,A ;显示内容的段码送P0口MOV P2,WEI ;对应的位码送P2口INC R1 ;显示缓冲单元地址+1MOV A,WEI ;改变显示位ADD A,#4MOV WEI,ALCALL DLYS ;位显示延时,可在此处调用执行主程序LCALL KEYANDJNZ R2,MODE3_DISP1 ;是否已经遍历所有的显示位LJMP DIS_EXTRET;*************************************定时器计时*******************************T0S:PUSH ACCPUSH PSWINC R4CJNE R4,#4,EXTMOV R4,#0MOV A,MSECINC AMOV MSEC,ACJNE A,#100,EXTMOV A,#0MOV MSEC,#00HMOV R5,MSEC2INC R5MOV MSEC2,R5CJNE R5,#10,EXTMOV R5,#0;MOV MSEC,#00HMOV MSEC2,#00HINC SECMOV A,SECCJNE A,#60,EXTMOV SEC,#00MOV MSEC,#00MOV MSEC2,#00EXT:POP PSWPOP ACCRETIT1S:PUSH ACCPUSH PSWINC R7CJNE R7,#40,EXT1 ; 1MSMOV R7,#0MOV A,MODE2_MSECINC AMOV MODE2_MSEC,ACJNE A,#100,EXT1 ;1MSMOV MODE2_MSEC,#0MOV A,MODE2_SECINC AMOV MODE2_SEC,ACJNE A,#10,EXT1MOV MODE2_SEC,#0MOV MODE2_MSEC,#0EXT1:POP PSWPOP ACCRETI;*************************************中断函数******************************* INT0S:MOV A,MODECJNE A,#1H,INT0S1JB KEY,EXT111JB K4F,EXTK4SETB TR0SETB K3FLJMP EXT111EXTK4:CLR TR0SETB KEYLJMP EXT111INT0S1 :CPL TR0EXT111:RETIINT1S:MOV A,MODECJNE A,#1H,INT1S1JB KEY,EXT222JB K3F,EXTK5SETB TR0SETB K4FLJMP EXT222EXTK5:CLR TR0SETB KEYLJMP EXT222INT1S1:CPL TR1EXT222:RETI;*************************************按键动作函数*******************************EXES1:MOV A,MODEINC AMOV MODE,ACLR TR0CLR TR1CLR KEYCLR K3FCLR K4FMOV SEC,#00MOV MSEC,#00MOV MSEC2,#00MOV MODE2_SEC,#00MOV MODE2_MSEC,#00CJNE A,#03H,EXTTMOV MODE,#0CLR TR0CLR TR1MOV SEC,#00MOV MSEC,#00MOV MSEC2,#00MOV MODE2_SEC,#00MOV MODE2_MSEC,#00LJMP EXTTEXES2:MOV A,MODECJNE A,#02H,EXES22JB TR0,RREEMOV SEC,#00MOV MSEC,#00MOV MSEC2,#00 RREE:JB TR1,ENDS2MOV MODE2_SEC,#00MOV MODE2_MSEC,#00LJMP ENDS2;执行S2EXES22:CLR KEYCLR K4FCLR K3FMOV SEC,#00MOV MSEC,#00MOV MSEC2,#00MOV MODE2_SEC,#00MOV MODE2_MSEC,#00CLR TR0CLR TR1ENDS2:RETEXTT:RET;*************************************延时函数******************************* DLYS: MOV DEL1,#10H ;延时子程序D1: MOV DEL2,#15HD2: DJNZ DEL2,D2DJNZ DEL1,D1RET;*************************************扫描函数******************************* KEYAN: ;键盘扫描执行子程序KEY1: SETB S1JNB S1,KEY1A ;S1按下则跳转MOV R0,#OLD1 ;未按下清零CLR AMOV @R0,ACLR 21H.1CLR 22H.1LJMP KEY2KEY1A: MOV R0,#OLD1LCALL KEYS ;调用判断按键时长子程序MOV 21H.1,CKEY2: SETB S2JNB S2,KEY2A ;S2按下则跳转MOV R0,#OLD2 ;未按下清零CLR AMOV @R0,ACLR 21H.2CLR 22H.2LJMP ANKEY2A: MOV R0,#OLD2LCALL KEYS ;调用判断按键时长子程序MOV 21H.2,CAN: JB 21H.1,AN1 ;键盘执行JNB 21H.2,AN0LJMP AN2AN0:LJMP EEANAN1:JB 22H.1,AN1ELCALL EXES1 ;执行S1SETB 22H.1AN1E: LJMP EEANAN2:JB 22H.2,AN2ELCALL EXES2 ;执行S2SETB 22H.2AN2E:EEAN: RETKEYS: ;判断按键时长子程序INC @R0MOV A,#YEARCLR CSUBB A,@R0JNC KEYS2MOV @R0,#00HSETB CRETKEYS2: CLR CRETTAB: ;段码表DB 3FH,06H,05BH,04FH,66H,6DH,7DH,07H,7FHDB 6FH,00H,77H,7CH,39H,5EH,79H,71H,73H,76H,38H,6EH ORG TAB+80H ;带小数点的段码表DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH END硬件成果。