當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]下面為您介紹一款DIY制作「免電源電話使用計(jì)時(shí)器」供您避免上述現(xiàn)象之產(chǎn)生,總共才用了12個(gè)元件(單片機(jī)1個(gè),LED七字顯示數(shù)碼管2個(gè),電容3個(gè),電阻1個(gè),橋式整流子1個(gè),電感1個(gè),石英晶體1個(gè),穩(wěn)壓二極管1個(gè),按鍵1個(gè)),相信只需要20多元及1個(gè)休息日即可組裝完成做出一個(gè)前所未有的趣味電子產(chǎn)品了。

  
 前言: 
    在通訊溝通頻繁的今日,相信家家戶戶都有一臺(tái)以上的電話機(jī),您家必定發(fā)生過(guò)打完電話后未掛好而造成電話無(wú)法打進(jìn)的困擾吧?;蛘吣募胰嘶蛲禄蚺笥汛螂娫捯淮蚓痛蛄嗽S久又不自知吧。


    下面為您介紹一款DIY制作「免電源電話使用計(jì)時(shí)器」供您避免上述現(xiàn)象之產(chǎn)生,總共才用了12個(gè)元件(單片機(jī)1個(gè),LED七字顯示數(shù)碼管2個(gè),電容3個(gè),電阻1個(gè),橋式整流子1個(gè),電感1個(gè),石英晶體1個(gè),穩(wěn)壓二極管1個(gè),按鍵1個(gè)),相信只需要20多元及1個(gè)休息日即可組裝完成做出一個(gè)前所未有的趣味電子產(chǎn)品了。


 特點(diǎn)說(shuō)明: 
DIY制作基本上要有著三個(gè)特點(diǎn):
一看就懂:指電路簡(jiǎn)單明了。
一買(mǎi)就有:指電路容易取得。
一做就成:指制作成功率高。
當(dāng)您看完本篇文章之后一定會(huì)有種躍躍欲試的感覺(jué),那么請(qǐng)跟著感覺(jué)走是不會(huì)錯(cuò)的。整個(gè)DIY制作雖然小小的,不過(guò)特點(diǎn)倒是挺多項(xiàng)。 
免用外部電源,整個(gè)DIY電子產(chǎn)品是利用電話線電壓來(lái)工作的,故可免除許多煩人的事(指怕停電,浪費(fèi)電,體積大,成本高,配線難),在使用上沒(méi)有任何不適的感覺(jué),也不須擔(dān)心電信局測(cè)試。 
對(duì)通話品質(zhì)無(wú)影響,所謂的無(wú)影響其實(shí)有著二個(gè)含意,一為無(wú)雜訊干擾,一為通話音量不增減。大家都知道多位數(shù)的LED七段顯示得用掃描方式,如此一來(lái)會(huì)有脈沖電流雜訊產(chǎn)生,這點(diǎn)對(duì)聽(tīng)覺(jué)靈敏的耳朵而言是不可忽視的。另外整個(gè)電路的AC阻抗得非常的低,以免除聲音的衰減。針對(duì)這二個(gè)要求,這里介紹一個(gè)簡(jiǎn)單又實(shí)用的電源取得電路供您參考。 
LED七段顯示,非常適合夜晚來(lái)使用,同時(shí)由于亮度很夠,即使在白天也是清清楚楚,這點(diǎn)就是LCD顯示望塵莫及的。 
LED顯示不但能做使用時(shí)間的顯示之外,也能表示電話線正被使用中,故可當(dāng)未掛好話筒之提醒指示之用。 
LED顯示采用最省元件的互補(bǔ)式,即一個(gè)LED七段顯示器為共陰,另一為共陽(yáng),如此即可直接用單片機(jī)四個(gè)I/O直接推動(dòng)而得到最高亮度了。 
利用OTP型單片機(jī)EM78P156來(lái)做核心控制,整個(gè)程序小小的,若您想更改或增加功能都是非常容易的。 


 功能說(shuō)明:
當(dāng)您的電話使用后沒(méi)有放置好,或者是打電話聊長(zhǎng)天的時(shí)候給您顯示通話使用時(shí)間給予心理壓力。基本上可算是有提醒指示及顯示二大功能。 


 提醒指示: 
只要LED七段顯示器點(diǎn)亮則表示電話線正被使用,此時(shí)不是您正在打電話就是話筒未被放置好。


 顯示: 
只要話筒一被拿起,電話回路被建立后單片機(jī)開(kāi)始做計(jì)時(shí)及顯示動(dòng)作,以分為單位,最大可顯示99分,之后又從0開(kāi)始。若您要有精準(zhǔn)的計(jì)時(shí)時(shí)可在電話通之后按CLR鍵,此時(shí)單片機(jī)清除計(jì)數(shù)從新開(kāi)始計(jì)數(shù)顯示。


 線路圖: 


