這是根某個共陽極數碼管的程序修改來的,替換為了陰極數碼管,對程序也進行了相應的改動,但顯示時間時無法按照應有的順序進行正常的顯示,求助各位大神,希望能指出被我忽略的錯誤和有效的思路。
51hei.png (19.89 KB, 下載次數: 23)
下載附件
2019-12-14 13:14 上傳
單片機源程序如下:
- ORG 0000H
- AJMP MAIN
- ORG 000BH
- LJMP INTT0
- ORG 0030H
- MAIN:
- MOV SP,#60H ;確立堆棧區
- MOV PSW,#00H
- MOV R0,#20H ;RAM區首地址
- MOV R7,#5FH ;RAM區單元個數
- QL:
- MOV @R0,#00H ;RAM清零
- INC R0
- DJNZ R7,QL
- MOV IP,#02H ;IP初始化,優先定時器0
- MOV IE,#82H ;IE初始化
- MOV TMOD,#01H ;定時器0方式1工作
- LCALL PP ;調P.子程序
- NEXT:
- LCALL KEY ;按鍵檢測子程序
- JB ACC.0,RUNF ;A鍵按下運行
- LCALL DISP ;調用顯示子程序
- SJMP NEXT
- RUNF:
- LCALL OUTT ;調傳送子程序
- LCALL TIME ;開電子鐘
- JK:
- LCALL DISP
- LCALL KEY
- JZ JK
- LCALL ANKEY ;調用鍵功能子程序
- LCALL DISP
- SJMP JK
- ;P點顯示的8LED段碼初始化子程序
- PP:
- MOV 37H,#12 ;P點編碼送寄存器,對應最左LED (共陽極,0CH )
- MOV R0,#30H ;第8個LED,最右LED,段碼存儲的地址
- MOV R7,#07H ;第8到第2個LED,共7個,初始化段碼顯示空白
- PPP:
- MOV @R0,#10 ;顯示空白
- INC R0
- DJNZ R7,PPP
- RET
- ;鍵掃描子程序
- KEY:
- LCALL KEYS ;調用鍵值處理子程序
- JZ EXIT ;沒有鍵按下轉到返回
- LCALL DISP
- LCALL DISP ;調用顯示去抖動
- LCALL KEYS
- JZ EXIT
- MOV B,20H ;保存鍵值
- KEYSF:
- LCALL KEYS
- JZ KEYY ;鍵釋放,轉到恢復鍵值
- LCALL DISP ;調顯示子程序延時
- AJMP KEYSF ;等到鍵釋放
- KEYY:
- MOV A,B ;鍵值送A
- EXIT:RET
- KEYS:
- MOV P1,#0FFH ;先向P1口寫1
- MOV A,P1 ;P1口值送A (有按鍵按下,對應0,取反后1)
- CPL A
- ANL A,#0FH ;保存P1口的低4位
- MOV 20H,A ;A值送20H保存
- RET
- ;鍵功能子程序
- ANKEY:
- CLR EA ;關中斷
- CHECK:
- JB TR0,YXZ ;判斷是否運行
- K0:
- CJNE A,#01H,K1
- AJMP RUN ;A鍵按下,恢復運行,轉運行
- K1:
- CJNE A,#02H,K2
- AJMP KEY1 ;轉時調整
- K2:
- CJNE A,#40H,K3
- AJMP KEY2 ;轉分調整
- K3:
- CJNE A,#08H,OUT ;轉
- AJMP KEY3 ;轉秒調整
- YXZ:
- JB ACC.0,STOP ;A鍵按下,暫停
- AJMP OUT
- KEY1:
- MOV R0,#45H ;時調整
- LCALL ADD1 ;調加一子程序
- CLR C
- CJNE A,#24H,OUTT ;轉傳送顯示數據子程序
- ACALL CLR0 ;調時間清理子程序
- AJMP OUTT
- KEY2:
- MOV R0,#43H ;分調整
- LCALL ADD1
- CLR C
- CJNE A,#60H,OUTT
- ACALL CLR0
- AJMP OUTT
- KEY3:
- MOV R0,#41H ;秒調整
- ACALL ADD1
- CLR C
- CJNE A,#60H,OUTT
- ACALL CLR0
- ;傳送顯示數據子程序
- OUTT:
- MOV 30H,40H ;秒顯示單元40H-41H
- MOV 31H,41H
- MOV 32H,#11 ;"-"
- MOV 33H,42H ;分顯示單元42H-43H
- MOV 34H,43H
- MOV 35H,#11 ;"-"
- MOV 36H,44H ;時顯示單元44H-45H
- MOV 37H,45H
- RET
- STOP:
- CLR TR0
- RET
- RUN:
- LCALL TIME ;調運行電子鐘子程序
- OUT:
- SETB EA ;無鍵按下或完成功能跳出
- RET
- ;運行電子鐘子程序
- TIME:
- SETB EA
- MOV TL0,#0B0H ;3CB0H
- MOV TH0,#3CH
- MOV R4,#20 ;50ms,20次循環
- SETB TR0 ;啟動定時器0
- RET
- ;定時器0中斷處理子程序
- INTT0:
- PUSH ACC
- PUSH PSW
- CLR ET0
- CLR TR0
- MOV TL0,#0B0H ;重新設置定時初值
- MOV TH0,#3CH
- SETB TR0
- DJNZ R4,OUTT0 ;r4-1 != 0 1秒未到,轉OUTTO
- ADDSS:
- MOV R4,#14H ;20次計數
- MOV R0,#41H ;秒十位
- ACALL ADD1
- CLR C
- CJNE A,#60H,ADDMM ;1分到
- ADDMM:
- JC OUTT0 ;1分,60秒未到
- ACALL CLR0 ;1分到,清零
- MOV R0,#43H ;分十位
- ACALL ADD1
- CLR C
- CJNE A,#60H,ADDHH ;1小時到
- ADDHH:
- JC OUTT0
- ACALL CLR0
- MOV R0,#45H ;時十位
- ACALL ADD1
- CLR C
- CJNE A,#24H,HOUR ;1天到
- HOUR:
- JC OUTT0
- ACALL CLR0
- OUTT0:
- MOV 30H,40H ;秒顯示單元40H-41H
- MOV 31H,41H
- MOV 32H,#11 ;"-"
- MOV 33H,42H ;分顯示單元42H-43H
- MOV 34H,43H
- MOV 35H,#11 ;"-"
- MOV 36H,44H ;時顯示單元44H-45H
- MOV 37H,45H
- POP PSW
- POP ACC
- SETB ET0
- RETI
- ;時間清理子程序
- CLR0:
- CLR A
- MOV @R0,A
- DEC R0
- MOV @R0,A
- RET
- ;加一子程序
- ADD1:
- MOV A ,@R0 ;取十位
- DEC R0
- SWAP A
- ORL A,@R0 ;組合十位與個位
- ADD A,#01H ;加1
- DA A ;十進制調整
- MOV R3,A ;暫存
- ANL A,#0FH ;屏蔽十位
- MOV @R0,A ;放入個位單元
- MOV A,R3 ;取值
- INC R0
- SWAP A
- ANL A,#0FH ;屏蔽個位
- MOV @R0,A ;放入十位單元
- MOV A,R3
- RET
- DISP:
- MOV R1,#30H
- MOV R2,#01H
- DISP1:
- MOV P2,R2
- MOV A,@R1
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV P0,A
- CPL P0.0
- CPL P0.1
- CPL P0.2
- CPL P0.3
- CPL P0.4
- CPL P0.5
- CPL P0.6
- CPL P0.7
- ACALL DL
- MOV A,R2
- JB ACC.7,DISP2
- RL A
- INC R1
- MOV R2,A
- AJMP DISP1
- DISP2:RET
- TAB:DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,0FFH,0BFH,0CH
- DL:
- MOV R6,#14H
- DL1:
- MOV R7,#19H
- DL2:
- DJNZ R7,DL2
- DJNZ R6,DL1
- RET
- END
復制代碼
全部資料51hei下載地址:
shizhong.rar
(30.47 KB, 下載次數: 8)
2019-12-14 12:13 上傳
點擊文件名下載附件
|