前言: 在通訊溝通頻繁的今日,相信家家戶戶都有一臺以上的電話機(jī),您家必定發(fā)生過打完電話后未掛好而造成電話無法打進(jìn)的困擾吧。或者您的家人或同事或朋友打電話一打就打了許久又不自知吧。
下面為您介紹一款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)說明: DIY制作基本上要有著三個(gè)特點(diǎn): 一看就懂:指電路簡單明了。 一買就有:指電路容易取得。 一做就成:指制作成功率高。 當(dāng)您看完本篇文章之后一定會有種躍躍欲試的感覺,那么請跟著感覺走是不會錯(cuò)的。整個(gè)DIY制作雖然小小的,不過特點(diǎn)倒是挺多項(xiàng)。 免用外部電源,整個(gè)DIY電子產(chǎn)品是利用電話線電壓來工作的,故可免除許多煩人的事(指怕停電,浪費(fèi)電,體積大,成本高,配線難),在使用上沒有任何不適的感覺,也不須擔(dān)心電信局測試。 對通話品質(zhì)無影響,所謂的無影響其實(shí)有著二個(gè)含意,一為無雜訊干擾,一為通話音量不增減。大家都知道多位數(shù)的LED七段顯示得用掃描方式,如此一來會有脈沖電流雜訊產(chǎn)生,這點(diǎn)對聽覺靈敏的耳朵而言是不可忽視的。另外整個(gè)電路的AC阻抗得非常的低,以免除聲音的衰減。針對這二個(gè)要求,這里介紹一個(gè)簡單又實(shí)用的電源取得電路供您參考。 LED七段顯示,非常適合夜晚來使用,同時(shí)由于亮度很夠,即使在白天也是清清楚楚,這點(diǎn)就是LCD顯示望塵莫及的。 LED顯示不但能做使用時(shí)間的顯示之外,也能表示電話線正被使用中,故可當(dāng)未掛好話筒之提醒指示之用。 LED顯示采用最省元件的互補(bǔ)式,即一個(gè)LED七段顯示器為共陰,另一為共陽,如此即可直接用單片機(jī)四個(gè)I/O直接推動而得到最高亮度了。 利用OTP型單片機(jī)EM78P156來做核心控制,整個(gè)程序小小的,若您想更改或增加功能都是非常容易的。
功能說明: 當(dāng)您的電話使用后沒有放置好,或者是打電話聊長天的時(shí)候給您顯示通話使用時(shí)間給予心理壓力;旧峡伤闶怯刑嵝阎甘炯帮@示二大功能。
提醒指示: 只要LED七段顯示器點(diǎn)亮則表示電話線正被使用,此時(shí)不是您正在打電話就是話筒未被放置好。
顯示: 只要話筒一被拿起,電話回路被建立后單片機(jī)開始做計(jì)時(shí)及顯示動作,以分為單位,最大可顯示99分,之后又從0開始。若您要有精準(zhǔn)的計(jì)時(shí)時(shí)可在電話通之后按CLR鍵,此時(shí)單片機(jī)清除計(jì)數(shù)從新開始計(jì)數(shù)顯示。
線路圖:
 圖1線路說明:
