重大課程設計電子鍾
『壹』 電子鍾課程設計(微機原理)
BUFF_KEY EQU 21H ;鍵盤鍵
BUFF_LED1 EQU 22H ;數碼管顯示緩存
BUFF_LED2 EQU 23H
BUFF_LED3 EQU 24H
BUFF_LED4 EQU 25H
BUFF_LED5 EQU 26H
BUFF_LED6 EQU 27H
BUFF_LED_LP EQU 28H ;T0鍵盤顯示掃描緩存
HOR EQU 30H ;小時值緩存
MIN EQU 31H ;分鍾值緩存
SEC EQU 32H ;秒值緩存
F_BEEP BIT 01H
LED_PORT EQU P0
DIG_PORT EQU P2
KEY_PORT EQU P2
SW1 BIT P2.7
SW2 BIT P2.6
SW3 BIT P2.5
SW4 BIT P2.4
SW5 BIT P2.3
SW6 BIT P2.2
BEEP BIT P2.0
KEY BIT P3.3
org 000h
JMP main
ORG 00BH
JMP T0_INT
ORG 100H
MAIN: MOV SP ,#40H
MOV PSW,#00H
MOV R0,#7FH ;初始化區,
CLR_RAM:MOV A,#00H
MOV @R0,A
DJNZ R0,CLR_RAM
MOV P1,0FFH ;INIT
MOV P2,0FFH
MOV P0,0FFH
MOV P3,0FFH
MOV TMOD,#21h
MOV TH0,#240 ;T0=4MS
MOV TL0,#96
SETB TR0
SETB ET0
SETB EA
WAIT_KEY:JB KEY,$ ;等候按鍵!
JNB SW1,SW1_OK
JNB SW2,SW2_OK
JNB SW3,SW3_OK
JNB SW4,SW4_OK
JNB SW5,SW5_OKA
JNB SW6,SW6_OKA
JMP WAIT_KEY
SW5_OKA: JMP SW5_OK
SW6_OKA: JMP SW6_OK
SW1_OK: MOV A,HOR
CJNE A,#24,SW1_OVER
MOV HOR,#00H
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW1_OVER:INC HOR ;時加1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW2_OK: MOV A,HOR
CJNE A,#00,SW2_OVER
MOV HOR,#23
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW2_OVER:DEC HOR ;時減1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
JMP WAIT_KEY
SW3_OK: MOV A,MIN
CJNE A,#59,SW3_OVER
MOV MIN,#00H
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW3_OVER:INC MIN ;分加1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW4_OK: MOV A,MIN
CJNE A,#00,SW4_OVER
MOV MIN,#59
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW4_OVER:DEC MIN ;分減1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW5_OK: MOV A,SEC
CJNE A,#59,SW5_OVER
MOV SEC,#00H
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW5_OVER:INC SEC ;秒加1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW6_OK: MOV A,SEC
CJNE A,#00,SW6_OVER
MOV HOR,#59
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW6_OVER:DEC SEC ;時減1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
DEL: MOV R5,#02 ;為演示方便,人為插入的延時
DEL01: MOV R6,#200
DEL02: MOV R7,#200
DJNZ R7,$
DJNZ R6,DEL02
DJNZ R5,DEL01
RET
BIN_BCD: MOV B,#10
DIV AB
RET
;------------- T0 INTRRUPT 數碼管掃描定時中斷---------------------------
T0_INT: PUSH ACC
PUSH PSW
MOV TH0,#240 ;T0=4MS
MOV TL0,#96
INC BUFF_LED_LP
MOV A,BUFF_LED_LP
CJNE A,#250,CONT_SCAN ;250*4MS=1S
MOV BUFF_LED_LP,#00H
INC SEC
MOV A,SEC
CJNE A,#60,CONT_SCAN
MOV SEC,#00H
INC MIN
MOV A,MIN
CJNE A,#60,CONT_SCAN
MOV MIN,#00H
INC HOR
MOV A,HOR
CJNE A,#24,CONT_SCAN
MOV HOR,#00H
clr beep
clr p1.0
lcall del
setb beep
setb p1.0
CONT_SCAN:MOV A,SEC
LCALL BIN_BCD
MOV BUFF_LED6,B
MOV BUFF_LED5,A
MOV A,MIN
LCALL BIN_BCD
MOV BUFF_LED4,B
MOV BUFF_LED3,A
MOV A,HOR
LCALL BIN_BCD
MOV BUFF_LED2,B
MOV BUFF_LED1,A
MOV A,BUFF_LED_LP
MOV B,#06
DIV AB
MOV A,B
RL A
MOV DPTR,#TAB_SCAN
JMP @A+DPTR
TAB_SCAN: AJMP SCAN_L1
AJMP SCAN_L2
AJMP SCAN_L3
AJMP SCAN_L4
AJMP SCAN_L5
AJMP SCAN_L6
SCAN_L1: MOV DIG_PORT,#01111111B
MOV A,BUFF_LED1
JMP END_SCAN
SCAN_L2: MOV DIG_PORT,#10111111B
MOV A,BUFF_LED2
JMP END_SCAN
SCAN_L3: MOV DIG_PORT,#11011111B
MOV A,BUFF_LED3
JMP END_SCAN
SCAN_L4: MOV DIG_PORT,#11101111B
MOV A,BUFF_LED4
JMP END_SCAN
SCAN_L5: MOV DIG_PORT,#11110111B
MOV A,BUFF_LED5
JMP END_SCAN
SCAN_L6: MOV DIG_PORT,#11111011B
MOV A,BUFF_LED6
END_SCAN: MOV DPTR,#TAB_LED
MOVC A,@A+DPTR
MOV LED_PORT,A
JNB F_BEEP,EXIT_T0
CLR BEEP
EXIT_T0: POP PSW
POP ACC
RETI
TAB_LED: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;數碼管顯示字型表
DB 82H,0F8H,80H,90H,88H,83H,0A7H
DB 0A1H,86H,8EH
END
『貳』 電子鍾課程設計:
目錄
1 設計目的 3
2 設計要求指標 3
2.1 基本功能 3
2.2 擴展功能 4
3.方案論證與比較 4
4 總體框圖設計 4
5 電路原理分析 4
5.1數字鍾的構成 4
5.1.1 分頻器電路 5
5.1.2 時間計數器電路 5
5.1.3分頻器電路 6
5.1.4振盪器電路 6
5.1.5數字時鍾的計數顯示電路 6
5.2 校時電路 7
5.3 整點報時電路 8
6系統模擬與調試 8
7.結論 8
參考文獻 9
實驗作品附圖 10
數字鍾
摘要:
數字鍾是一種用數字電路技術實現時、分、秒計時的裝置,與機械式時鍾相比具有更高的准確性和直觀性,且無機械裝置,具有更更長的使用壽命,因此得到了廣泛的使用。
數字鍾從原理上講是一種典型的數字電路,其中包括了組合邏輯電路和時序電路。目前,數字鍾的功能越來越強,並且有多種專門的大規模集成電路可供選擇。
從有利於學習的角度考慮,這里主要介紹以中小規模集成電路設計數字鍾的方法。
經過了數字電路設計這門課程的系統學習,特別經過了關於組合邏輯電路與時序邏輯電路部分的學習,我們已經具備了設計小規模集成電路的能力,藉由本次設計的機會,充分將所學的知識運用到實際中去。
本次課程設計要求設計一個數字鍾,基本要求為數字鍾的時間周期為24小時,數字鍾顯示時、分、秒,數字鍾的時間基準一秒對應現實生活中的時鍾的一秒。供擴展的方面涉及到定時自動報警、按時自動打鈴、定時廣播、定時啟閉路燈等。因此,研究數字鍾及擴大其應用,有著非常現實的意義。
1 設計目的
1.掌握數字鍾的設計、組裝與調試方法。
2.熟悉集成元器件的選擇和集成電路晶元的邏輯功能及使用方法。
3.掌握麵包板結構及其接線方法
4.熟悉模擬軟體的使用。
2 設計要求及指標
2.1基本功能
1)時鍾顯示功能,能夠正確顯示「時」、「分」、「秒」。
2)具有快速校準時、分、秒的功能。
3)用555定時器與RC組成的多諧振盪器產生一個標准頻率(1Hz)的方波脈沖信號。
2.2擴展功能
1)用晶體振盪器產生一個標准頻率(1Hz)的脈沖信號。
2)具有整點報時的功能。
3)具有鬧鍾的功能。
4)……
3、方案論證與比較
本設計方案使用555多諧振盪器來產生1HZ的信號。通過改變相應的電阻電容值可使頻率微調,不必使用分頻器來對高頻信號進行分頻使電路繁復。雖然此振盪器沒有石英晶體穩定度和精確性高,由於設計方便,操作簡單,成為了設計時的首選,但是由於與實驗中使用的555晶元產生的脈沖相比較,利用晶振產生的脈沖信號更加的穩定,同過電壓表的測量能很好的觀察到這一點,同時在顯示上能夠更加接進預定的值,受外界環境的干擾較少,一定程度上優於使用555晶元產生信號方式。我們組依然同時設計了555和晶振兩個信號產生電路。(本實驗報告中著重按照原方案設計的555電路進行說明)
4、 系統設計框圖
數字式計時器一般由振盪器、分頻器、計數器、解碼器、顯示器等幾部分組成。在本設計中555振盪器及其相應外部電路組成標准秒信號發生器,由不同進制的計數器、解碼器和顯示器組成計時系統。秒信號送入計數器進行計數,把累計的結果以『時』、『分』、『秒』的數字顯示出來。『時』顯示由二十四進制計數器、解碼器、顯示器構成,『分』、『秒』顯示分別由六十進制計數器、解碼器、顯示器構成。其原理框圖如圖1.1所示。
5、電路原理分析
5.1數字鍾的構成
數字鍾實際上是一個對標准頻率(1HZ)進行計數的計數電路.由於計數的起始時間不可能與標准時間一致,故需要在電路上加一個校時電路,同時標準的1HZ時間信號必須做到准確穩定.在此使用555振盪器組成1Hz的信號。
數字鍾原理框圖(1.1)
5.1.1振盪器電路
555定時器組成的振盪器電路給數字鍾提供一個頻率為1Hz的方波信號。其中OUT為輸出。
5.1.2時間計數器電路
時間計數電路由秒個位和秒十位計數器,分個位和分十位計數器及時個位和時十位計數器電路構成,其中秒個位和秒十位計數器、分個位和分十位計數器為60進制計數器,而根據設計要求,時個位和時十位計數器為24進制計數器.
5.1.3分頻器電路
通常,數字鍾的晶體振盪器輸出頻率較高,為了得到1Hz的秒信號輸入,需要對振盪器的輸出信號進行分頻。
通常實現分頻器的電路是計數器電路,一般採用多級2進制計數器來實現。例如,將32768Hz的振盪信號分頻為1HZ的分頻倍數為32768( ),即實現該分頻功能的計數器相當於15級2進制計數器。
5.1.4振盪器電路
利用555定時器組成的多諧振盪器接通電源後,電容C1被充電,當電壓上升到一定數值時裡面集成的三極體導通,然後通過電阻和三極體放電,不斷的充放電從而產生一定周期的脈沖,通過改變電路上器件的值可以微調脈沖周期。
5.1.5數字時鍾的計數顯示控制
在設計中,我們使用的是74**160十進制計數器,來實現計數的功能,實驗中主要用到了160的置數清零功能(特點:消耗一個時鍾脈沖),清零功能(特點:不耗時鍾脈沖),在上級160控制下級160時候通過組合電路(主要利用與非門)實現,在連接電路的時候要注意並且強調使能端的連接,其將影響到整一個電路的是否工作。
電路的控制原理如下:
秒鍾由個位向十位進位:0000—0001—0010—0011—0100—0101—0110—0111—1000—1001實現個位的計數,採用的是置數的方式(利用RCO埠),當電路計數到1001的時候採用一個二輸入與非門接上級輸入的高位和低位輸出作為下級的信號,實現了秒區的個位和十位的顯示與控制。設計中注意到接的是一個與非門而不是與門,目標在產生一個時鍾脈沖。實現正確的顯示。
由秒區向分區的顯示控制:
基本原理同上,在秒區十位向時區個位顯示的時:0000—0001—0010—0011—0100—0101產生了六個脈沖的時候向下級輸出一個時鍾脈沖,利用的還是與非門,目標仍是實現正確的計時顯示。
分區的顯示及整體電路反饋清零:
當數值顯示達到:23:59的時候要實現清零的工作,採用CLR清零的方式反饋清零。具體設計接出控制端的9,5,3,2用十六進製表示後高電平對應引腳接與非,將非門輸出信號的值反饋給各個160晶元的清零端(CLR)既可以實現清零了。
5.2 校時功能的實現
當重新接通電源或走時出現誤差時都需要對時間進行校正.通常,校正時間的方法是:首先截斷正常的計數通路,然後再進行人工出觸發計數或將頻率較高的方波信號加到需要校正的計數單元的輸入端,校正好後,再轉入正常計時狀態即可.
根據要求,數字鍾應具有分校正功能,因此,應截斷分個位的直接計數通路,並採用正常計時信號與校正信號可以隨時切換的電路接入其中.
在實驗實現過程中使用的是通過開關(普通開關)來實現高低電平的切換,手動賦予需要的高低電平來實現脈沖的供給,將脈沖提供到所需要的輸入(CLK)埠,實現校時,模擬過程中能夠正常校時並且在校時的時候達到了預定的效果;而在我們進入實際電路連接的時候,利用開關(手控導線點觸實現)來實現校時再不像模擬那樣的精確了,原因分析是由於使用的是普通的開關同時利用的是手動的對CLK埠賦予脈沖信號,在實現手動生成脈沖信號的過程中產生了擾動,即相當於產生了多個的脈沖信號對需要的數碼管進行校時,如此,並沒有達到模擬的精確效果,但是在實驗中通過改進電路的校時方式,不是用手觸開關產生脈沖信號(如若需用手觸則需要使用一個鎖存器實現去抖動,才能夠在脈沖生成時候不產生干擾的脈沖,實現正常的校時),而是使用信號發生器實現信號的提供,對需要校時的數碼管在相對應的CLK埠提供脈沖信號實現校時,利用此方式實現校時則比手觸開關方式效果要好。
5.3 報時的實現
報時功能的實現原理較為簡單,即對所需要報時的輸出量進行控制,並對控制產生的信號作為LED顯示的信號源,電路連接中要注意到的是在實現LED顯示的時候最好連接上一個保護電阻對LED燈器到保護的作用。例如我們的校時時間是 23:59,0010—0011—0101—1001;利用相應的門電路實現滿足埠輸出是上述條件的時候進行報時即可。
6、系統模擬與調試
7、結論
學貴以致用,通過幾天的數字鍾設計過程,將從書本上學到的知識應用於實踐,學會了初步的電子電路模擬設計,雖然過程中遇到了一些困難,但是在解決這些問題的過程無疑也是對自己自身專業素質的一種提高。當最終調試成功的時候也是對自己的一種肯定。在當前金融危機大的社會背景下,能夠增加自身砝碼的不僅僅是一紙文憑證書,更為重要的是畢業生是否能夠適應社會大潮流的需要,契合企業的要求即又較硬的動手操作及設計能力。此次的設計作業不僅增強了自己在專業設計方面的信心,鼓舞了自己,更是一次興趣的培養,為自己以後的學習方向的明確了重點。
另外在這次實驗中我們遇到了不少的問題針對不同的問題我們採取不同的解決方法,最終一一解決設計中遇到的問題。還有在實驗設計中我們曾遇到多塊晶元以及數碼管損壞的情況造成了數字鍾的顯示沒有達到預期的效果,或是根本不顯示,通過錯誤排除最終確認是元件問題,並向老師咨詢跟換元件最終的到解決。在我們曾經遇到不懂的問題時,利用網上的資源,搜索查找得到需要的信息。
『叄』 電子時鍾課程設計
微機原理
課程設計,
電子時鍾
,全做好發來,用8253計時。8255和
點陣屏
。說清楚就可以。
『肆』 單片機課程設計電子時鍾程序
#include <at89x51.h> //頭文件包含
#define uchar unsigned char //宏定義
#define uint unsigned int
#define ON 0 //定義0為打開
#define OFF 1 //定義1為關閉
#define LEDBus P1 //定義p1口為數碼管段碼口
sbit MIAO =P1^2; //秒點
sbit HOU_S=P3^0; //時十位位選
sbit HOU_G=P3^1; //時個位位選
sbit MIN_S=P3^2; //分十位位選
sbit MIN_G=P3^3; //分個位位選
sbit H_KEY=P3^4; //時調整鍵
sbit M_KEY=P3^5; //分調整鍵
bit SHAN; //閃爍標志位
uchar second,minute,hour; //定義秒、分、時寄存器
uchar code LEDTab[]={0x14,0xd7,0x4c, //數碼管段碼表0--9
0x45,0x87,0x25,0x24,0x57,0x04,0x05};
void delay(uchar t); //延時函數
void init(); //初始化函數
void display(); //顯示函數
void min_tiao(); //分調整函數
void hou_tiao(); //時調整函數
/***************************************
函 數 名:main
功 能:主函數
說 明:
入口參數:無
返 回 值:無
****************************************/
void main()
{
init(); //調用初始化函數
while(1) //主程序循環
{
if(!H_KEY) hou_tiao(); //如果時調整鍵按下(為0),調用時調整函數
if(!M_KEY) min_tiao(); //如果分調整鍵按下(為0),調用分調整函數
display(); //調用顯示函數
}
}
/***************************************
函 數 名:init
功 能:初始化函數
說 明:初始化定時器及中斷
入口參數:無
返 回 值:無
***************************************/
void init()
{
TMOD=1;TH0=0X3C;TL0=0XB0; //定時器0模式1,50毫秒
ET0=1;TR0=1;EA=1; //開定時器0中斷、啟動定時器0、開總中斷
}
/***************************************
函 數 名:display
功 能:顯示函數
說 明:
入口參數:無
返 回 值:無
***************************************/
void display()
{
LEDBus=LEDTab[minute%10]; //分個位送數碼管顯示
MIAO=SHAN; //秒點閃爍
MIN_G=ON; //打開分個位位選
delay(1); //顯示1毫秒
MIN_G=OFF; //關閉分個位位選
LEDBus=LEDTab[minute/10]; //分十位送數碼管顯示
MIAO=SHAN; //秒點閃爍
MIN_S=ON; //打開分十位位選
delay(1); //顯示1毫秒
MIN_S=OFF; //關閉分十位位選
LEDBus=LEDTab[hour%10]; //時個位送數碼管顯示
HOU_G=ON; //打開時個位位選
delay(1); //顯示1毫秒
HOU_G=OFF; //關閉時個位位選
if(hour/10) //如果時十位為0,不顯示十位數字
{
LEDBus=LEDTab[hour/10]; //時十位送數碼管顯示
HOU_S=ON; //打開時十位位選
delay(1); //顯示1毫秒
HOU_S=OFF; //關閉時十位位選
}
}
/***************************************
函 數 名:min_tiao
功 能:分調整
說 明:
入口參數:無
返 回 值:無
***************************************/
void min_tiao()
{
while(!M_KEY) display(); //等待分調整鍵松開
second=0;minute++; //秒清零、分加1
if(minute==60) minute=0; //如果分等於60,分變0
}
/***************************************
函 數 名:hou_tiao
功 能:時調整
說 明:
入口參數:無
返 回 值:無
***************************************/
void hou_tiao()
{
while(!H_KEY) display(); //等待時調整鍵松開
second=0;hour++; //秒清零,時加1
if(hour==24) hour=0; //如果時等於24,時變0
}
/***************************************
函 數 名:delay
功 能:延時函數
說 明:
入口參數:t:延時時間長短
返 回 值:無
***************************************/
void delay(uchar t)
{
uchar i; //定義變數
for(;t>0;t--) //如果t大於0,t減1(外層循環)
for(i=124;i>0;i--); //i等於124,如果i大於0,i減1
}
/***************************************
函 數 名:timer0
功 能:定時器0中斷函數
說 明:
入口參數:無
返 回 值:無
***************************************/
void timer0() interrupt 1 //定時器0(中斷1)
{
uchar tim1,tim2; //定義臨時變數
TL0=TL0+0XB0;TH0=0X3C; //重裝定時器初值
tim1++; //每中斷一次tim1加1
if(tim1==10) //中斷10(0.5秒)
{
SHAN=!SHAN; //閃爍標志取反
tim1=0;tim2++; //tim1清零,tim2加1
if(tim2==2) //到了1秒
{
tim2=0;second++; //tim2清零,秒加1
if(second==60) //如果秒到60
{
second=0;minute++; //秒變0,分加1
if(minute==60) //如果分到60
{
minute=0;hour++; //分變0,時加1
if(hour==24) hour=0; //如果時到24,時變0
}
}
}
}
}
/***************************************
program end 程序結束
『伍』 單片機課程設計 電子時鍾設計
基於AVR單片機Mega16的電子時鍾設計
摘要】 Mega16是一款採用先進RISC精簡指令,內置A/D的8位單片機內,可支持低電壓聯機Flash和EEPROM寫入功能容;同時還支持Basic和C等高級語言編程。用它設計電子時鍾不僅成本低,硬體簡單,而且很容易實現系統移植。介紹了如何利用AVR系列單片機Mega16及1602字元液晶來設計電子時鍾的方法,同時給出了相應的電路原理及部分語言程序。
『陸』 單片機de課程設計 數字電子鍾
可以代做的
『柒』 電子鍾課程設計(微機原理)急需!!!!
電子鬧鍾接線圖
設計原理:
計時功能:
用到的8254的功能只是相當於一個分頻計,輸入一定頻率的脈沖信號使每隔一秒就會在OUT0端產生0到1的躍變,作為中斷IRQ的請求信號。由於秒、分的進制形式不同,可通過中斷程序控制,由此完成計時功能。
顯示功能:
可以用四位二進制碼分別對應表示X4X3X2X1的邏輯值(1--高電平,0--低電平),實現時鍾的顯示功能。具體操作:首先將秒的個位數據通過8255的B埠送給數碼管,同時將二進制碼「0111」通過8255的A埠送給小鍵盤X4X3X2X1,這樣通過計算機的掃描後,就會在數碼管4上顯示秒的個位值;接著將秒的十位數據送給數碼管,同時將二進制碼「1011」送給小鍵盤X4X3X2X1,這樣就會在數碼管3上顯示相應的數值;同樣的道理,分別將分的個位、十位送給數碼管,「1101」 、「1110」送給小鍵盤X4X3X2X1,就會依次在數碼管2、1上顯示分的個位、十位數值。特別注意分秒的間隔點,由於數碼管共陰極,將數碼二進制最高位置1,其他為置0即可。
按鍵功能:
由於X1,X2,X3,X4低電平顯示相應的數碼管,利用讀回的Y1,Y2邏輯值辨別究竟按下哪個鍵,並通過相應的編程來完成不同鍵的按鍵功能。
(1)1鍵清除功能的設置:
在判別了按鍵的邏輯值為01110後,將存儲時間的每一個內存單元賦0,這樣在數碼管顯示的就是00.00,便達到了清除功能的目的。
(2)2鍵啟動、3鍵停止計時功能的設置:
在進行2鍵和3鍵功能設置之前,我們必須定義一個暫停標志位:PAUSE,它用標準的邏輯值(0、1)來表示,假如PAUSE=0,在進行計時設置的時候,讓其自動加1,依次顯示時間的各位;假如PAUSE=1,我們就將其返回,停止加1,即暫停計時。
接著,假如我們判別的是2鍵被按下,就令PAUSE=0,讓計數器計時,自動加1;假如我們按下的是3鍵,就令PAUSE=1,讓計數器暫停計時,即停止加1。
(3)4鍵終止程序功能的設置:
從上面的分析,我們已經知道,只有同時將對應鍵盤X列的低電平送到相應的數碼管才會使得數碼管亮,所以我們在判別了是4鍵被按下後,只要將鍵盤對應的二進制碼全部賦高電平,並送到數碼管,同時結束程序,就可以實現熄滅數碼管、退出程序的功能。
(4)5鍵重置初始值功能的設置:
在這里我們設置了兩個標志位:調整位標志ADJUST和閃爍標志FLASH。它們的具體設置如下:
ADJUST初始設置為00H,表示非調整狀態,01H表示調整秒的個位,02H表示調整秒的十位,03H表示調整分的個位,04H表示調整分的十位。
FLASH設置為邏輯值,初始設置為00H,表示非閃爍狀態,0FFH表示閃爍,其閃爍功能實現的過程為:假如FLASH=0FFH,則將00H送給數碼管,讓數碼管不顯示。然後,在中斷計時程序裡面,加入FLASH取反語句,由於計時程序每秒加1循環一次,這樣FLASH也實現了每秒改變邏輯值一次。也就是說,數碼管閃爍的周期是1秒。當然,閃爍標志位只是在有對應位需要調整的時候才用的著。
要實現5鍵設置初始時間的功能,我們就必須增加一個鍵(6鍵)來控制時間的增加。
(5)6鍵時間位加1功能的設置
這里,我們再引進一個標志位:按鍵標志KEYMARK。其設置為邏輯值,初始設置為0,表示允許響應此次按鍵,並在響應過後,將其置1;KEMARK為1時,表示不響應此次按鍵。之所以要設置此標志位,是因為鍵盤掃描的速度非常快,假如我按下6鍵需要調整時間加1,我按下的時間再怎麼短,計算機一定已經掃描了無數次,這樣一來,我只按了一次,時間位就會響應無數次,實現了無數次的加1,從而無法實現6鍵的功能。
匯編源程序:
INTCSR_BYTE0 EQU 9438H
INTCSR_BYTE1 EQU 9439H
INTCSR_BYTE2 EQU 943AH
INTCSR_BYTE3 EQU 943BH
IMB4_BYTE3 EQU 941FH
MY8254_COUNT0 EQU 9C40H
MY8254_COUNT1 EQU 9C41H
MY8254_COUNT2 EQU 9C42H
MY8254_MODE EQU 9C43H
MY8255_A EQU 9C60H
MY8255_B EQU 9C61H
MY8255_C EQU 9C62H
MY8255_MODE EQU 9C63H
IRQ EQU 01C8H
DATA SEGMENT
CSBAK DW ?
IPBAK DW ?
MKBAK DB ?
ADJUST DB 00H ;調整位標志
FLASH DB 00H ;閃爍標志位
PAUSE DB 0B ;暫停標志位
KEYMARK DB 0B ;按鍵標志位
INKEY DB 00H ;按鍵
SECONDA DB 00H ;秒個位
SECONDB DB 00H ;秒十位
MINUTEA DB 00H ;分個位
MINUTEB DB 00H ;分十位
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;數碼管0-9的編碼
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
CLI
MOV AX,DATA
MOV DS,AX
MOV DX,INTCSR_BYTE0
MOV AL,00H
OUT DX,AL
MOV DX,INTCSR_BYTE1
MOV AL,1FH
OUT DX,AL
MOV DX,INTCSR_BYTE2
MOV AL,3FH
OUT DX,AL
MOV DX,INTCSR_BYTE3
MOV AL,00H
OUT DX,AL
MOV AX,0000H
MOV ES,AX
MOV DI,01ccH ;保存系統中斷矢量
MOV AX,ES:[DI]
MOV IPBAK,AX
MOV AX,OFFSET MYINT
CLD
STOSW
MOV AX,ES:[DI]
MOV CSBAK,AX
MOV AX,SEG MYINT ;設置中斷矢量
STOSW
IN AL,0A1H
MOV MKBAK,AL
AND AL,0F7H
OUT 0A1H,AL
STI ;開中斷
MOV DX,MY8254_MODE ;8254初始化
MOV AL,15H ; 00010101:計數器0,只讀低八位,方式2分頻器,十進制
OUT DX,AL
MOV DX,MY8254_COUNT0
MOV AL,0
OUT DX,AL
MOV DX,MY8255_MODE ;8255初始化
MOV AL,81H ;10000001:A口:方式0,輸出,B口:方式 0 ,
;輸出,C口:低四位輸入,高四位輸出
OUT DX,AL
A1: NOP ;等待
MOV CX,32H
A2: MOV DX, MY8255_B
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET LED
MOV AL,SECONDA
XLAT LED
CMP ADJUST,01H ;是否調整秒的個位
JNE DIS_SECONDA
CMP FLASH,0FFH ;是否閃爍
JNE DIS_SECONDA
AND AL,00H ;熄滅數碼管(若FLASH=1)
DIS_SECONDA: ;顯示秒的個位
OUT DX, AL
MOV DX,MY8255_A
MOV AL,0111B
OUT DX,AL
CALL KEYCTR ;調用按鍵處理程序
CALL DELAY ;調用延遲程序
MOV DX,MY8255_B
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET LED
MOV AL,SECONDB
XLAT LED
CMP ADJUST,02H ;是否調整秒的十位
JNE DIS_SECONDB
CMP FLASH,0FFH
JNE DIS_SECONDB
AND AL,00H
DIS_SECONDB: ;顯示秒的十位
OUT DX,AL
MOV DX,MY8255_A
MOV AL,1011B
OUT DX,AL
CALL KEYCTR
CALL DELAY
MOV DX,MY8255_B
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET LED
MOV AL,MINUTEA
XLAT LED
CMP ADJUST,03H ;是否調整分的個位
JNE DIS_MINUTEA
CMP FLASH,0FFH
JNE DIS_MINUTEA
AND AL,00H
DIS_MINUTEA: ;顯示分的個位
ADD AL,80H ;顯示XX.XX中的點「.」
OUT DX,AL
MOV DX,MY8255_A
MOV AL,1101B
OUT DX,AL
CALL KEYCTR
CALL DELAY
MOV DX,MY8255_B
MOV AX,DATA
MOV DS,AX
MOV BX , OFFSET LED
MOV AL, MINUTEB
XLAT LED
CMP ADJUST,04H ;是否調整分的十位
JNE DIS_MINUTEB
CMP FLASH,0FFH
JNE DIS_MINUTEB
AND AL,00H
DIS_MINUTEB: ;顯示分的十位
OUT DX,AL
MOV DX,MY8255_A
MOV AL , 1110B
OUT DX,AL
CALL KEYCTR
CALL DELAY
LOOP SK1
JMP SK2
SK1: JMP A2
SK2: JMP A1
MYINT: PUSH DS
PUSH AX
PUSH DX
MOV DX,IMB4_BYTE3
IN AL,DX
MOV DX,INTCSR_BYTE2
MOV AL,3FH
OUT DX,AL
;清8259中斷標志
MOV AL,63H ;根據中斷號修改
OUT 0A0H,AL
MOV AL,62H
OUT 20H,AL
MOV AX,DATA
MOV DS,AX
NOT FLASH ;中斷處理程序
MOV KEYMARK,0B
CMP PAUSE,0B
JNE L1
INC SECONDA
CMP SECONDA,0AH
JC L1
MOV SECONDA,00H
INC SECONDB
CMP SECONDB,06H
JC L1
MOV SECONDB,00H
INC MINUTEA
CMP MINUTEA,0AH
JC L1
INC MINUTEB
MOV MINUTEA,00H
CMP MINUTEB,06H
JC L1
MOV MINUTEB,00H
L1: POP DS
POP AX
POP DX
IRET
KEYCTR PROC NEAR
MOV INKEY,AL
MOV DX,MY8255_C
IN AL,DX
AND AL,03H ;高六位清零
CMP AL,10B ;是否按下Y1行
JNE INY2
ADD INKEY,00H
JMP JUDGKEY
INY2: CMP AL,01B ;是否按下Y2行
JNE SKIP
ADD INKEY,10000B
JUDGKEY:
CMP INKEY,01110B ;是否按下1鍵
JNE KEY2
AND SECONDA,00H ;時間位清零
AND SECONDB,00H
AND MINUTEA,00H
AND MINUTEB,00H
SKIP: JMP BACK
KEY2: CMP INKEY,01101B ;是否按下2鍵
JNE KEY3
AND PAUSE,0B ;啟動計時
JMP BACK
KEY3: CMP INKEY,01011B ;是否按下3鍵
JNE KEY4
MOV PAUSE,1B ;暫停計時
JMP BACK
KEY4: CMP INKEY,00111B ;是否按下4鍵
JNE KEY5
MOV DX,MY8255_A
MOV AL,0FFH ;熄滅數碼管,程序退出
OUT DX,AL
CALL DELAY
MOV AX,4C00H
INT 21H
JMP BACK
KEY5: CMP INKEY,11110B ;是否按下5鍵
JNE KEY6
CMP KEYMARK,0B
JNE KEY6
MOV KEYMARK,1B
MOV PAUSE,1B
CMP ADJUST,04H ;是否已調整完分的十位
JE TL
INC ADJUST
JMP BACK
TL: AND ADJUST,00H
JMP BACK
KEY6: CMP INKEY,11101B ;是否按下6鍵
JNE BACK
CMP KEYMARK,0B
JNE BACK
MOV KEYMARK,1B
CMP ADJUST,01H ;是否調整秒的個位
JNE AD1
INC SECONDA ;秒的個位加1
CALL OUTCLEAR ;判斷溢出
JMP BACK
AD1: CMP ADJUST,02H ;是否調整秒的十位
JNE AD2
INC SECONDB
CALL OUTCLEAR
JMP BACK
AD2: CMP ADJUST,03H ;是否調整分的個位
JNE AD3
INC MINUTEA
CALL OUTCLEAR
JMP BACK
AD3: CMP ADJUST,04H ;是否調整分的十位
JNE BACK
INC MINUTEB
CALL OUTCLEAR
BACK: RET
KEYCTR ENDP
OUTCLEAR PROC NEAR ;溢出清零程序
CMP SECONDA,0AH
JC Q1
AND SECONDA,00H
Q1: CMP SECONDB,06H
JC Q2
AND SECONDB,00H
Q2: CMP MINUTEA,0AH
JC Q3
AND MINUTEA,00H
Q3: CMP MINUTEB,06H
JC Q4
AND MINUTEB,00H
Q4: RET
OUTCLEAR ENDP
DELAY: PUSH CX ;延遲程序
MOV CX,1111H
DXMS: LOOP DXMS
POP CX
RET
CODE ENDS
END START