圖1線路說(shuō)明:


整個(gè)線路說(shuō)實(shí)在的,太小了,不過(guò)增一分則肥,減一分則瘦。還是老老實(shí)實(shí)的交待清楚吧,那么您要購(gòu)買(mǎi)或更換電路時(shí)才不會(huì)走冤枉路。 
直接從電話線路取得工作電源,見(jiàn)圖2 :

 
 
圖2


為一簡(jiǎn)單的檢波器π型濾波器及基納穩(wěn)壓器所構(gòu)成,經(jīng)過(guò)這5個(gè)元件的打點(diǎn)而得到從電話端看到的是一個(gè)AC低阻抗,同時(shí)隔離了單片機(jī)掃描LED七段顯示器所衍生的雜音。另外5V的穩(wěn)壓二極管更提供了很穩(wěn)定的電源供電路使用。有二個(gè)地方需注意的是5V穩(wěn)壓二極管得選購(gòu)5W以上的比較不會(huì)過(guò)熱,同時(shí)電感得選購(gòu)直流內(nèi)阻低的,愈低愈不會(huì)發(fā)熱。


LED七段顯示器采用一共陰極,一共陽(yáng)極的,故顏色及亮度最好選相近的。

 

見(jiàn)圖3  
 
圖3


當(dāng)PORT5輸出為HIGH時(shí),共陽(yáng)極的LED七段顯示器被選到,此時(shí)PORT6輸出為L(zhǎng)OW時(shí)LED被點(diǎn)亮,反之LED不會(huì)亮。當(dāng)PORT5輸出為L(zhǎng)OW時(shí),共陽(yáng)極的LED七段顯示器被選到,此時(shí)PORT6輸出為HIGH時(shí)LED被點(diǎn)亮,反之LED不會(huì)亮。之所以要四個(gè)I/O都并聯(lián)在一起是要保證有50mA的輸出顯示電流,不是四個(gè)并聯(lián)使用的話則顯示亮度會(huì)打折扣。
單片機(jī)部份,圖4 

 
 
圖4


選用 臺(tái)灣EMC 公司的EM78P156 OTP或8位單片機(jī),不但指令少,程序撰寫(xiě)容易外,所需外部元件也是精簡(jiǎn)得很,我們不妨看看只需一個(gè)32768Hz的石英晶體及一個(gè)助振電容就行了,另外的1K電阻是關(guān)機(jī)泄放電流用的,可避免重置失效,而CLR按鍵是用來(lái)清除顯示時(shí)間的。若您不再乎那撥號(hào)時(shí)間的誤差則可以不用此元件的。


 程序列:

; 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 
程序說(shuō)明:
程序就像日常說(shuō)話一樣,只要能夠表達(dá)清楚意思,那么,愈短愈受人歡迎(當(dāng)然得在保證有正常功能的情況下而言)。此次DIY制作的軟件程序長(zhǎng)度僅有78個(gè)指令,夠短了吧,相信看懂也不難。整個(gè)程序可以分成5個(gè)段落來(lái)做說(shuō)明,寄存器使用說(shuō)明:
DL ----- 子程序用寄存器
MIN ----- 存放分鐘資料寄存器
SEC ----- 存放秒鐘資料寄存器
DD ----- 存放顯示位數(shù)資料寄存器
DDH ----- 存放顯示資料寄存器
AB ----- 存放ACC的副本
RFB ----- 存放STATUS的副本 
TCC中斷子程序: 
從0000--001B行為每秒發(fā)生一次的TCC中斷子程序,其中0008--000B及0017--0019行為進(jìn)入及離開(kāi)中斷子程序的ACC及STATUS保留動(dòng)作。其中000C為每進(jìn)入一次中斷子程序就將SEC這寄存器予以進(jìn)位。其中000D--0012為判斷SEC寄存器是否大于59,是則將MIN寄存器予以進(jìn)位并清除SEC寄存器。其中0013--0016為判斷MIN寄存器是否大于99,是則將MIN寄存器予以清除,其中001A為清除TCC中斷旗標(biāo)。
LED字型轉(zhuǎn)換程序: 
從001C--0026行存放了字型轉(zhuǎn)換表,可將0--9的數(shù)字轉(zhuǎn)成相對(duì)的LED七字顯示器的資料。
顯示時(shí)間長(zhǎng)度延遲程序: 
從0028--002B延遲程序,而0027及002C--002D為啟動(dòng)顯示及關(guān)掉顯示之指令。
微控制器啟始設(shè)定程序: 
從002F--0039行對(duì)微控制器內(nèi)部相關(guān)硬件做了必要性的設(shè)定動(dòng)作。值得特別一提的是0035--0039行對(duì)TCC中斷記數(shù)器予以設(shè)定成每秒中斷一次。計(jì)算式如下:
系統(tǒng)時(shí)基/(2周期模式×1秒×256進(jìn)位)而得預(yù)除數(shù)為64。
5.LED七字顯示器掃描主程序: 
從003A--004E行為本軟件程序之主程序部份,又可分三部份。003C--0040行為取得MIN的拾位數(shù)之值。0042--0046行顯示MIN的個(gè)位數(shù)資料到共陽(yáng)極的LED七字顯示器上。0047--004D行為顯示MIN的拾位數(shù)資料到共陰極的LED七字顯示器上。希望這短短的程序難不倒您才是。