整個(gè)線路說實(shí)在的,太小了,不過增一分則肥,減一分則瘦。還是老老實(shí)實(shí)的交待清楚吧,那么您要購買或更換電路時(shí)才不會走冤枉路。 直接從電話線路取得工作電源,見圖2 :
圖2
為一簡單的檢波器π型濾波器及基納穩(wěn)壓器所構(gòu)成,經(jīng)過這5個(gè)元件的打點(diǎn)而得到從電話端看到的是一個(gè)AC低阻抗,同時(shí)隔離了單片機(jī)掃描LED七段顯示器所衍生的雜音。另外5V的穩(wěn)壓二極管更提供了很穩(wěn)定的電源供電路使用。有二個(gè)地方需注意的是5V穩(wěn)壓二極管得選購5W以上的比較不會過熱,同時(shí)電感得選購直流內(nèi)阻低的,愈低愈不會發(fā)熱。
LED七段顯示器采用一共陰極,一共陽極的,故顏色及亮度最好選相近的。
見圖3 圖3
當(dāng)PORT5輸出為HIGH時(shí),共陽極的LED七段顯示器被選到,此時(shí)PORT6輸出為LOW時(shí)LED被點(diǎn)亮,反之LED不會亮。當(dāng)PORT5輸出為LOW時(shí),共陽極的LED七段顯示器被選到,此時(shí)PORT6輸出為HIGH時(shí)LED被點(diǎn)亮,反之LED不會亮。之所以要四個(gè)I/O都并聯(lián)在一起是要保證有50mA的輸出顯示電流,不是四個(gè)并聯(lián)使用的話則顯示亮度會打折扣。 單片機(jī)部份,圖4
圖4
選用 臺灣EMC 公司的EM78P156 OTP或8位單片機(jī),不但指令少,程序撰寫容易外,所需外部元件也是精簡得很,我們不妨看看只需一個(gè)32768Hz的石英晶體及一個(gè)助振電容就行了,另外的1K電阻是關(guān)機(jī)泄放電流用的,可避免重置失效,而CLR按鍵是用來清除顯示時(shí)間的。若您不再乎那撥號時(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 程序說明: 程序就像日常說話一樣,只要能夠表達(dá)清楚意思,那么,愈短愈受人歡迎(當(dāng)然得在保證有正常功能的情況下而言)。此次DIY制作的軟件程序長度僅有78個(gè)指令,夠短了吧,相信看懂也不難。整個(gè)程序可以分成5個(gè)段落來做說明,寄存器使用說明: DL ----- 子程序用寄存器 MIN ----- 存放分鐘資料寄存器 SEC ----- 存放秒鐘資料寄存器 DD ----- 存放顯示位數(shù)資料寄存器 DDH ----- 存放顯示資料寄存器 AB ----- 存放ACC的副本 RFB ----- 存放STATUS的副本 TCC中斷子程序: 從0000--001B行為每秒發(fā)生一次的TCC中斷子程序,其中0008--000B及0017--0019行為進(jìn)入及離開中斷子程序的ACC及STATUS保留動作。其中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)成相對的LED七字顯示器的資料。 顯示時(shí)間長度延遲程序: 從0028--002B延遲程序,而0027及002C--002D為啟動顯示及關(guān)掉顯示之指令。 微控制器啟始設(shè)定程序: 從002F--0039行對微控制器內(nèi)部相關(guān)硬件做了必要性的設(shè)定動作。值得特別一提的是0035--0039行對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ù)資料到共陽極的LED七字顯示器上。0047--004D行為顯示MIN的拾位數(shù)資料到共陰極的LED七字顯示器上。希望這短短的程序難不倒您才是。
程序撰寫步驟: 許多人習(xí)慣上撰寫程序的過程是依照「先小而大」,「先難后繁」,「邊測邊寫」 等三項(xiàng)原則來從事的,底下便將電話使用計(jì)時(shí)器程序分成八個(gè)段落來完成。 1.先給予心跳:
一般撰寫程序碰到計(jì)時(shí)的工作時(shí)不外乎三個(gè)方式來解決:
「用TIMER計(jì)數(shù)器來產(chǎn)生中斷來計(jì)時(shí)」「用POLLING TIMER計(jì)數(shù)器來計(jì)時(shí)」 「用計(jì)算程序指令個(gè)數(shù)來計(jì)時(shí)」 這三個(gè)方式中以方式一最為簡單也最為準(zhǔn)確,故這里打算最重要之秒的進(jìn)位問題就交給TIMER計(jì)數(shù)器中斷方式來解決了。 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)位問題。 程序說明: 中斷子程序: 從0008--000A行為簡單的中斷子程序,每做一次就將PORT6反向一次,離開前順便清除中斷FLAG。 微控制器起始設(shè)定程序: 起始設(shè)定是每個(gè)程序一開始必須做的,主要功能是將一些會用到的硬件部份做一起始狀態(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中斷來使用。 0012 MOV A, @0x05 ;將A內(nèi)放置5 0013 CONTW ;設(shè)定TCC控制寄存器 0014 ENI ;啟動中斷能力 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í),倘若您手上的線路沒焊錯(cuò)的話,那么您將會看到七字顯示屏幕顯示8并且以1秒亮1秒滅的速度亮滅著。 到此總共用315個(gè)指令,恭喜您的寶寶已經(jīng)有心跳產(chǎn)生了。 2.具有七段顯示能力:
有了秒的心跳之后,接下來就是加強(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ù)的顯示能力,故有三處改動: 中斷子程序中有了INC SEC指令來做每秒進(jìn)位的動作。 增加了LED顯示屏幕七段轉(zhuǎn)換表,從000B--0015行即為0到9的轉(zhuǎn)換表。 掃描程序功能加強(qiáng): 從0020--0026行所做之事為重覆的將SEC數(shù)字經(jīng)過查表后丟到P6上。為了方便了解,此時(shí)僅對數(shù)字0有做顯示動作。 效果觀察: 程序到此時(shí)您會看到個(gè)位數(shù)的七字顯示屏幕從0→9每秒進(jìn)位一次。到9以后程序?qū)e(cuò)亂(?Why?)。 3.具有二位數(shù)的顯示能力:
能夠做七段顯示之后,各位最想看到的當(dāng)然是二位數(shù)字的顯示了,由于這里采用一共陰、一共陽的七段顯示器,故處理起來還得稍費(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差異之處僅在掃描動作上不同罷了。 若要掃共陽的位數(shù)時(shí),必須將PORT5外設(shè)為高電位輸出,而要亮的字劃,在PORT6外設(shè)為低電位輸入即可。若要掃共陰的位數(shù)1時(shí),必須將PORT5外設(shè)為低電位輸出即可,而要亮的字劃,在PORT6外設(shè)為高電位輸出即可。故有了0020--0025行,位數(shù)0的顯示處理及0026--002C行,位數(shù)1的顯示處理。 效果觀察: 程序到此時(shí)您會看到二位數(shù)的七字顯示屏幕,同時(shí)從0→9每秒進(jìn)位一次,到9以后程序?qū)e(cuò)亂(?Why?)。 具有限數(shù)能力: 以上的程序?qū)EC(秒)都不予限數(shù),當(dāng)然會造成CALL TABLE RETEW錯(cuò)誤發(fā)生,故底下增加MIN(分)并對SEC、MIN做59及99的限數(shù)動作。 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的暫存動作及SEC、MIN的限數(shù)動作。0008--000A及0016--0018行系對A及R3做暫存及復(fù)原的動作。 000C--0011行系對秒做59的比較動作,SEC比59大則SEC=0,MIN=MIN+1。 0012--0015行系對分做99的比較動作,若MIN比99大則MIN=0。 此處為何要對中斷子程序做A及R3的暫存及復(fù)原的動作呢?這是因?yàn)樵谥鞒绦?SCAN)內(nèi)時(shí)時(shí)會用到A及R3,及中斷子程序中也會用到A及R3之故,若不在中斷前后將A及R3的數(shù)值維持不變,那么主程序?qū)绣e(cuò)亂的情形產(chǎn)生。 在掃描程序部份增加了16進(jìn)制變成10進(jìn)制的動作?v然二位數(shù)字來顯示MIN(分)的訊息是可行的,然將16進(jìn)制變成10進(jìn)制才能符合人類的習(xí)性。0033--0038行即在做16進(jìn)制轉(zhuǎn)10進(jìn)制的動作,將MIN的數(shù)值拆成個(gè)位數(shù)及拾位數(shù),并在0039--003D時(shí)顯示個(gè)位數(shù),而在003E--0044時(shí)顯示拾位數(shù)。 效果觀察: 程序到此為止,理論上已做完該完成的所有行為了。但執(zhí)行起來….為何….為何….忽好忽壞呢??? 完成正確功能: 將TC3.ICE程序左看右看,上看下看,怎么看也看不出破綻出來,但為何程序跑起來很不穩(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 原來問題就在中斷子程序的A及R3暫存及復(fù)原這部份。 原來程序在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指令會破壞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 動作有點(diǎn)別扭,但是好用得很,請盡量用。 效果觀察: 此時(shí)此刻的您一定是歡喜異常,眼睛看著分鐘一分一分的增加又不死機(jī),剛才緊繃的心情頓時(shí)得到解脫,一切的心血總算有了回報(bào)了。 增加花招: 拿著半成品把玩半天總覺得有些不夠完美的,原來是一分鐘才變化一次會讓人覺得成品好像沒在正常工作,總是懷疑成品是死的,好吧,再動些手腳將秒的閃爍呈現(xiàn)在七段的小數(shù)點(diǎn)上以滿足動感要求。 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 ;用來增加小數(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è)”爽”字來形容心情,愈來愈覺得其實(shí)單片機(jī)制作并不是高不可及啊! 7.好上加好: 如果用示波器來看看制作成果的良好程度時(shí),可以看到顯示周期比才近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 ;增加顯示時(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í)各呼叫一次來增加顯示周期比。 效果觀察: 增加了DELAY子程序之后約可提升亮度一倍左右。 8.要善始善終-----永不死機(jī): 正當(dāng)要關(guān)掉ICE準(zhǔn)備燒寫OTP的時(shí)候,仔細(xì)想想程序才那么小小的,留那么多的空白做什么?不妨拿來「增加穩(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程序的差異之處: 在每個(gè)程序的段落「加入JMP INIT」指令。 在程序節(jié)結(jié)尾以后「加入JMP INIT」指令。 如此一來,不論IC何時(shí)死機(jī)錯(cuò)亂都會跳到開始來執(zhí)行了。 加入WATCH DOG TIMER: 來避免程序的錯(cuò)誤而造成死LOOP現(xiàn)象。 加入錯(cuò)誤偵測能力: 利用剩余的寄存器來做引子,隨時(shí)去讀取這些寄存器,若和不為零則代表錯(cuò)誤發(fā)生了,應(yīng)該重新開始。 效果觀察: 不論如何故意的去弄死機(jī)都會從頭開始正常執(zhí)行程序了,大功告成?梢约由夏J(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
|