前言:
在通訊溝通頻繁的今日,相信家家戶戶都有一臺以上的電話機,您家必定發(fā)生過打完電話后未掛好而造成電話無法打進的困擾吧?;蛘吣募胰嘶蛲禄蚺笥汛螂娫捯淮蚓痛蛄嗽S久又不自知吧。
下面為您介紹一款DIY制作「免電源電話使用計時器」供您避免上述現象之產生,總共才用了12個元件(單片機1個,LED七字顯示數碼管2個,電容3個,電阻1個,橋式整流子1個,電感1個,石英晶體1個,穩(wěn)壓二極管1個,按鍵1個),相信只需要20多元及1個休息日即可組裝完成做出一個前所未有的趣味電子產品了。
特點說明:
DIY制作基本上要有著三個特點:
一看就懂:指電路簡單明了。
一買就有:指電路容易取得。
一做就成:指制作成功率高。
當您看完本篇文章之后一定會有種躍躍欲試的感覺,那么請跟著感覺走是不會錯的。整個DIY制作雖然小小的,不過特點倒是挺多項。
免用外部電源,整個DIY電子產品是利用電話線電壓來工作的,故可免除許多煩人的事(指怕停電,浪費電,體積大,成本高,配線難),在使用上沒有任何不適的感覺,也不須擔心電信局測試。
對通話品質無影響,所謂的無影響其實有著二個含意,一為無雜訊干擾,一為通話音量不增減。大家都知道多位數的LED七段顯示得用掃描方式,如此一來會有脈沖電流雜訊產生,這點對聽覺靈敏的耳朵而言是不可忽視的。另外整個電路的AC阻抗得非常的低,以免除聲音的衰減。針對這二個要求,這里介紹一個簡單又實用的電源取得電路供您參考。
LED七段顯示,非常適合夜晚來使用,同時由于亮度很夠,即使在白天也是清清楚楚,這點就是LCD顯示望塵莫及的。
LED顯示不但能做使用時間的顯示之外,也能表示電話線正被使用中,故可當未掛好話筒之提醒指示之用。
LED顯示采用最省元件的互補式,即一個LED七段顯示器為共陰,另一為共陽,如此即可直接用單片機四個I/O直接推動而得到最高亮度了。
利用OTP型單片機EM78P156來做核心控制,整個程序小小的,若您想更改或增加功能都是非常容易的。
功能說明:
當您的電話使用后沒有放置好,或者是打電話聊長天的時候給您顯示通話使用時間給予心理壓力?;旧峡伤闶怯刑嵝阎甘炯帮@示二大功能。
提醒指示:
只要LED七段顯示器點亮則表示電話線正被使用,此時不是您正在打電話就是話筒未被放置好。
顯示:
只要話筒一被拿起,電話回路被建立后單片機開始做計時及顯示動作,以分為單位,最大可顯示99分,之后又從0開始。若您要有精準的計時時可在電話通之后按CLR鍵,此時單片機清除計數從新開始計數顯示。
線路圖:
圖1線路說明:
整個線路說實在的,太小了,不過增一分則肥,減一分則瘦。還是老老實實的交待清楚吧,那么您要購買或更換電路時才不會走冤枉路。
直接從電話線路取得工作電源,見圖2 :
圖2
為一簡單的檢波器π型濾波器及基納穩(wěn)壓器所構成,經過這5個元件的打點而得到從電話端看到的是一個AC低阻抗,同時隔離了單片機掃描LED七段顯示器所衍生的雜音。另外5V的穩(wěn)壓二極管更提供了很穩(wěn)定的電源供電路使用。有二個地方需注意的是5V穩(wěn)壓二極管得選購5W以上的比較不會過熱,同時電感得選購直流內阻低的,愈低愈不會發(fā)熱。
LED七段顯示器采用一共陰極,一共陽極的,故顏色及亮度最好選相近的。
見圖3
圖3
當PORT5輸出為HIGH時,共陽極的LED七段顯示器被選到,此時PORT6輸出為LOW時LED被點亮,反之LED不會亮。當PORT5輸出為LOW時,共陽極的LED七段顯示器被選到,此時PORT6輸出為HIGH時LED被點亮,反之LED不會亮。之所以要四個I/O都并聯在一起是要保證有50mA的輸出顯示電流,不是四個并聯使用的話則顯示亮度會打折扣。
單片機部份,圖4
圖4
選用 臺灣EMC 公司的EM78P156 OTP或8位單片機,不但指令少,程序撰寫容易外,所需外部元件也是精簡得很,我們不妨看看只需一個32768Hz的石英晶體及一個助振電容就行了,另外的1K電阻是關機泄放電流用的,可避免重置失效,而CLR按鍵是用來清除顯示時間的。若您不再乎那撥號時間的誤差則可以不用此元件的。
程序列:
;
; FILE NAME:T_CARE0.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
; CIRCUIT :T_CARE0.321
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
PC == 02
RF == 03 ;STATUS
FZ == 02 ;FLAG OF ZERO
FC == 00 ;FLAG OF CARRY
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
DL == 0X10 ;DELAY LOOP
MIN == 0X11 ;MINUTE
SEC == 0X12 ;SECOND
DD == 0X13 ;DISPLAY DIGIT
DDH == 0X14 ;DISPLAY DIGIT HIGH
AB == 0X15 ;A BACK_UP
RFB == 0X16 ;RF BACK_UP
ORG 0
0000 JMP INIT ;PROGRAM START
ORG 8
;TCC INTERRUPT---------------------------------------------
TCCI:
0008 MOV AB,A ;AB <- A
0009 SWAP AB ;AB <- BA
000A SWAPA RF
000B MOV RFB,A ;RFB<- FR
000C INC SEC
CHECK:
000D MOV A,SEC
000E SUB A,@59 ;59-SEC=A
000F JBC RF,FC
0010 JMP C_MIN
0011 CLR SEC
0012 INC MIN
C_MIN:
0013 MOV A,MIN
0014 SUB A,@99 ;99-MIN=A
0015 JBS RF,FC
0016 CLR MIN
TCCE:
0017 SWAPA RFB
0018 MOV RF,A ;RF<- RFB
0019 SWAPA AB ;A <- BA
001A BC 0X0F,0 ;CLEAR TCC_INT
001B RETI
;TABLE 7 SEGEMENT------------------------------------------------------
T7:
001C ADD PC,A ; GFE DCBA
001D RETL @0B01000000 ;0 0100 0000
001E RETL @0B01111001 ;1 0111 1001
001F RETL @0B00100100 ;2 0010 0100
0020 RETL @0B00110000 ;3 0011 0000
0021 RETL @0B00011001 ;4 0001 1001
0022 RETL @0B00010010 ;5 0001 0010
0023 RETL @0B00000010 ;6 0000 0010
0024 RETL @0B01011000 ;7 0101 1000
0025 RETL @0B00000000 ;8 0000 0000
0026 RETL @0B00010000 ;9 0001 0000
;DELAY ------------------------------------------------------------------------
DELAY:
0027 MOV P5,A
0028 MOV A,@20
0029 MOV DL,A
D_1:
002A DJZ DL
002B JMP D_1
002C MOV A,@0XFF
002D IOW P6
002E RET
;INIT ------------------------------------------------------------------------------
INIT:
002F MOV A,@0X00
0030 MOV MIN,A
0031 MOV SEC,A
0032 IOW 0X0E ;DISABLE WDT
0033 IOW P5 ;PORT 5 OUTPUT
0034 IOW P6 ;PORT 6 OUTPUT
0035 MOV A,@0X01
0036 IOW 0X0F ;ENABLE TCC_INT
0037 MOV A,@0X05 ;1/64
0038 CONTW
0039 ENI
;SCAN ---------------------------------------------------------------------------
SCAN:
003A MOV A,MIN
HTD:
003B CLR DDH
H_H:
003C ADD A,@246 ;A=A-10
003D JBS RF,FC
003E JMP H_L
003F INC DDH
0040 JMP H_H
H_L:
0041 ADD A,@10
0042 CALL T7
0043 IOW P6
0044 MOV P6,A
0045 MOV A,@255 ;DISPLAY DIGIT 0
0046 CALL DELAY
0047 MOV A,DDH
0048 CALL T7
0049 IOW P6
004A XOR A,@0XFF
004B MOV P6,A
004C MOV A,@00 ;DISPLAY DIGIT 1
004D CALL DELAY
004E JMP SCAN
程序說明:
程序就像日常說話一樣,只要能夠表達清楚意思,那么,愈短愈受人歡迎(當然得在保證有正常功能的情況下而言)。此次DIY制作的軟件程序長度僅有78個指令,夠短了吧,相信看懂也不難。整個程序可以分成5個段落來做說明,寄存器使用說明:
DL ----- 子程序用寄存器
MIN ----- 存放分鐘資料寄存器
SEC ----- 存放秒鐘資料寄存器
DD ----- 存放顯示位數資料寄存器
DDH ----- 存放顯示資料寄存器
AB ----- 存放ACC的副本
RFB ----- 存放STATUS的副本
TCC中斷子程序:
從0000--001B行為每秒發(fā)生一次的TCC中斷子程序,其中0008--000B及0017--0019行為進入及離開中斷子程序的ACC及STATUS保留動作。其中000C為每進入一次中斷子程序就將SEC這寄存器予以進位。其中000D--0012為判斷SEC寄存器是否大于59,是則將MIN寄存器予以進位并清除SEC寄存器。其中0013--0016為判斷MIN寄存器是否大于99,是則將MIN寄存器予以清除,其中001A為清除TCC中斷旗標。
LED字型轉換程序:
從001C--0026行存放了字型轉換表,可將0--9的數字轉成相對的LED七字顯示器的資料。
顯示時間長度延遲程序:
從0028--002B延遲程序,而0027及002C--002D為啟動顯示及關掉顯示之指令。
微控制器啟始設定程序:
從002F--0039行對微控制器內部相關硬件做了必要性的設定動作。值得特別一提的是0035--0039行對TCC中斷記數器予以設定成每秒中斷一次。計算式如下:
系統時基/(2周期模式×1秒×256進位)而得預除數為64。
5.LED七字顯示器掃描主程序:
從003A--004E行為本軟件程序之主程序部份,又可分三部份。003C--0040行為取得MIN的拾位數之值。0042--0046行顯示MIN的個位數資料到共陽極的LED七字顯示器上。0047--004D行為顯示MIN的拾位數資料到共陰極的LED七字顯示器上。希望這短短的程序難不倒您才是。
程序撰寫步驟:
許多人習慣上撰寫程序的過程是依照「先小而大」,「先難后繁」,「邊測邊寫」等三項原則來從事的,底下便將電話使用計時器程序分成八個段落來完成。
1.先給予心跳:
一般撰寫程序碰到計時的工作時不外乎三個方式來解決:
「用TIMER計數器來產生中斷來計時」「用POLLING TIMER計數器來計時」
「用計算程序指令個數來計時」
這三個方式中以方式一最為簡單也最為準確,故這里打算最重要之秒的進位問題就交給TIMER計數器中斷方式來解決了。
TC0.ICE
;
; FILE NAME:TC0.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
ORG 0
0000 JMP INIT ;PROGRAM START
ORG 8
;TCC INTERRUPT-------------------------------------------------------
TCCI:
0008 COM P6
TCCE:
0009 BC 0X0F,0 ;CLEAR TCC_INT
000A RETI
;INIT -------------------------------------------------------------------------
INIT:
000B MOV A,@0X00
000C MOV P6,A ;PORT 6 = 0
000D IOW 0X0E ;DISABLE WDT
000E IOW P5 ;PORT 5 OUTPUT
000F IOW P6 ;PORT 6 OUTPUT
0010 MOV A,@0X01
0011 IOW 0X0F ;ENABLE TCC_INT
0012 MOV A,@0X05 ;1/64
0013 CONTW
0014 ENI
;SCAN -----------------------------------------------------------------------
SCAN:
0015 JMP SCAN
這程序的目的是欲了解TCC中斷能否滿足秒的進位問題。
程序說明:
中斷子程序:
從0008--000A行為簡單的中斷子程序,每做一次就將PORT6反向一次,離開前順便清除中斷FLAG。
微控制器起始設定程序:
起始設定是每個程序一開始必須做的,主要功能是將一些會用到的硬件部份做一起始狀態(tài)的設定以發(fā)揮充分的掌控能力。
從000B~0013行為起始設定程序
000B MOV A, @0x00 ;將A內放置零
000C MOV P6, A ;將P6內放置零
000D IOW 0x0E ;將WDT功能除能
000E IOW P5 ;將P5設為OUTPUT
000F IOW P6 ;將P6設為OUTPUT
在EM78系列中有所謂的MEMORY及I/O兩大空間,一些MEMORY空間的寄存器處理時可用MOV、BS、BC、XOR、OR……等指令,而另一些I/O空間的控制寄存器處理時可用IOW、IOR等指令,這點不要弄混了才是。
0010 MOV A, @0x01 ;將A內放置1
0011 IOW 0x0F ;僅致能TCC中斷能力
在EM78156中原本能有WDT中斷、外部中斷及TCC中斷等三種能力,如今我們只保留TCC中斷來使用。
0012 MOV A, @0x05 ;將A內放置5
0013 CONTW ;設定TCC控制寄存器
0014 ENI ;啟動中斷能力
TCC是一個很好用也很復雜的硬件線路,下面僅列出局部有關的地方于附錄供大家參考。由于系統時基是采用32768Hz的石英晶體,故本制作之準確度應該不被懷疑才是。當選用2 CYCLE及2 CLOCK的狀態(tài)時,若再將TCC設成除以64,那剛好每一秒鐘TCC發(fā)生溢位中斷一次。
掃描程序:
從0015--0015行,總共1行,僅做跳躍自身之用。
效果觀察:
程序寫到此時,倘若您手上的線路沒焊錯的話,那么您將會看到七字顯示屏幕顯示8并且以1秒亮1秒滅的速度亮滅著。
到此總共用315個指令,恭喜您的寶寶已經有心跳產生了。
2.具有七段顯示能力:
有了秒的心跳之后,接下來就是加強掃描能力,使它有著正確的顯示數字的能力。
TC1.ICE
;
; FILE NAME:TC1.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
PC == 02
RF == 03 ;STATUS
FZ == 02 ;FLAG OF ZERO
FC == 00 ;FLAG OF CARRY
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
SEC == 0X10 ;SECOND
ORG 0
0000 JMP INIT ;PROGRAM START
ORG 8
;TCC INTERRUPT----------------------------------------------
TCCI:
0008 INC SEC
TCCE:
0009 BC 0X0F,0 ;CLEAR TCC_INT
000A RETI
;TABLE 7 SEGEMENT-------------------------------------------
T7:
000B ADD PC,A ; GFE DCBA
000C RETL @0B01000000 ;0 0100 0000
000D RETL @0B01111001 ;1 0111 1001
000E RETL @0B00100100 ;2 0010 0100
000F RETL @0B00110000 ;3 0011 0000
0010 RETL @0B00011001 ;4 0001 1001
0011 RETL @0B00010010 ;5 0001 0010
0012 RETL @0B00000010 ;6 0000 0010
0013 RETL @0B01011000 ;7 0101 1000
0014 RETL @0B00000000 ;8 0000 0000
0015 RETL @0B00010000 ;9 0001 0000
;INIT -----------------------------------------------------------------
INIT:
0016 MOV A,@0X00
0017 MOV SEC,A
0018 IOW 0X0E ;DISABLE WDT
0019 IOW P5 ;PORT 5 OUTPUT
001A IOW P6 PORT 6 OUTPUT
001B MOV A,@0X01
001C IOW 0X0F ;ENABLE TCC_INT
001D MOV A,@0X05 ;1/64
001E CONTW
001F ENI
;SCAN ---------------------------------------------------------------
SCAN:
0020 MOV A,SEC
0021 CALL T7
0022 IOW P6
0023 MOV P6,A
0024 MOV A,@255 ;DISPLAY DIGIT 0
0025 MOV P5,A
0026 JMP SCAN
整個程序與TC0.ICE最大的差異就是增加了SEC計數的顯示能力,故有三處改動:
中斷子程序中有了INC SEC指令來做每秒進位的動作。
增加了LED顯示屏幕七段轉換表,從000B--0015行即為0到9的轉換表。
掃描程序功能加強:
從0020--0026行所做之事為重覆的將SEC數字經過查表后丟到P6上。為了方便了解,此時僅對數字0有做顯示動作。
效果觀察:
程序到此時您會看到個位數的七字顯示屏幕從0→9每秒進位一次。到9以后程序將會錯亂(?Why?)。
3.具有二位數的顯示能力:
能夠做七段顯示之后,各位最想看到的當然是二位數字的顯示了,由于這里采用一共陰、一共陽的七段顯示器,故處理起來還得稍費腦筋。
TC2.ICE
;
; FILE NAME:TC2.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
PC == 02
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
SEC == 0X10 ;SECOND
ORG 0
0000 JMP INIT ;PROGRAM START
ORG 8
;TCC INTERRUPT-------------------------------------------------
TCCI:
0008 INC SEC
TCCE:
0009 BC 0X0F,0 ;CLEAR TCC_INT
000A RETI
;TABLE 7 SEGEMENT-----------------------------------------
T7:
000B ADD PC,A ; GFE DCBA
000C RETL @0B01000000 ;0 0100 0000
000D RETL @0B01111001 ;1 0111 1001
000E RETL @0B00100100 ;2 0010 0100
000F RETL @0B00110000 ;3 0011 0000
0010 RETL @0B00011001 ;4 0001 1001
0011 RETL @0B00010010 ;5 0001 0010
0012 RETL @0B00000010 ;6 0000 0010
0013 RETL @0B01011000 ;7 0101 1000
0014 RETL @0B00000000 ;8 0000 0000
0015 RETL @0B00010000 ;9 0001 0000
;INIT -----------------------------------------------------------------
INIT:
0016 MOV A,@0X00
0017 MOV SEC,A
0018 IOW 0X0E ;DISABLE WDT
0019 IOW P5 ;PORT 5 OUTPUT
001A IOW P6 ;PORT 6 OUTPUT
001B MOV A,@0X01
001C IOW 0X0F ;ENABLE TCC_INT
001D MOV A,@0X05 ;1/64
001E CONTW
001F ENI
;SCAN --------------------------------------------------------------
SCAN:
0020 MOV A,SEC
0021 CALL T7
0022 IOW P6
0023 MOV P6,A
0024 MOV A,@255 ;DISPLAY DIGIT 0
0025 MOV P5,A
0026 MOV A,SEC
0027 CALL T7
0028 IOW P6
0029 XOR A,@0XFF
002A MOV P6,A
002B MOV A,@00 ;DISPLAY DIGIT 1
002C MOV P5,A
002D JMP SCAN
程序與TC1.ICE差異之處僅在掃描動作上不同罷了。
若要掃共陽的位數時,必須將PORT5外設為高電位輸出,而要亮的字劃,在PORT6外設為低電位輸入即可。若要掃共陰的位數1時,必須將PORT5外設為低電位輸出即可,而要亮的字劃,在PORT6外設為高電位輸出即可。故有了0020--0025行,位數0的顯示處理及0026--002C行,位數1的顯示處理。
效果觀察:
程序到此時您會看到二位數的七字顯示屏幕,同時從0→9每秒進位一次,到9以后程序將會錯亂(?Why?)。
具有限數能力:
以上的程序對SEC(秒)都不予限數,當然會造成CALL TABLE RETEW錯誤發(fā)生,故底下增加MIN(分)并對SEC、MIN做59及99的限數動作。
TC3.ICE
;
; FILE NAME:TC3.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
PC == 02
RF == 03 ;STATUS
FZ == 02 ;FLAG OF ZERO
FC == 00 ;FLAG OF CARRY
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
MIN == 0X10 ;MINUTE
SEC == 0X11 ;SECOND
DD == 0X12 ;DISPLAY DIGIT
DDH == 0X13 ;DISPLAY DIGIT HIGH
AB == 0X14 ;A BACK_UP
RFB == 0X15 ;RF BACK_UP
ORG 0
0000 JMP INIT ;PROGRAM START
ORG 8
;TCC INTERRUPT---------------------------------------
TCCI:
0008 MOV AB,A ;AB <- A
0009 MOV A,RF ;A <- RF
000A MOV RFB,A ;RFB<- RF
000B INC SEC
CHECK:
000C MOV A,SEC ;比較59秒
000D SUB A,@59 ;59-SEC=A
000E JBC RF,FC
000F JMP C_MIN
0010 CLR SEC
0011 INC MIN
C_MIN:
0012 MOV A,MIN ;比較99分
0013 SUB A,@99 ;99-MIN=A
0014 JBS RF,FC
0015 CLR MIN
TCCE:
0016 MOV A,RFB ;A <- RFB
0017 MOV RF,A ;RF<- RFB
0018 MOV A,AB ;A <- AB
0019 BC 0X0F,0 ;CLEAR TCC_INT
001A RETI
;TABLE 7 SEGEMENT-----------------------------------
T7:
001B ADD PC,A ; GFE DCBA
001C RETL @0B01000000 ;0 0100 0000
001D RETL @0B01111001 ;1 0111 1001
001E RETL @0B00100100 ;2 0010 0100
001F RETL @0B00110000 ;3 0011 0000
0020 RETL @0B00011001 ;4 0001 1001
0021 RETL @0B00010010 ;5 0001 0010
0022 RETL @0B00000010 ;6 0000 0010
0023 RETL @0B01011000 ;7 0101 1000
0024 RETL @0B00000000 ;8 0000 0000
0025 RETL @0B00010000 ;9 0001 0000
;INIT -----------------------------------------------
INIT:
0026 MOV A,@0X00
0027 MOV MIN,A
0028 MOV SEC,A
0029 IOW 0X0E ;DISABLE WDT
002A IOW P5 ;PORT 5 OUTPUT
002B IOW P6 ;PORT 6 OUTPUT
002C MOV A,@0X01
002D IOW 0X0F ;ENABLE TCC_INT
002E MOV A,@0X05 ;1/64
002F CONTW
0030 ENI
;SCAN -----------------------------------------------
SCAN:
0031 MOV A,MIN
HTD:
0032 CLR DDH
H_H:
0033 ADD A,@246 ;A=A-10 16進制轉10進制
0034 JBS RF,FC
0035 JMP H_L
0036 INC DDH
0037 JMP H_H
H_L:
0038 ADD A,@10
0039 CALL T7 ;顯示個位
003A IOW P6
003B MOV P6,A
003C MOV A,@255 ;DISPLAY DIGIT 0
003D MOV P5,A
003E MOV A,DDH ;顯示十位
003F CALL T7
0040 IOW P6
0041 XOR A,@0XFF
0042 MOV P6,A
0043 MOV A,@00 ;DISPLAY DIGIT 1
0044 MOV P5,A
0045 JMP SCAN
程序與TC2.ICE差異之處有下:
TCC中斷子程序部份增加了A,R3的暫存動作及SEC、MIN的限數動作。0008--000A及0016--0018行系對A及R3做暫存及復原的動作。
000C--0011行系對秒做59的比較動作,SEC比59大則SEC=0,MIN=MIN+1。
0012--0015行系對分做99的比較動作,若MIN比99大則MIN=0。
此處為何要對中斷子程序做A及R3的暫存及復原的動作呢?這是因為在主程序(SCAN)內時時會用到A及R3,及中斷子程序中也會用到A及R3之故,若不在中斷前后將A及R3的數值維持不變,那么主程序將會有錯亂的情形產生。
在掃描程序部份增加了16進制變成10進制的動作。縱然二位數字來顯示MIN(分)的訊息是可行的,然將16進制變成10進制才能符合人類的習性。0033--0038行即在做16進制轉10進制的動作,將MIN的數值拆成個位數及拾位數,并在0039--003D時顯示個位數,而在003E--0044時顯示拾位數。
效果觀察:
程序到此為止,理論上已做完該完成的所有行為了。但執(zhí)行起來….為何….為何….忽好忽壞呢???
完成正確功能:
將TC3.ICE程序左看右看,上看下看,怎么看也看不出破綻出來,但為何程序跑起來很不穩(wěn)定,忽好忽壞的呢?是ICE不穩(wěn)呢?還是程序錯誤呢?答案當然是程序錯誤。
TC4.ICE
;
; FILE NAME:TC4.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
PC == 02
RF == 03 ;STATUS
FZ == 02 ;FLAG OF ZERO
FC == 00 ;FLAG OF CARRY
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
MIN == 0X10 ;MINUTE
SEC == 0X11 ;SECOND
DD == 0X12 ;DISPLAY DIGIT
DDH == 0X13 ;DISPLAY DIGIT HIGH
AB == 0X14 ;A BACK_UP
RFB == 0X15 ;RF BACK_UP
ORG 0
0000 JMP INIT ;PROGRAM START
ORG 8
;TCC INTERRUPT-------------------------------------------------------------
TCCI:
0008 MOV AB,A ;AB <- A
0009 SWAP AB ;AB <- BA
000A SWAPA RF
000B MOV RFB,A ;RFB<- FR
000C INC SEC
CHECK:
000D MOV A,SEC
000E SUB A,@59 ;59-SEC=A
000F JBC RF,FC
0010 JMP C_MIN
0011 CLR SEC
0012 INC MIN
C_MIN:
0013 MOV A,MIN
0014 SUB A,@99 ;99-MIN=A
0015 JBS RF,FC
0016 CLR MIN
TCCE:
0017 SWAPA RFB
0018 MOV RF,A ;RF<- RFB
0019 SWAPA AB ;A <- BA
001A BC 0X0F,0 ;CLEAR TCC_INT
001B RETI
;TABLE 7 SEGEMENT-----------------------------------------------------
T7:
001C ADD PC,A ; GFE DCBA
001D RETL @0B01000000 ;0 0100 0000
001E RETL @0B01111001 ;1 0111 1001
001F RETL @0B00100100 ;2 0010 0100
0020 RETL @0B00110000 ;3 0011 0000
0021 RETL @0B00011001 ;4 0001 1001
0022 RETL @0B00010010 ;5 0001 0010
0023 RETL @0B00000010 ;6 0000 0010
0024 RETL @0B01011000 ;7 0101 1000
0025 RETL @0B00000000 ;8 0000 0000
0026 RETL @0B00010000 ;9 0001 0000
;INIT ---------------------------------------------------------------------------
INIT:
0027 MOV A,@0X00
0028 MOV MIN,A
0029 MOV SEC,A
002A IOW 0X0E ;DISABLE WDT
002B IOW P5 ;PORT 5 OUTPUT
002C IOW P6 ;PORT 6 OUTPUT
002D MOV A,@0X01
002E IOW 0X0F ;ENABLE TCC_INT
002F MOV A,@0X05 ;1/64
0030 CONTW
0031 ENI
;SCAN -------------------------------------------------------------------------
SCAN:
0032 MOV A,MIN
HTD:
0033 CLR DDH
H_H:
0034 ADD A,@246 ;A=A-10
0035 JBS RF,FC
0036 JMP H_L
0037 INC DDH
0038 JMP H_H
H_L:
0039 ADD A,@10
003A CALL T7
003B IOW P6
003C MOV P6,A
003D MOV A,@255 ;DISPLAY DIGIT 0
003E MOV P5,A
003F MOV A,DDH
0040 CALL T7
0041 IOW P6
0042 XOR A,@0XFF
0043 MOV P6,A
0044 MOV A,@00 ;DISPLAY DIGIT 1
0045 MOV P5,A
0046 JMP SCAN
原來問題就在中斷子程序的A及R3暫存及復原這部份。
原來程序在A及R3的暫存部份:
0008 MOV AB, A ;AB←A
0009 MOV A, RF ;A←RF
000A MOV RFB, A ;RFB←RF
錯就錯在0009時MOV A, RF指令會破壞ZERO FLAG的資料。故改變指令的用法即可恢復正常,新的程序在A及R3的暫存部份:
0008 MOV AB, A ;AB←A
0009 SWAP AB
000A SWAPA RF
000B MOV RFB, A ;RFB←FR
新的程序在A及R3的復原部份:
0017 SWAPA RFB
0018 MOV RF, A ;RF←RFB
0019 SWAPA AB ;A←BA
動作有點別扭,但是好用得很,請盡量用。
效果觀察:
此時此刻的您一定是歡喜異常,眼睛看著分鐘一分一分的增加又不死機,剛才緊繃的心情頓時得到解脫,一切的心血總算有了回報了。
增加花招:
拿著半成品把玩半天總覺得有些不夠完美的,原來是一分鐘才變化一次會讓人覺得成品好像沒在正常工作,總是懷疑成品是死的,好吧,再動些手腳將秒的閃爍呈現在七段的小數點上以滿足動感要求。
TC5.ICE
;
; FILE NAME:TC5.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
PC == 02
RF == 03 ;STATUS
FZ == 02 ;FLAG OF ZERO
FC == 00 ;FLAG OF CARRY
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
DL == 0X10 ;DELAY LOOP
MIN == 0X11 ;MINUTE
SEC == 0X12 ;SECOND
DD == 0X13 ;DISPLAY DIGIT
DDH == 0X14 ;DISPLAY DIGIT HIGH
AB == 0X15 ;A BACK_UP
RFB == 0X16 ;RF BACK_UP
FG == 0X17 ;FLAG
ORG 0
0000 JMP INIT ;PROGRAM START
ORG 8
;TCC INTERRUPT---------------------------------------------------------------
TCCI:
0008 MOV AB,A ;AB <- A
0009 SWAP AB ;AB <- BA
000A SWAPA RF
000B MOV RFB,A ;RFB<- FR
000C COM FG
000D INC SEC
CHECK:
000E MOV A,SEC
000F SUB A,@59 ;59-SEC=A
0010 JBC RF,FC
0011 JMP C_MIN
0012 CLR SEC
0013 INC MIN
C_MIN:
0014 MOV A,MIN
0015 SUB A,@99 ;99-MIN=A
0016 JBS RF,FC
0017 CLR MIN
TCCE:
0018 SWAPA RFB
0019 MOV RF,A ;RF<- RFB
001A SWAPA AB ;A <- BA
001B BC 0X0F,0 ;CLEAR TCC_INT
001C RETI
;TABLE 7 SEGEMENT------------------------------------------------------
T7:
001D CALL TABLE ;用來增加小數點閃爍
001E JBC FG,00
001F XOR A,@0X80
0020 RET
;TABLE -------------------------------------------------------------------------
TABLE:
0021 ADD PC,A ; GFE DCBA
0022 RETL @0B01000000 ;0 0100 0000
0023 RETL @0B01111001 ;1 0111 1001
0024 RETL @0B00100100 ;2 0010 0100
0025 RETL @0B00110000 ;3 0011 0000
0026 RETL @0B00011001 ;4 0001 1001
0027 RETL @0B00010010 ;5 0001 0010
0028 RETL @0B00000010 ;6 0000 0010
0029 RETL @0B01011000 ;7 0101 1000
002A RETL @0B00000000 ;8 0000 0000
002B RETL @0B00010000 ;9 0001 0000
;INIT -----------------------------------------------------------------------------
INIT:
002C MOV A,@0X00
002D MOV MIN,A
002E MOV SEC,A
002F IOW 0X0E ;DISABLE WDT
0030 IOW P5 ;PORT 5 OUTPUT
0031 IOW P6 ;PORT 6 OUTPUT
0032 MOV A,@0X01
0033 IOW 0X0F ;ENABLE TCC_INT
0034 MOV A,@0X05 ;1/64
0035 CONTW
0036 ENI
;SCAN ------------------------------------------------------------------------------
SCAN:
0037 MOV A,MIN
HTD:
0038 CLR DDH
H_H:
0039 ADD A,@246 ;A=A-10
003A JBS RF,FC
003B JMP H_L
003C INC DDH
003D JMP H_H
H_L:
003E ADD A,@10
003F CALL T7
0040 IOW P6
0041 MOV P6,A
0042 MOV A,@255 ;DISPLAY DIGIT 0
0043 MOV P5,A
0044 MOV A,DDH
0045 CALL T7
0046 IOW P6
0047 XOR A,@0XFF
0048 MOV P6,A
0049 MOV A,@00 ;DISPLAY DIGIT 1
004A MOV P5,A
004B JMP SCAN
要如何增加小數點秒的閃爍呢?其實看結果一點也不困難(話雖如此卻也著實的傷了好幾條的腦筋)。
增加001D~0020這四行程序就可迎刃而解了。
效果觀察:
看著一秒亮一秒滅的成品,此時此刻僅可用一個”爽”字來形容心情,愈來愈覺得其實單片機制作并不是高不可及啊!
7.好上加好:
如果用示波器來看看制作成果的良好程度時,可以看到顯示周期比才近50%左右,讓人總覺得可惜,倘若能夠讓顯示周期比接近100%不亦快哉!
再動手改吧.
TC6.ICE
;
; FILE NAME:TC6.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
PC == 02
RF == 03 ;STATUS
FZ == 02 ;FLAG OF ZERO
FC == 00 ;FLAG OF CARRY
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
DL == 0X10 ;DELAY LOOP
MIN == 0X11 ;MINUTE
SEC == 0X12 ;SECOND
DD == 0X13 ;DISPLAY DIGIT
DDH == 0X14 ;DISPLAY DIGIT HIGH
AB == 0X15 ;A BACK_UP
RFB == 0X16 ;RF BACK_UP
FG == 0X17 ;FLAG
ORG 0
0000 JMP INIT ;PROGRAM START
ORG 8
;TCC INTERRUPT-----------------------------------------------------------------
TCCI:
0008 MOV AB,A ;AB <- A
0009 SWAP AB ;AB <- BA
000A SWAPA RF
000B MOV RFB,A ;RFB<- FR
000C COM FG
000D INC SEC
CHECK:
000E MOV A,SEC
000F SUB A,@59 ;59-SEC=A
0010 JBC RF,FC
0011 JMP C_MIN
0012 CLR SEC
0013 INC MIN
C_MIN:
0014 MOV A,MIN
0015 SUB A,@99 ;99-MIN=A
0016 JBS RF,FC
0017 CLR MIN
TCCE:
0018 SWAPA RFB
0019 MOV RF,A ;RF<- RFB
001A SWAPA AB ;A <- BA
001B BC 0X0F,0 ;CLEAR TCC_INT
001C RETI
;TABLE 7 SEGEMENT--------------------------------------------------------
T7:
001D CALL TABLE
001E JBC FG,00
001F XOR A,@0X80
0020 RET
;TABLE ----------------------------------------------------------------------------
TABLE:
0021 ADD PC,A ; GFE DCBA
0022 RETL @0B01000000 ;0 0100 0000
0023 RETL @0B01111001 ;1 0111 1001
0024 RETL @0B00100100 ;2 0010 0100
0025 RETL @0B00110000 ;3 0011 0000
0026 RETL @0B00011001 ;4 0001 1001
0027 RETL @0B00010010 ;5 0001 0010
0028 RETL @0B00000010 ;6 0000 0010
0029 RETL @0B01011000 ;7 0101 1000
002A RETL @0B00000000 ;8 0000 0000
002B RETL @0B00010000 ;9 0001 0000
;DELAY ----------------------------------------------------------------------------
DELAY:
002C MOV P5,A ;增加顯示時間之比
002D MOV A,@20
002E MOV DL,A
D_1:
002F DJZ DL
0030 JMP D_1
0031 MOV A,@0XFF
0032 IOW P6
0033 RET
;INIT --------------------------------------------------------------------------------
INIT:
0034 MOV A,@0X00
0035 MOV MIN,A
0036 MOV SEC,A
0037 IOW 0X0E ;DISABLE WDT
0038 IOW P5 ;PORT 5 OUTPUT
0039 IOW P6 ;PORT 6 OUTPUT
003A MOV A,@0X01
003B IOW 0X0F ;ENABLE TCC_INT
003C MOV A,@0X05 ;1/64
003D CONTW
003E ENI
;SCAN -----------------------------------------------------------------------------
SCAN:
003F MOV A,MIN
HTD:
0040 CLR DDH
H_H:
0041 ADD A,@246 ;A=A-10
0042 JBS RF,FC
0043 JMP H_L
0044 INC DDH
0045 JMP H_H
H_L:
0046 ADD A,@10
0047 CALL T7
0048 IOW P6
0049 MOV P6,A
004A MOV A,@255 ;DISPLAY DIGIT 0
004B CALL DELAY
004C MOV A,DDH
004D CALL T7
004E IOW P6
004F XOR A,@0XFF
0050 MOV P6,A
0051 MOV A,@00 ;DISPLAY DIGIT 1
0052 CALL DELAY
0053 JMP SCAN
人的眼眼睛實在很容易被欺騙,只要掃描頻率大于30Hz其實已經看不到閃爍的現象,故在不產生閃爍的現象中如何增加顯示周期比呢?
增加顯示時之時間,故這里增加了一個DELAY子程序(002C--0033行所示)供掃描顯示時呼叫之用。固定的在個位數及拾位數顯示時各呼叫一次來增加顯示周期比。
效果觀察:
增加了DELAY子程序之后約可提升亮度一倍左右。
8.要善始善終-----永不死機:
正當要關掉ICE準備燒寫OTP的時候,仔細想想程序才那么小小的,留那么多的空白做什么?不妨拿來「增加穩(wěn)定度」之用。
還要動手.?
TC7.ICE
;
; FILE NAME:TC7.DT
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
IAR == 00 ;INDIRECT AR
PC == 02
RF == 03 ;STATUS
RSR == 04 ;RAM SELECTOR
FZ == 02 ;FLAG OF ZERO
FC == 00 ;FLAG OF CARRY
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
DL == 0X10 ;DELAY LOOP
MIN == 0X11 ;MINUTE
SEC == 0X12 ;SECOND
DD == 0X13 ;DISPLAY DIGIT
DG == 0X14 ;DISPLAY DIGIT HIGH DG=DD=DDH
AB == 0X15 ;A BACK_UP
RFB == 0X16 ;RF BACK_UP
FG == 0X17 ;FLAG
ORG 0
0000 JMP INIT ;PROGRAM START
// // // //
0007 JMP INIT ;PROGRAM START
;TCC INTERRUPT-------------------------------------------------------------
TCCI:
0008 MOV AB,A ;AB <- A
0009 SWAP AB ;AB <- BA
000A SWAPA RF
000B MOV RFB,A ;RFB<- FR
000C COM FG
000D INC SEC
CHECK:
000E MOV A,SEC
000F SUB A,@59 ;59-SEC=A
0010 JBC RF,FC
0011 JMP C_MIN
0012 CLR SEC
0013 INC MIN
C_MIN:
0014 MOV A,MIN
0015 SUB A,@99 ;99-MIN=A
0016 JBS RF,FC
0017 CLR MIN
TCCE:
0018 SWAPA RFB
0019 MOV RF,A ;RF<- RFB
001A SWAPA AB ;A <- BA
001B BC 0X0F,0 ;CLEAR TCC_INT
001C RETI
001D JMP INIT ;PROGRAM START
// // // //
0028 JMP INIT ;PROGRAM START
;TABLE 7 SEGEMENT-------------------------------------------------------
T7:
0029 CALL TABLE
002A JBC FG,00
002B XOR A,@0X80
002C RET
002D JMP INIT ;PROGRAM START
// // // //
003B JMP INIT ;PROGRAM START
;TABLE ---------------------------------------------------------------------------
TABLE:
003C ADD PC,A ; GFE DCBA
003D RETL @0B01000000 ;0 0100 0000
003E RETL @0B01111001 ;1 0111 1001
003F RETL @0B00100100 ;2 0010 0100
0040 RETL @0B00110000 ;3 0011 0000
0041 RETL @0B00011001 ;4 0001 1001
0042 RETL @0B00010010 ;5 0001 0010
0043 RETL @0B00000010 ;6 0000 0010
0044 RETL @0B01011000 ;7 0101 1000
0045 RETL @0B00000000 ;8 0000 0000
0046 RETL @0B00010000 ;9 0001 0000
0047 JMP INIT ;PROGRAM START
// // // //
0055 JMP INIT ;PROGRAM START
;DELAY ---------------------------------------------------------------------------
DELAY:
0056 WDTC
0057 MOV P5,A
0058 MOV A,@00
0059 IOW P5
005A MOV A,@0X3F
005B MOV RSR,A
005C MOV A,@0X1F
005D MOV DL,A
005E CLRA
DELAY1:
005F ADD A,IAR
0060 DEC RSR
0061 DJZ DL
0062 JMP DELAY1
0063 OR A,@00
0064 JBS RF,FZ
0065 JMP INIT ;PROGRAM START
0066 MOV A,@0XFF
0067 IOW P6
0068 RET
0069 JMP INIT ;PROGRAM START
// // // //
007F JMP INIT ;PROGRAM START
;INIT -------------------------------------------------------------------------------
INIT:
0080 MOV A,@0X3F
0081 MOV RSR,A
0082 MOV A,@0X2F
0083 MOV DL,A
INIT1:
0084 CLR IAR
0085 DEC RSR
0086 DJZ DL
0087 JMP INIT1
0088 MOV A,@0X00
0089 IOW P5 ;PORT 5 OUTPUT
008A IOW P6 ;PORT 6 OUTPUT
008B MOV A,@0X80
008C IOW 0X0E ;ENABLE WDT
008D MOV A,@0X01
008E IOW 0X0F ;ENABLE TCC_INT
008F MOV A,@0X05 ;1/64
0090 CONTW
0091 ENI
0092 JMP SCAN
0093 JMP INIT ;PROGRAM START
// // // //
00B8 JMP INIT ;PROGRAM START
;SCAN -----------------------------------------------------------------------------
SCAN:
00B9 MOV A,MIN
HTD:
00BA CLR DG
H_H:
00BB ADD A,@246 ;A=A-10
00BC JBS RF,FC
00BD JMP H_L
00BE INC DDH
00BF JMP H_H
H_L:
00C0 ADD A,@10
00C1 CALL T7
00C2 IOW P6
00C3 MOV P6,A
00C4 MOV A,@255 ;DISPLAY DIGIT 0
00C5 CALL DELAY
00C6 MOV A,DG
00C7 CALL T7
00C8 IOW P6
00C9 XOR A,@0XFF
00CA MOV P6,A
00CB MOV A,@00 ;DISPLAY DIGIT 1
00CC CALL DELAY
00CD JMP SCAN
00CE JMP INIT ;PROGRAM START
// // // //
03FF JMP INIT ;PROGRAM START
與TC6.ICE程序的差異之處:
在每個程序的段落「加入JMP INIT」指令。
在程序節(jié)結尾以后「加入JMP INIT」指令。
如此一來,不論IC何時死機錯亂都會跳到開始來執(zhí)行了。
加入WATCH DOG TIMER:
來避免程序的錯誤而造成死LOOP現象。
加入錯誤偵測能力:
利用剩余的寄存器來做引子,隨時去讀取這些寄存器,若和不為零則代表錯誤發(fā)生了,應該重新開始。
效果觀察:
不論如何故意的去弄死機都會從頭開始正常執(zhí)行程序了,大功告成??梢约由夏J為漂亮合適的外殼,投入使用了。
附源程序:dhsyjsq.dt
;
; FILE NAME:dhsyjsq.dt
; DATE :1999,5,5
; BY :HWANG JYN_GUO
;
; FUNCTION DESCRIPTION:
; USING TCC TO GET 1 SEC INTERRUPT
; 32768/(2*64*256)= 1 SEC
; CRYSTAL MODE 32768 Hz
; 2 CYCLE AND 2 CLOCK MODE
;
IAR == 00 ;INDIRECT AR
PC == 02
RF == 03 ;STATUS
RSR == 04 ;RAM SELECTOR
FZ == 02 ;FLAG OF ZERO
FC == 00 ;FLAG OF CARRY
P5 == 0X05 ;PORT 5
P6 == 0X06 ;PORT 6
DL == 0X10 ;DELAY LOOP
MIN == 0X11 ;MINUTE
SEC == 0X12 ;SECOND
DD == 0X13 ;DISPLAY DIGIT
DG == 0X14 ;DISPLAY DIGIT HIGH DG=DD=DDH
AB == 0X15 ;A BACK_UP
RFB == 0X16 ;RF BACK_UP
FG == 0X17 ;FLAG
ORG 0000
JMP INIT ;PROGRAM START
JMP INIT ;PROGRAM START
;TCC INTERRUPT-------------------------------------------------------------
TCCI:
MOV AB,A ;AB <- A
SWAP AB ;AB <- BA
SWAPA RF
MOV RFB,A ;RFB<- FR
COM FG
INC SEC
CHECK:
MOV A,SEC
SUB A,@59 ;59-SEC=A
JBC RF,FC
JMP C_MIN
CLR SEC
INC MIN
C_MIN:
MOV A,MIN
SUB A,@99 ;99-MIN=A
JBS RF,FC
CLR MIN
TCCE:
SWAPA RFB
MOV RF,A ;RF<- RFB
SWAPA AB ;A <- BA
BC 0X0F,0 ;CLEAR TCC_INT
RETI
JMP INIT ;PROGRAM START
JMP INIT ;PROGRAM START
;TABLE 7 SEGEMENT-------------------------------------------------------
T7:
CALL TABLE
JBC FG,00
XOR A,@0X80
RET
JMP INIT ;PROGRAM START
JMP INIT ;PROGRAM START
;TABLE ---------------------------------------------------------------------------
TABLE:
ADD PC,A ; GFE DCBA
RETL @0B01000000 ;0 0100 0000
RETL @0B01111001 ;1 0111 1001
RETL @0B00100100 ;2 0010 0100
RETL @0B00110000 ;3 0011 0000
RETL @0B00011001 ;4 0001 1001
RETL @0B00010010 ;5 0001 0010
RETL @0B00000010 ;6 0000 0010
RETL @0B01011000 ;7 0101 1000
RETL @0B00000000 ;8 0000 0000
RETL @0B00010000 ;9 0001 0000
JMP INIT ;PROGRAM START
JMP INIT ;PROGRAM START
;DELAY ---------------------------------------------------------------------------
DELAY:
WDTC
MOV P5,A
MOV A,@00
IOW P5
MOV A,@0X3F
MOV RSR,A
MOV A,@0X1F
MOV DL,A
CLRA
DELAY1:
ADD A,IAR
DEC RSR
DJZ DL
JMP DELAY1
OR A,@00
JBS RF,FZ
JMP INIT ;PROGRAM START
MOV A,@0XFF
IOW P6
RET
JMP INIT ;PROGRAM START
JMP INIT ;PROGRAM START
;INIT -------------------------------------------------------------------------------
INIT:
MOV A,@0X3F
MOV RSR,A
MOV A,@0X2F
MOV DL,A
INIT1:
CLR IAR
DEC RSR
DJZ DL
JMP INIT1
MOV A,@0X00
IOW P5 ;PORT 5 OUTPUT
IOW P6 ;PORT 6 OUTPUT
MOV A,@0X80
IOW 0X0E ;ENABLE WDT
MOV A,@0X01
IOW 0X0F ;ENABLE TCC_INT
MOV A,@0X05 ;1/64
CONTW
ENI
JMP SCAN
JMP INIT ;PROGRAM START
JMP INIT ;PROGRAM START
;SCAN -----------------------------------------------------------------------------
SCAN:
MOV A,MIN
HTD:
CLR DG
H_H:
ADD A,@246 ;A=A-10
JBS RF,FC
JMP H_L
INC DDH
JMP H_H
H_L:
ADD A,@10
CALL T7
IOW P6
MOV P6,A
MOV A,@255 ;DISPLAY DIGIT 0
CALL DELAY
MOV A,DG
CALL T7
IOW P6
XOR A,@0XFF
MOV P6,A
MOV A,@00 ;DISPLAY DIGIT 1
CALL DELAY
JMP SCAN
JMP INIT ;PROGRAM START
JMP INIT ;PROGRAM START