程序撰寫(xiě)步驟:
許多人習(xí)慣上撰寫(xiě)程序的過(guò)程是依照「先小而大」,「先難后繁」,「邊測(cè)邊寫(xiě)」等三項(xiàng)原則來(lái)從事的,底下便將電話使用計(jì)時(shí)器程序分成八個(gè)段落來(lái)完成。 
1.先給予心跳: 

一般撰寫(xiě)程序碰到計(jì)時(shí)的工作時(shí)不外乎三個(gè)方式來(lái)解決:

「用TIMER計(jì)數(shù)器來(lái)產(chǎn)生中斷來(lái)計(jì)時(shí)」「用POLLING TIMER計(jì)數(shù)器來(lái)計(jì)時(shí)」
「用計(jì)算程序指令個(gè)數(shù)來(lái)計(jì)時(shí)」
這三個(gè)方式中以方式一最為簡(jiǎn)單也最為準(zhǔn)確,故這里打算最重要之秒的進(jìn)位問(wèn)題就交給TIMER計(jì)數(shù)器中斷方式來(lái)解決了。
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中斷能否滿足秒的進(jìn)位問(wèn)題。
程序說(shuō)明: 
中斷子程序: 
從0008--000A行為簡(jiǎn)單的中斷子程序,每做一次就將PORT6反向一次,離開(kāi)前順便清除中斷FLAG。
微控制器起始設(shè)定程序: 
起始設(shè)定是每個(gè)程序一開(kāi)始必須做的,主要功能是將一些會(huì)用到的硬件部份做一起始狀態(tài)的設(shè)定以發(fā)揮充分的掌控能力。
從000B~0013行為起始設(shè)定程序
000B MOV A, @0x00 ;將A內(nèi)放置零
000C MOV P6, A ;將P6內(nèi)放置零
000D IOW 0x0E ;將WDT功能除能
000E IOW P5 ;將P5設(shè)為OUTPUT
000F IOW P6 ;將P6設(shè)為OUTPUT
在EM78系列中有所謂的MEMORY及I/O兩大空間,一些MEMORY空間的寄存器處理時(shí)可用MOV、BS、BC、XOR、OR……等指令,而另一些I/O空間的控制寄存器處理時(shí)可用IOW、IOR等指令,這點(diǎn)不要弄混了才是。
0010 MOV A, @0x01 ;將A內(nèi)放置1
0011 IOW 0x0F ;僅致能TCC中斷能力
在EM78156中原本能有WDT中斷、外部中斷及TCC中斷等三種能力,如今我們只保留TCC中斷來(lái)使用。
0012 MOV A, @0x05 ;將A內(nèi)放置5
0013 CONTW ;設(shè)定TCC控制寄存器
0014 ENI ;啟動(dòng)中斷能力
TCC是一個(gè)很好用也很復(fù)雜的硬件線路,下面僅列出局部有關(guān)的地方于附錄供大家參考。由于系統(tǒng)時(shí)基是采用32768Hz的石英晶體,故本制作之準(zhǔn)確度應(yīng)該不被懷疑才是。當(dāng)選用2 CYCLE及2 CLOCK的狀態(tài)時(shí),若再將TCC設(shè)成除以64,那剛好每一秒鐘TCC發(fā)生溢位中斷一次。
掃描程序: 
從0015--0015行,總共1行,僅做跳躍自身之用。
效果觀察: 
程序?qū)懙酱藭r(shí),倘若您手上的線路沒(méi)焊錯(cuò)的話,那么您將會(huì)看到七字顯示屏幕顯示8并且以1秒亮1秒滅的速度亮滅著。
到此總共用315個(gè)指令,恭喜您的寶寶已經(jīng)有心跳產(chǎn)生了。
2.具有七段顯示能力: 

