当前位置:文档之家› 8位数码管显示

8位数码管显示

;************** DS1302 端口位定义**************IO_DA TA BIT P1.1 ; 数据传送总线SCLK BIT P1.0 ; 时钟控制总线RST BIT P1.2 ; 复位总线K1 EQU P1.4 ;独立键K2 EQU P1.5K3 EQU P1.6K4 EQU P1.7BEEP EQU P3.3 ;蜂鸣器RELAY EQU P3.5 ;继电器T_CONU EQU 22H ;中断计数TIME_L EQU 23H ;定时初值TIME_H EQU 24HTIME_DA TA EQU 50H ;显示时间单元首地址DA TE_DATA EQU 60H ;显示日期单元首地址DS_DA TA EQU 58H ;显示定时时间首地址;------------------------------------------------ORG 0000HAJMP MAINORG 000BHAJMP INT_T0ORG 0080H;------------------------------------------------MAIN:MOV TMOD,#01H ;T0,方式1MOV TIME_L,#00H ;50MS定时值MOV TIME_H,#4CHMOV T_CONU,#00H ;中断次数MOV IE,#82H ;EA=1,ET0=1MOV A,#00HMOV R0,#40H ;从40H单元开始MOV R1,#40H ;清64个单元M_CLEAR: MOV @R0,AINC R0DJNZ R1,M_CLEARMOV 7FH,#0AH ;送熄灭符SETB BEEPLCALL TIME_DELAY ;调显示延时LCALL PROSET ;DS1302初始化MAIN1:LCALL GET_TIME ;从DS1302读数据程序LCALL CHULI ;实时时间数据处理MOV R0,#TIME_DATA ;显示时、分、秒LCALL DISPMOV R0,#TIME_DATALCALL TIME_DISPLAYLCALL SET_KEY ;键功能程序;001LCALL COMP ;实时时间与定时时间比较JB K1,MAIN1CALL BEEP_BLMAIN2:LCALL CHULI ;日期数据处理MOV R0,#DA TE_DATALCALL DISP ;显示年、月、日MOV R0,#DA TE_DATALCALL TIME_DISPLAYJB K1,MAIN2CALL BEEP_BLMAIN3:LCALL DS_CHULI ;定时时间数据处理MOV R0,#DS_DA TALCALL DS_SP ;显示定时时间MOV R0,#DS_DA TALCALL DS_DISPLAYJB K1,MAIN3CALL BEEP_BLAJMP MAIN1;--------------------------------------------;中断服务子程序;300MS对闪动标记取反一次;-------------------------------------------- INT_T0:PUSH ACCPUSH PSWMOV TL0,TIME_LMOV TH0,TIME_HINC T_CONUMOV A,T_CONUCJNE A,#06H,INT_ENDMOV T_CONU,#00HCPL 0AHINT_END:POP PSWPOP ACCRETI;--------------------------------------------;DS1302 初始化子程序; (R0)=数据(R1)=地址;--------------------------------------------PROSET:CLR RST ;DS1302复位CLR SCLKNOPNOPSETB RST;MOV R1,#80H ;写秒寄存器;MOV R0,#00H ;启动振荡器;LCALL WRITE;MOV R1,#82H ;写分寄存器;MOV R0,#58H;LCALL WRITE;MOV R1,#84H ;写时寄存器;MOV R0,#80H;LCALL WRITEMOV R1,#90H ;写充电寄存器MOV R0,#0ABHLCALL WRITERET;===============================================;读时间、日期数据子程序;存放单元40H - 46H;=============================================== GET_TIME:MOV R1,#81H ;读秒LCALL READMOV 40H,R0MOV R1,#83H ;读分LCALL READMOV 41H,R0MOV R1,#85H ;读时LCALL READMOV 42H,R0MOV R1,#87H ;读出日期LCALL READMOV 43H,R0MOV R1,#89H ;读出月份LCALL READMOV 44H,R0MOV R1,#8BH ;读出星期LCALL READMOV 46H,R0MOV R1,#8DH ;读出年LCALL READMOV 45H,R0RET;================================================;写DS1302 子程序;================================================ WRITE:CLR SCLKNOPNOP1SETB RSTNOPMOV A,R1 ; (R0)=数据(R1)=地址MOV R2,#08HWRI_01:RRC A ;传输地址到DS1302NOPNOPCLR SCLKNOPNOPMOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPDJNZ R2,WRI_01CLR SCLKNOPNOPMOV A,R0MOV R2,#08HWRI_02:RRC A ;传输数据到DS1302NOPCLR SCLKNOPNOPMOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPDJNZ R2,WRI_02CLR SCLKNOPNOPCLR RSTNOPNOPRET;================================================= ;读DS1302 子程序;================================================= READ:CLR SCLKNOPNOPSETB RSTNOPNOPMOV A,R1MOV R2,#08HREAD_01:RRC ANOP ;先传输地址到DS1302MOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPCLR SCLKNOPNOPDJNZ R2,READ_01NOPNOPSETB IO_DA TACLR ACLR CMOV R2,#08HREAD_02:CLR SCLKNOPNOPMOV C,IO_DA TANOPNOPRRC A ;再从DS1302接收数据NOPNOPSETB SCLKNOPNOPDJNZ R2,READ_02MOV R0,ACLR RSTRET;==============================================;实时时间、日期数据处理子程序;============================================== CHULI:MOV A,40H ;处理秒数据ANL A,#0FHMOV 50H,AMOV 70H,AMOV A,40HANL A,#11110000BSWAP AMOV 51H,AMOV 71H,A;---------------------------------------------MOV A,41H ;处理分数据ANL A,#0FHMOV 52H,AMOV 72H,AMOV A,41HANL A,#11110000BSWAP AMOV 53H,AMOV 73H,A;---------------------------------------------MOV A,42H ;处理时数据ANL A,#0FHMOV 54H,AMOV 74H,AMOV A,42HANL A,#11110000BSWAP AMOV 55H,AMOV 75H,A;----------------------------------------------MOV A,43H ;处理日数据ANL A,#0FHMOV 60H,AMOV 76H,AMOV A,43HANL A,#11110000BSWAP AMOV 61H,AMOV 77H,A;---------------------------------------------MOV A,44H ;处理月数据ANL A,#0FHMOV 62H,AMOV 78H,AMOV A,44HANL A,#11110000BSWAP AMOV 63H,AMOV 79H,A;---------------------------------------------MOV A,45H ;处理年数据ANL A,#0FHMOV 64H,AMOV 7AH,AMOV A,45H2ANL A,#11110000BSWAP AMOV 65H,AMOV 7BH,A;----------------------------------------------MOV A,46H ;处理周数据MOV 66H,AMOV 7CH,ARET;=============================================;实时时间、日期查表取数子程序;============================================= DISP: ;MOV R0,#TIME_DATAMOV R3,#06HDISP1: MOV A,@R0MOV DPTR,#TAB_NUMOVC A,@A+DPTRMOV @R0,AINC R0DJNZ R3,DISP1RET;================================================== ;时间、日期显示子程序;================================================== TIME_DISPLAY:;MOV R0,#TIME_DATA ;取得显示单元首地址MOV R1,#07FH ;从第一个数码管开始,位码MOV R2,#08H ;共8个数码管DISLP: MOV P0,@R0 ;获得当前单元数据MOV A,R1MOV P2,A ;数码显示JB ACC.5,DISLP1 ;第三位数码管显示-MOV P0,#0f7HJMP DISLP3DISLP1: JB ACC.2,DISLP2 ;第六位数码管显示-MOV P0,#0f7HJMP DISLP3DISLP2: INC R0DISLP3: MOV A,R1 ;为下一个数准备RR A ;下一个单元MOV R1,A ;保存LCALL DELAY ;为了保证数码管亮度,延时DJNZ R2,DISLP 复显示,直到全部数据刷新过RET ;返回DELAY:MOV R4,#0AHL15: MOV R5,#64HL16: DJNZ R5,L16DJNZ R4,L15RET;****************************************************** SET_KEY: ;001SETB K1 ;增加键SETB K2 ;减少键SETB K3 ;选择键SETB K4 ;定时设定功能键NOPJB K4,KEY01 ;002LCALL BEEP_BLJMP DS_KEY ;进入定时值设定子程序;002KEY01: JB K2,KEY02LCALL BEEP_BLJMP SET_TIME ;进入时间设定子程序KEY02: JB K3,KEY03LCALL BEEP_BLCPL 20H.0 ;止闹标记取反KEY03: RET;-----------------------------------------------------DS_KEY: ;002CALL DS_DELAY ;003JNB K4,$LCALL DSSETCALL DS_DELAYRET;==============================================;实时时间设定子程序;K1为加键、K2为减键、K3为选择键;==============================================SET_TIME:MOV R1,#8EH ;写保护寄存器MOV R0,#00H ;允许写入LCALL WRITEMOV R1,#80H ;写秒寄存器MOV R0,#80H ;停止振荡器工作LCALL WRITESETB TR0K001: CALL TIME_DELAY ;校时JNB K3,K001 ;K3为位移键K010:CALL CHULIJNB 0AH,KH01MOV 54H,7FH ;送入熄灭符MOV 55H,7FHJMP KH02KH01: MOV 54H,74H ;送实时值MOV 55H,75H ;送实时值KH02: MOV R0,#TIME_DATACALL DISPMOV R0,#TIME_DATACALL TIME_DISPLAYJNB K1,K011AJNB K2,K011BJNB K3,K002JMP K010K011A:MOV A,42HADD A,#01HDA AMOV 42H,AXRL A,#24HJNZ K012AMOV 42H,#00HK012A: MOV R1,#84H ;写时寄存器MOV R0,42HLCALL WRITECALL TIME_DELAYJMP K010K011B:MOV A,42HXRL A,#00HJZ K012BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,42H ;加被减数DA A ;十进制调整MOV 42H,A ;XRL A,#00HJNZ K012CK012B: MOV 42H,#23HK012C: MOV R1,#84H ;写时寄存器MOV R0,42HLCALL WRITECALL TIME_DELAYJMP K010;-------------------------------------------------K002: CALL TIME_DELAY ;校分JNB K3,K002 ;K3为位移键K020: CALL CHULIJNB 0AH,KM013MOV 52H,7FH ;送入熄灭符MOV 53H,7FHJMP KM02KM01: MOV 52H,72H ;送实时值MOV 53H,73H ;送实时值KM02: MOV R0,#TIME_DATACALL DISPMOV R0,#TIME_DATACALL TIME_DISPLAYJNB K1,K021AJNB K2,K021BJNB K3,K003JMP K020K021A:MOV A,41HADD A,#01HDA AMOV 41H,AXRL A,#60HJNZ K022AMOV 41H,#00HK022A: MOV R1,#82H ;写分寄存器MOV R0,41HLCALL WRITECALL TIME_DELAYJMP K020;---------------------------------------------------K021B:MOV A,41HXRL A,#00HJZ K022BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,41H ;加被减数DA A ;十进制调整MOV 41H,A ;XRL A,#00HJNZ K022CK022B: MOV 41H,#59HK022C: MOV R1,#82H ;写分寄存器MOV R0,41HLCALL WRITECALL TIME_DELAYJMP K020;---------------------------------------------------K003: CALL DATE_DELAY ;校日JNB K3,K003 ;K3为位移键K030: CALL CHULIJNB 0AH,KR01MOV 60H,7FH ;送入熄灭符MOV 61H,7FHJMP KR02KR01: MOV 60H,76H ;送实时值MOV 61H,77H ;送实时值KR02: MOV R0,#DA TE_DATACALL DISPMOV R0,#DA TE_DATACALL TIME_DISPLAYJNB K1,K031AJNB K2,K031BJNB K3,K004JMP K030K031A:MOV A,43HADD A,#01HDA AMOV 43H,AXRL A,#32HJNZ K032AMOV 43H,#00HK032A: MOV R1,#86H ;写日寄存器MOV R0,43HLCALL WRITECALL DA TE_DELAYJMP K030K031B:MOV A,43HXRL A,#00HJZ K032BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,43H ;加被减数DA A ;十进制调整MOV 43H,AXRL A,#00HJNZ K032CK032B: MOV 43H,#31HK032C: MOV R1,#86H ;写日寄存器MOV R0,43HLCALL WRITECALL DA TE_DELAYJMP K030;------------------------------------------------K004: CALL DATE_DELAY ;校月JNB K3,K004 ;K3为位移键K040: CALL CHULIJNB 0AH,KC01MOV 62H,7FH ;送入熄灭符MOV 63H,7FHJMP KC02KC01: MOV 62H,78H ;送实时值MOV 63H,79H ;送实时值KC02: MOV R0,#DA TE_DATACALL DISPMOV R0,#DA TE_DATACALL TIME_DISPLAYJNB K1,K041AJNB K2,K041BJNB K3,K005JMP K040K041A:MOV A,44HADD A,#01HDA AMOV 44H,AXRL A,#13HJNZ K042AMOV 44H,#00HK042A: MOV R1,#88H ;写月寄存器MOV R0,44HLCALL WRITECALL DA TE_DELAYJMP K040K041B:MOV A,44HXRL A,#00HJZ K042BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,44H ;加被减数DA A ;十进制调整MOV 44H,A ;XRL A,#00HJNZ K042CK042B: MOV 44H,#12HK042C: MOV R1,#88H ;写月寄存器MOV R0,44HLCALL WRITECALL DA TE_DELAYJMP K0404;-----------------------------------------------K005: CALL DATE_DELAY ;校年JNB K3,K005 ;K3为位移键K050: CALL CHULIJNB 0AH,KY01MOV 64H,7FH ;送入熄灭符MOV 65H,7FHJMP KY02KY01: MOV 64H,7AH ;送实时值MOV 65H,7BH ;送实时值KY02: MOV R0,#DA TE_DATACALL DISPMOV R0,#DA TE_DATACALL TIME_DISPLAYJNB K1,K051AJNB K2,K051BJNB K3,K008JMP K050K051A:MOV A,45HADD A,#01HDA AMOV 45H,AXRL A,#9AHJNZ K052AMOV 45H,#00HK052A: MOV R1,#8CH ;写年寄存器MOV R0,45HLCALL WRITECALL DA TE_DELAYJMP K050K051B:MOV A,45HXRL A,#00HJZ K052BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,45H ;加被减数DA A ;十进制调整MOV 45H,A ;XRL A,#00HJNZ K052CK052B: MOV 45H,#99HK052C: MOV R1,#8CH ;写年寄存器MOV R0,45HLCALL WRITECALL DA TE_DELAYJMP K050;-------------------------------------------------K008: JNB K3,K008MOV R1,#80H ;写秒寄存器MOV R0,#00H ;启动振荡器工作LCALL WRITEMOV R1,#8EH ;写保护寄存器MOV R0,#80H ;禁止写入LCALL WRITECALL DA TE_DELAYCLR 0AHCLR TR0CALL BEEP_BLRET;================================================= ;定时时间设定子程序;K1为加键、K2为减键、K3为选择键;================================================= DSSET:SETB TR0DS01: LCALL DS_DELAY ;定时分设定JNB K4,$DS010: CALL DS_CHULIJNB 0AH,DS01_1MOV 58H,7FH ;送入熄灭符MOV 59H,7FHJMP DS01_2DS01_1: MOV 58H,70H ;送实时值MOV 59H,71H ;送实时值DS01_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K1,DS01A ;加键JNB K2,DS01B ;减键JNB K3,DS02JMP DS010DS01A: ;加MOV A,48HADD A,#01HDA AMOV 48H,AXRL A,#60HJNZ DS011MOV 48H,#00HDS011: LCALL DS_DELAYJMP DS010DS01B: MOV A,48H ;判48H是否为0XRL A,#00HJZ DS012SETB C ;减CLR A ;求补运算ADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,48H ;加被减数DA A ;十进制调整MOV 48H,A ;XRL A,#00HJNZ DS013DS012: MOV 48H,#59HDS013: CALL DS_DELAYJMP DS010;----------------------------------------------DS02: LCALL DS_DELAY ;定时时设定JNB K3,$DS020:CALL DS_CHULIJNB 0AH,DS02_1MOV 5AH,7FH ;送入熄灭符MOV 5BH,7FHJMP DS02_2DS02_1: MOV 5AH,72H ;送实时值MOV 5BH,73H ;送实时值DS02_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K1,DS02AJNB K2,DS02BJNB K3,DS03JMP DS020DS02A: MOV A,49H ;加ADD A,#01HDA AMOV 49H,AXRL A,#24HJNZ DS021MOV 49H,#00HDS021: LCALL DS_DELAYJMP DS020DS02B: MOV A,49H ;判49H是否为0XRL A,#00HJZ DS022SETB C ;减CLR A ;求补运算ADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,49H ;加被减数DA A ;十进制调整5MOV 49H,A ;XRL A,#00HJNZ DS023DS022: MOV 49H,#23HDS023: CALL DS_DELAYJMP DS020;-------------------------------------------DS03: CALL DS_DELAYJNB K3,$DS030: CALL DS_CHULIJNB 0AH,DS03_1MOV 5CH,7FH ;送入熄灭符JMP DS03_2DS03_1: MOV 5CH,74H ;送实时值DS03_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K3,DS04JNB K1,DS03AJMP DS030DS03A: CPL 20H.1 ;报警标记取反JNB 20H.1,DS031MOV 4AH,#01H ;报警标记=1,允许报警AJMP DS032DS031: MOV 4AH,#00H ;报警标记=0,禁止报警DS032: LCALL DS_DELAYJMP DS030;--------------------------------------------DS04: CLR TR0CLR 0AHCALL BEEP_BLLCALL DS_DELAYRET;=============================================;定时时间数据处理子程序;=============================================DS_CHULI: ;004MOV A,48H ;处理分数据ANL A,#0FHMOV 58H,AMOV 70H,AMOV A,48HANL A,#0F0HSWAP AMOV 59H,AMOV 71H,AMOV A,49H ;处理时数据ANL A,#0FHMOV 5AH,AMOV 72H,AMOV A,49HANL A,#0F0HSWAP AMOV 5BH,AMOV 73H,AMOV A,4AH ;处理定时标记ANL A,#01HMOV 5CH,AMOV 74H,ARET;================================================== ;定时时间查表取数子程序;================================================== DS_SP: ;MOV R0,#58H ;005MOV R3,#05HDS_SP1: MOV A,@R0MOV DPTR,#TAB_NUMOVC A,@A+DPTRMOV @R0,AINC R0DJNZ R3,DS_SP1RET;================================================== ;定时时间显示子程序;================================================== DS_DISPLAY: ;006;MOV R0,#58H ;取得设定显示单元首地址MOV R1,#07FH ;从第一个数码管开始MOV R2,#07H ;共7个数码管DSPLAY: MOV P0,@R0 ;获得当前单元数据MOV A,R1MOV P2,A ;数码显示JB ACC.5,DSLP1 ;第三位数码管显示“-”MOV P0,#0f7HJMP DSLP3DSLP1: JB ACC.2,DSLP2 ;第六位数码管显示“-”MOV P0,#0f7HJMP DSLP3DSLP2: INC R0DSLP3: MOV A,R1 ;为下一个数准备RR A ;下一个单元MOV R1,A ;保存LCALL DELAYDJNZ R2,DSPLAY ;重复显示,直到全部数据刷新过RET ;返回;================================================== ;实时时间与设定时间比较子程序;20H.0 止闹标记,=0,允许,=1,禁止。

相关主题