有了秒的心跳之后,接下來(lái)就是加強(qiáng)掃描能力,使它有著正確的顯示數(shù)字的能力。
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
整個(gè)程序與TC0.ICE最大的差異就是增加了SEC計(jì)數(shù)的顯示能力,故有三處改動(dòng): 
中斷子程序中有了INC SEC指令來(lái)做每秒進(jìn)位的動(dòng)作。 
增加了LED顯示屏幕七段轉(zhuǎn)換表,從000B--0015行即為0到9的轉(zhuǎn)換表。 
掃描程序功能加強(qiáng): 
從0020--0026行所做之事為重覆的將SEC數(shù)字經(jīng)過(guò)查表后丟到P6上。為了方便了解,此時(shí)僅對(duì)數(shù)字0有做顯示動(dòng)作。
效果觀察: 
程序到此時(shí)您會(huì)看到個(gè)位數(shù)的七字顯示屏幕從0→9每秒進(jìn)位一次。到9以后程序?qū)?huì)錯(cuò)亂(?Why?)。
3.具有二位數(shù)的顯示能力: 

能夠做七段顯示之后,各位最想看到的當(dāng)然是二位數(shù)字的顯示了,由于這里采用一共陰、一共陽(yáng)的七段顯示器,故處理起來(lái)還得稍費(fèi)腦筋。
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差異之處僅在掃描動(dòng)作上不同罷了。 
若要掃共陽(yáng)的位數(shù)時(shí),必須將PORT5外設(shè)為高電位輸出,而要亮的字劃,在PORT6外設(shè)為低電位輸入即可。若要掃共陰的位數(shù)1時(shí),必須將PORT5外設(shè)為低電位輸出即可,而要亮的字劃,在PORT6外設(shè)為高電位輸出即可。故有了0020--0025行,位數(shù)0的顯示處理及0026--002C行,位數(shù)1的顯示處理。 
效果觀察: 
程序到此時(shí)您會(huì)看到二位數(shù)的七字顯示屏幕,同時(shí)從0→9每秒進(jìn)位一次,到9以后程序?qū)?huì)錯(cuò)亂(?Why?)。
具有限數(shù)能力: 
以上的程序?qū)EC(秒)都不予限數(shù),當(dāng)然會(huì)造成CALL TABLE RETEW錯(cuò)誤發(fā)生,故底下增加MIN(分)并對(duì)SEC、MIN做59及99的限數(shù)動(dòng)作。
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進(jìn)制轉(zhuǎn)10進(jìn)制
0034 JBS RF,FC
0035 JMP H_L
0036 INC DDH
0037 JMP H_H
H_L:
0038 ADD A,@10
0039 CALL T7 ;顯示個(gè)位
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的暫存動(dòng)作及SEC、MIN的限數(shù)動(dòng)作。0008--000A及0016--0018行系對(duì)A及R3做暫存及復(fù)原的動(dòng)作。 
000C--0011行系對(duì)秒做59的比較動(dòng)作,SEC比59大則SEC=0,MIN=MIN+1。
0012--0015行系對(duì)分做99的比較動(dòng)作,若MIN比99大則MIN=0。
此處為何要對(duì)中斷子程序做A及R3的暫存及復(fù)原的動(dòng)作呢?這是因?yàn)樵谥鞒绦?SCAN)內(nèi)時(shí)時(shí)會(huì)用到A及R3,及中斷子程序中也會(huì)用到A及R3之故,若不在中斷前后將A及R3的數(shù)值維持不變,那么主程序?qū)?huì)有錯(cuò)亂的情形產(chǎn)生。
在掃描程序部份增加了16進(jìn)制變成10進(jìn)制的動(dòng)作??v然二位數(shù)字來(lái)顯示MIN(分)的訊息是可行的,然將16進(jìn)制變成10進(jìn)制才能符合人類(lèi)的習(xí)性。0033--0038行即在做16進(jìn)制轉(zhuǎn)10進(jìn)制的動(dòng)作,將MIN的數(shù)值拆成個(gè)位數(shù)及拾位數(shù),并在0039--003D時(shí)顯示個(gè)位數(shù),而在003E--0044時(shí)顯示拾位數(shù)。 
效果觀察: 
程序到此為止,理論上已做完該完成的所有行為了。但執(zhí)行起來(lái)….為何….為何….忽好忽壞呢???
完成正確功能: 
將TC3.ICE程序左看右看,上看下看,怎么看也看不出破綻出來(lái),但為何程序跑起來(lái)很不穩(wěn)定,忽好忽壞的呢?是ICE不穩(wěn)呢?還是程序錯(cuò)誤呢?答案當(dāng)然是程序錯(cuò)誤。
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
原來(lái)問(wèn)題就在中斷子程序的A及R3暫存及復(fù)原這部份。 
原來(lái)程序在A及R3的暫存部份:
0008 MOV AB, A ;AB←A
0009 MOV A, RF ;A←RF
000A MOV RFB, A ;RFB←RF
錯(cuò)就錯(cuò)在0009時(shí)MOV A, RF指令會(huì)破壞ZERO FLAG的資料。故改變指令的用法即可恢復(fù)正常,新的程序在A及R3的暫存部份:
0008 MOV AB, A ;AB←A
0009 SWAP AB 
000A SWAPA RF 
000B MOV RFB, A ;RFB←FR
新的程序在A及R3的復(fù)原部份:
0017 SWAPA RFB 
0018 MOV RF, A ;RF←RFB
0019 SWAPA AB ;A←BA
動(dòng)作有點(diǎn)別扭,但是好用得很,請(qǐng)盡量用。
效果觀察: 
此時(shí)此刻的您一定是歡喜異常,眼睛看著分鐘一分一分的增加又不死機(jī),剛才緊繃的心情頓時(shí)得到解脫,一切的心血總算有了回報(bào)了。
增加花招: 
拿著半成品把玩半天總覺(jué)得有些不夠完美的,原來(lái)是一分鐘才變化一次會(huì)讓人覺(jué)得成品好像沒(méi)在正常工作,總是懷疑成品是死的,好吧,再動(dòng)些手腳將秒的閃爍呈現(xiàn)在七段的小數(shù)點(diǎn)上以滿足動(dòng)感要求。
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 ;用來(lái)增加小數(shù)點(diǎn)閃爍
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
要如何增加小數(shù)點(diǎn)秒的閃爍呢?其實(shí)看結(jié)果一點(diǎn)也不困難(話雖如此卻也著實(shí)的傷了好幾條的腦筋)。 
增加001D~0020這四行程序就可迎刃而解了。 
效果觀察: 
看著一秒亮一秒滅的成品,此時(shí)此刻僅可用一個(gè)”爽”字來(lái)形容心情,愈來(lái)愈覺(jué)得其實(shí)單片機(jī)制作并不是高不可及啊!
7.好上加好: 
如果用示波器來(lái)看看制作成果的良好程度時(shí),可以看到顯示周期比才近50%左右,讓人總覺(jué)得可惜,倘若能夠讓顯示周期比接近100%不亦快哉!
再動(dòng)手改吧.
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 ;增加顯示時(shí)間之比
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
人的眼眼睛實(shí)在很容易被欺騙,只要掃描頻率大于30Hz其實(shí)已經(jīng)看不到閃爍的現(xiàn)象,故在不產(chǎn)生閃爍的現(xiàn)象中如何增加顯示周期比呢? 
增加顯示時(shí)之時(shí)間,故這里增加了一個(gè)DELAY子程序(002C--0033行所示)供掃描顯示時(shí)呼叫之用。固定的在個(gè)位數(shù)及拾位數(shù)顯示時(shí)各呼叫一次來(lái)增加顯示周期比。 
效果觀察: 
增加了DELAY子程序之后約可提升亮度一倍左右。
8.要善始善終-----永不死機(jī): 
正當(dāng)要關(guān)掉ICE準(zhǔn)備燒寫(xiě)OTP的時(shí)候,仔細(xì)想想程序才那么小小的,留那么多的空白做什么?不妨拿來(lái)「增加穩(wěn)定度」之用。
還要?jiǎng)邮??
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程序的差異之處: 
在每個(gè)程序的段落「加入JMP INIT」指令。 
在程序節(jié)結(jié)尾以后「加入JMP INIT」指令。 
如此一來(lái),不論IC何時(shí)死機(jī)錯(cuò)亂都會(huì)跳到開(kāi)始來(lái)執(zhí)行了。
加入WATCH DOG TIMER: 
來(lái)避免程序的錯(cuò)誤而造成死LOOP現(xiàn)象。
加入錯(cuò)誤偵測(cè)能力: 
利用剩余的寄存器來(lái)做引子,隨時(shí)去讀取這些寄存器,若和不為零則代表錯(cuò)誤發(fā)生了,應(yīng)該重新開(kāi)始。
效果觀察: 
不論如何故意的去弄死機(jī)都會(huì)從頭開(kāi)始正常執(zhí)行程序了,大功告成。可以加上您認(rèn)為漂亮合適的外殼,投入使用了。

附源程序: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 

 

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