|
0.png (42.21 KB, 下載次數(shù): 54)
下載附件
2016-9-4 21:13 上傳
0.png (67.39 KB, 下載次數(shù): 63)
下載附件
2016-9-4 21:15 上傳
電子琴與倒計時播放音樂全部資料下載:
電子琴和倒計時播放音樂.rar
(30.5 KB, 下載次數(shù): 47)
2016-9-4 21:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
功能:
一、能通過按鍵,自行彈奏電子琴類的音樂;
二、能寫好音樂代碼后,自動播放音樂。 已通過測試。
帶有proteus仿真,用匯編語言編寫,內(nèi)有詳細注解
電子琴的基本原理是產(chǎn)生各個音符對應的頻率,將頻率放大后驅(qū)動喇叭發(fā)出音響。該電子琴包括手動彈奏與自動演奏兩種功能,其中手動彈奏時還可錄音回放
匯編源碼如下:
- ORG 0000H
- SL EQU 30H ; SL存放秒的個位數(shù)
- SH EQU 31H ; SH存放秒的十位數(shù)
- ML EQU 32H ; ML存放分的個位數(shù)
- MH EQU 33H ; MH存放分的十位數(shù)
- HL EQU 34H ; HL存放時的個位數(shù)
- HH EQU 35H ; HH存放時的十位數(shù)
- ;
- L0 EQU 36H ; L0~L3:顯示數(shù)據(jù)存儲器
- L1 EQU 37H
- L2 EQU 38H
- L3 EQU 39H
- DSPLYP EQU 3AH ; 顯示數(shù)據(jù)指針(DISPLAY-POINT)
- PLYTS EQU 3BH ; 顯示次數(shù)計數(shù)器(DISPLAY-TIMES)
- ;
- LPLMOD BIT 39H ; 低兩位顯示方式(LOW-PLAY-MOD)
- HPLMOD BIT 3AH ; 高兩位顯示方式(HIGH-PLAY-MOD)
- BRIGHT BIT 3BH ; DISPLAY子程序參數(shù):亮滅指示位
- ;
- TCOUNT EQU 3CH ; 時間計數(shù)器(TIME-COUNT)
- ;
- ADDRES EQU 3DH ; 加1子程序參數(shù)
- MAX EQU 3EH ; 加1子程序參數(shù)
- IFDEC BIT 20H ; BCD加法子程序參數(shù)
- ;
- R_MOD EQU 3FH ; 響鈴方式參數(shù)
- ;
- LED4 BIT 30H ; 發(fā)光管狀態(tài)位
- BELL BIT P1.7 ; 蜂鳴器
- SWITCH BIT P3.7 ; 繼電器
- FKEY BIT P3.0 ; 功能鍵 (S1)
- MKEY BIT P3.1 ; 修改鍵 (S2)
- ;
- WORKIN BIT 38H ; 工作狀態(tài)指示位
- ;
- SJMP START
- ORG 000BH
- LJMP LOOP1
- ;ORG 001BH
- ;LJMP INT_1
- ORG 001BH
- JNB P0.6,YINYUE1 ;低音樂
- LJMP DIANZIQIN1
- ORG 0030H
- DIANZIQIN1:
- ;JB P0.1,ZIJIDE
- JnB P3.6,HUAN ;高主
- ;YINYUE1:ljmp YINYUE11
- ZIJIDE:;CLR P2.0
- LJMP INT_1
- HUAN:LJMP DIANZIQIN
- YINYUE1:INC 20H ;中斷服務,中斷計數(shù)器加1
- MOV TH1,#0D8H
- MOV TL1,#0EFH ;12M晶振,形成10毫秒中斷
- RETI
- START: LJMP MAIN ; 0000H 引向主程序
- LJMP ERR ; 0003H
- NOP
- NOP
- LJMP ERR ; 引向出錯處理程序
- LOOP1: LJMP PGT0 ; 000BH 引向中斷處理程序PGT0
- NOP
- NOP
- LJMP ERR ; 引向出錯處理程序
- LOOP2: LJMP ERR ; 0013H INT1
- NOP
- NOP
- LJMP ERR
- LOOP3:LJMP ERR ; 001BH T1
- NOP
- NOP
- LJMP ERR
- LOOP4:LJMP ERR ; 0023H
- NOP
- NOP
- LJMP ERR
- LJMP ERR ; 002BH
- NOP
- NOP
- ;
- ;************
- ; 主程序 ;
- ;************
- MAIN: JNB P0.6,CCC
- LJMP DIANZIQIN
- ;CCC:LJMP YINYUE
- CCC:MOV IE,#00H ; 關中斷
- MOV SP,#57H ; 設置堆棧指針
- MOV PSW,#00H ; 選用寄存器組0
- MOV TMOD,#11H ; 設定中斷工作方式為T0和T1
- ;
- MOV A,56H
- CJNE A,#0AAH,CSTART ; 判上電復位標志,無標志轉(zhuǎn)冷啟動
- MOV A,57H
- CJNE A,#55H,CSTART ; 無標志轉(zhuǎn)冷啟動
- AJMP HSTART ; 有上電復位標志轉(zhuǎn)熱啟動
- NOP
- NOP
- LJMP ERR ; 軟件陷阱,引向出錯處理程序
- CSTART: MOV P1,#0FFH ; 冷啟動,全面初始化
- MOV P3,#0FFH
- MOV TCON,#00H ; 計時停止
- MOV TL0,#0B0H ; 賦中斷T0初值
- MOV TH0,#3CH
- MOV TCOUNT,#0AH ; 賦定時器初值
- MOV R5,#00H ; R5為一空單元(備用)
- MOV R4,#00H ; R4 為工作模式選擇寄存器
- MOV SL,#00H ; 定時單元清零
- MOV SH,#00H ; 秒
- MOV ML,#00H ;
- MOV MH,#00H ; 分
- MOV HL,#00H ;
- MOV HH,#00H ; 時
- MOV PLYTS,#64H ; 賦顯示次數(shù)初值為100次
- MOV DSPLYP,#L0 ; 顯示指針指向顯存單元
- MOV L0,#0AH ; 送顯示數(shù)據(jù)"-----"
- MOV L1,#0AH
- MOV L2,#0AH
- MOV L3,#04H
- SETB LED4 ; LED4為數(shù)碼管之間的發(fā)光二極管
- SETB LPLMOD ; 設定顯示方式為閃爍
- SETB HPLMOD ;
- SETB BRIGHT ; 允許顯示
- CLR WORKIN ; 清工作標志 , 待命
- AJMP SETUP ; 轉(zhuǎn)開始工作
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- HSTART: MOV SCON,#00H ; 有上電標志,熱啟動,清串行口控制寄存器
- MOV IP,#00H ; 清中斷優(yōu)先控制寄存器
- SETB FKEY ; 重設按鍵
- SETB MKEY
- SETB EA ; 開中斷
- AJMP BEGIN ; 轉(zhuǎn)向繼續(xù)工作
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- SETUP: SETB EA ; 開中斷
- ;
- MAIN1: ACALL DISPLY ; 調(diào)用顯示
- JB FKEY,JUDGE ; 按鍵掃描
- ACALL KEYDLY ; 延時消抖動
- JB FKEY,JUDGE ; 無鍵按下轉(zhuǎn)向判斷是否到點
- CLR ET0 ; 功能鍵被按下,則
- CLR TR0 ; 暫停計時
- ACALL MENU ; 調(diào)用菜單設置程序
- BEGIN: SETB WORKIN ; 置工作標志位,開始工作
- SETB ET0 ; 開中斷
- SETB TR0 ; 開始計時
- MOV A,R4 ; 移入工作模式選擇
- RL A ; 指針放大
- MOV DPTR,#M_TAB
- JMP @A+DPTR ; 根據(jù)工作模式跳轉(zhuǎn)到相應程序段
- M_TAB: AJMP WORK1
- AJMP WORK2
- AJMP WORK3
- AJMP WORK4
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- WORK1: ;
- WORK2: CLR SWITCH ; 工作方式1和2:開繼電器
- AJMP MAIN2
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- WORK3: ;
- WORK4: SETB SWITCH ; 工作方式3和4:不開繼電器
- MAIN2: CLR BELL ; 蜂鳴器短鳴一聲,以示開始工作
- ACALL DL05S
- SETB BELL
- JUDGE: JNB WORKIN,MAIN1 ; 判斷是否在定時之中
- MOV A,SL ; 判斷秒是否為零
- JNZ MAIN1
- MOV A,SH ; 判斷秒是否為零
- JNZ MAIN1
- MOV A,ML ; 判斷分是否為零
- JNZ MAIN1
- MOV A,MH ; 判斷分是否為零
- JNZ MAIN1
- MOV A,HL ; 判斷時是否為零
- JNZ MAIN1
- MOV A,HH ; 判斷時是否為零
- JNZ MAIN1 ; 若時分秒全為零則
- CLR ET0 ; 停止計時
- CLR TR0 ;
- ACALL ACTION ; 調(diào)用到點工作子程序
- AJMP MAIN ; 返回
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;******************
- ; 倒計時程序 ;
- ;******************
- PGT0: CLR EA ; 關中斷
- PUSH ACC ; 保護現(xiàn)場
- PUSH PSW
- PUSH DPL
- PUSH DPH
- MOV PSW,#08H ; 選用寄存器組1
- CLR TR0 ; 暫停計時
- MOV A,#0B7H ; 中斷同步修正
- ADD A,TL0
- MOV TL0,A
- MOV A,#3CH
- ADD A,TH0
- MOV TH0,A
- SETB TR0 ; 恢復計時
- DEC TCOUNT ; 定時器T0每50 000毫秒溢出一次,則
- MOV A,TCOUNT ; 溢出10次為0.5秒
- JNZ OUTT0 ; 判斷是否到半秒
- MOV TCOUNT,#0AH ;
- CPL LED4 ; 若到半秒LED取反
- JNB LED4,OUTT0 ; LED每閃爍一次是一秒
- MOV R0,#SH ; 移入秒位的地址
- SETB IFDEC ; BCD子程序參數(shù),使其做減法
- ACALL ADDBCD ; 調(diào)用BCD子程序, 秒減1
- CJNE R3,#99H,OUTT0 ; 判斷秒要否借位
- MOV SH,#05H ; 要借位則
- MOV SL,#09H ; 送數(shù)據(jù)59(否則顯示99)
- MOV R0,#MH ; 移入分位的地址
- ACALL ADDBCD ; 分減1
- CJNE R3,#99H,OUTT0 ; 判斷分要否借位
- MOV MH,#05H
- MOV ML,#09H
- MOV R0,#HH
- ACALL ADDBCD
- OUTT0: POP DPH ; 恢復現(xiàn)場
- POP DPL
- POP PSW
- POP ACC
- SETB EA
- RETI ; 中斷返回
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;
- ;**************************
- ; BCD子程序(加1或減1 ) ;
- ;**************************
- ADDBCD: MOV A,@R0 ; 移入被操作數(shù)的高位
- DEC R0 ; 指針減一
- SWAP A
- ORL A,@R0 ; 移入被操作數(shù)的低位
- MOV B,#01H ; B寄存器送立即數(shù)#01H
- MOV C,IFDEC ; 若減法標志位為1,則
- MOV B.3,C ;
- MOV B.4,C ; B寄存器的值被改為#99H
- MOV B.7,C ;
- ADD A,B ; 對一個壓縮的BCD碼加#99H等于對其減一
- DA A ; BCD碼調(diào)整
- MOV R3,A ; 暫存結(jié)果
- ANL A,#0FH ; 取低位碼
- MOV @R0,A ; 存數(shù)
- MOV A,R3 ; 取回結(jié)果
- INC R0 ; 指針加一
- SWAP A ; 交換
- ANL A,#0FH ; 取結(jié)果數(shù)的高位
- MOV @R0,A ; 存數(shù)
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;**************
- ; 加1程序 ;
- ;**************
- ADDONE: MOV R0,ADDRES ; 移入被加數(shù)單元的地址
- CLR IFDEC ; 設定BCD子程序做加法
- ACALL ADDBCD ; 調(diào)用BCD子程序
- CLR C ; 判斷被加數(shù)是否大于
- MOV A,R3 ; 最大值"MAX"
- CJNE A,MAX,JGOVER
- JGOVER: JC ENDADO
- CLR A ; 若大于"MAX",則清零
- MOV @R0,A
- DEC R0
- MOV @R0,A
- ENDADO: RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;******************
- ; 調(diào)時快進程序 ;
- ;******************
- QUICK: CLR LPLMOD ; 設定顯示方式不閃爍
- CLR HPLMOD
- ACALL ADDONE ; 調(diào)用加1子程序
- MOV L0,R4 ; 將工作模式選擇數(shù)移入顯存
- INC L0 ; 加1轉(zhuǎn)化成顯示值
- ACALL KEYDLY ; 延時
- ACALL DL100
- JNB MKEY,QUICK ; 判斷鍵是否松開
- SETB LPLMOD ; 若松開則恢復閃爍顯示方式
- CJNE R6,#02H,ENDQUK
- SETB HPLMOD
- CLR LPLMOD
- ENDQUK: RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;
- ;******************
- ; 功能菜單程序 ;
- ;******************
- MENU: MOV R6,#00H ; 初始化; R6 計功能鍵按鍵次數(shù)
- MOV ADDRES,#05H ; 將 R5 的地址送入,以便于改變 R4 的值
- MOV MAX, #04H ; 定義工作模式選擇寄存器R4 的最大值
- MOV DSPLYP,#L0 ; 定義顯示指針指向顯存
- SETB LPLMOD ; 設定低兩位數(shù)閃爍
- CLR HPLMOD
- MOV L0,R4 ; 送顯示數(shù)據(jù)"F-0X"
- INC L0
- MOV L1,#00H
- MOV L2,#0BH
- MOV L3,#00H
- SETB LED4
- ;
- WAITFK: ACALL DISPLY ; 等待F鍵釋放
- JNB FKEY,WAITFK
- MENU1: ACALL DISPLY
- JB MKEY,JGFKEY ; M鍵掃描
- ACALL KEYDLY ; 延時消抖動
- JB MKEY,JGFKEY ; 未按下則轉(zhuǎn)F鍵掃描
- CJNE R6,#00H,NEXT1 ;
- MOV SL,#00H ; 若中途改變定時方式,則清除原計時數(shù)據(jù)
- MOV SH,#00H
- MOV ML,#00H
- MOV MH,#00H
- MOV HL,#00H
- MOV HH,#00H
- NEXT1: MOV R2,#00H ; R2用于判斷按鍵時間是否超過0.5秒
- NEXT2: ACALL ADDONE ; 調(diào)用加1程序
- MOV L0,R4 ; 移入工作方式選擇數(shù)
- INC L0
- ;
- WAITMK: ACALL DISPLY ; 等待M鍵釋放
- INC R2 ; R2自增一
- CLR C
- CJNE R2,#0C8H,JGQUIC ; 若R2大于等于200則調(diào)用快進子程序
- JGQUIC: JC WATMK1
- ACALL QUICK
- WATMK1: JNB MKEY,WAITMK ; R2小于200則等待M鍵釋放
- ;
- JGFKEY: JB FKEY,MENU1 ; 功能(F)鍵掃描
- ACALL KEYDLY ; 延時消抖動
- JB FKEY,MENU1 ; 鍵未按下則轉(zhuǎn)修改(M)鍵掃描
- INC R6 ; F鍵按鍵次數(shù)加1
- MOV A,R6 ; 移入按鍵次數(shù)
- RL A ; 指針放大
- MOV DPTR,#FUNTAB
- JMP @A+DPTR ; 根據(jù)按鍵次數(shù)跳轉(zhuǎn)到相應的程序段
- FUNTAB: AJMP WAITFK
- AJMP SETLOW
- AJMP SETHI
- AJMP ENDMEN
- NOP
- NOP
- AJMP ENDMEN
- ;STWKMD: ; 工作模式設定,不需另外改變菜單
- ;
- SETLOW: MOV MAX,#60H ; 設置低位(秒位或分位)
- MOV A,R4 ; 移入工作模式選擇數(shù)
- RL A ; 指針放大
- MOV DPTR,#FTAB1
- JMP @A+DPTR ; 根據(jù)工作模式選擇數(shù)跳轉(zhuǎn)到相應的程序段
- FTAB1: AJMP SETSS
- AJMP SETM60
- AJMP SETSS
- AJMP SETM60
- NOP
- NOP
- AJMP WAITFK
- SETSS: MOV DSPLYP,#SL ; 設定顯示區(qū)域為MM:SS
- MOV ADDRES,#SH
- AJMP WAITFK
- SETM60: MOV DSPLYP,#ML ; 設定顯示區(qū)域為HH:MM
- MOV ADDRES,#MH
- AJMP WAITFK
- ;
- SETHI: CLR LPLMOD ; 設置高位(分位或時位)
- SETB HPLMOD ; 高兩位數(shù)碼管閃爍
- MOV MAX,#31H ; 最大數(shù)為30
- MOV A,R4 ; 移入工作模式選擇數(shù)
- RL A ; 指針放大
- MOV DPTR,#FTAB2 ; 移入表首地址
- JMP @A+DPTR ; 根據(jù)工作模式選擇數(shù)跳轉(zhuǎn)到相應的程序段
- FTAB2: AJMP SETM30
- AJMP SETHH
- AJMP SETM30
- AJMP SETHH
- NOP
- NOP
- AJMP WAITFK ; 返回等待鍵釋放
- SETM30: MOV ADDRES,#MH ; 移入分位的地址
- AJMP WAITFK ; 轉(zhuǎn)向等待鍵釋放
- SETHH: MOV ADDRES,#HH ; 移入時位的地址
- AJMP WAITFK ; 轉(zhuǎn)向等待鍵釋放
- ;
- ENDMEN: CLR HPLMOD ; 恢復不閃爍顯示方式
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;****************
- ; 到點工作程序 ;
- ;****************
- ACTION: MOV L0,R4 ; 移入工作模式選擇數(shù)
- INC L0 ; 送顯示數(shù)"F-0X"
- MOV L1,#00H
- MOV L2,#0BH
- MOV L3,#00H
- SETB LED4
- MOV DSPLYP,#L0 ; 指針指向顯存
- SETB LPLMOD ; 設定顯示方式不閃爍
- SETB HPLMOD
- MOV A,R4 ; 移入工作模式選擇數(shù)
- RL A ;
- MOV DPTR,#A_TAB
- JMP @A+DPTR ; 根據(jù)工作模式選擇數(shù)跳轉(zhuǎn)
- A_TAB: AJMP ACTF1 ; 工作模式一
- AJMP ACTF1 ; 工作模式二
- AJMP ACTF3 ; 工作模式三
- AJMP ACTF3 ; 工作模式四
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ACTF1: SETB SWITCH ; 工作模式一(或二): 開繼電器
- LJMP AAA
- BBB: MOV R_MOD,#82H ; 響鈴模式參數(shù)#82H
- MOV R2,#96H ; 響鈴次數(shù)參數(shù)#96H
- ACTF11: ACALL RING ; 調(diào)用響鈴子程序
- JNB MKEY,ENDACT ; 等待鍵按下
- JNB FKEY,ENDACT ; 有鍵按下則結(jié)束響鈴
- DJNZ R2, ACTF11 ; 次數(shù)未滿繼續(xù)響鈴
- MOV R_MOD,#0FFH ; 參數(shù)#0FF使響鈴無效
- AJMP ACTF11 ; 無鍵按下返回
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ACTF3: CLR SWITCH ; 工作模式三(或四): 開繼電器
- CLR BELL ; 蜂鳴器短鳴一聲
- ACALL DL1S
- SETB BELL
- MOV R_MOD,#0FFH ; 響鈴模式參數(shù)#0FFH
- MOV R2,#96H ; 響鈴時間參數(shù)#96H
- ACTF31: ACALL RING ; 調(diào)用響鈴子程序
- JNB MKEY,ENDACT ; 等待鍵按下
- JNB FKEY,ENDACT ; 有鍵按下則結(jié)束
- DJNZ R2,ACTF31 ; 次數(shù)未滿繼續(xù)
- MOV R2,#96H ; 重新賦值
- CLR BELL ; 短鳴一聲(說明: 響鈴模式參數(shù)#0FFH使
- ACALL DL100 ; 響鈴程序無效,僅起延時作用,
- SETB BELL ; 每延時一段時間短鳴一聲,以
- AJMP ACTF31 ; 提醒使用者繼電器仍在工作)
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ENDACT: SETB SWITCH ; 關繼電器
- AWAITF: ACALL DISPLY ; 調(diào)用顯示
- JNB FKEY,AWAITF ; 等待鍵釋放
- AWAITM: ACALL DISPLY ; 調(diào)用顯示
- JNB MKEY,AWAITM ; 等待鍵釋放
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;**************
- ; 響鈴程序 ;
- ;**************
- RING: MOV R5,#18H ; R5為循環(huán)控制變量
- RING1: JNB MKEY,R_EXIT ; 鍵掃描
- JNB FKEY,R_EXIT ; 有鍵按下則退出
- MOV A,R_MOD ; 移入響鈴模式參數(shù)
- MOV C,ACC.7 ; 根據(jù)響鈴模式參數(shù)改變響鈴
- MOV BELL,C
- RL A
- MOV R_MOD,A
- ACALL DL100 ; 延時
- DJNZ R5,RING1 ; 循環(huán)次數(shù)控制
- R_EXIT: SETB BELL ; 關閉響鈴
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;**************
- ; 顯示程序 ;
- ;**************
- DISPLY: PUSH ACC ; 數(shù)據(jù)壓棧保護
- PUSH PSW
- MOV PSW,#10H ; 選用寄存器組2
- MOV R0,DSPLYP ; 移入顯示指針
- MOV R2,#0FDH ; R2寄存的是數(shù)碼管選通數(shù)
- MOV A,PLYTS ; 移入顯示循環(huán)控制量
- JNZ PLAY ; 不為0則轉(zhuǎn)PLAY
- MOV PLYTS,#64H ; 否則從新賦值
- CPL BRIGHT ; 亮滅指示位取反
- PLAY: DEC PLYTS ; 顯示循環(huán)控制量減1
- JNB LPLMOD,PLAYL ; 低兩位數(shù)碼管不閃則"PLAYL"
- JB BRIGHT,PLAYL ; 亮滅指示為1也"PLAYL"
- ACALL NOPLAY ; 否則滅燈延時
- AJMP PLAY1 ; 轉(zhuǎn)顯示高位數(shù)碼管
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;用來顯示低位
- PLAYL: ORL P1,#7FH ; 清原顯示數(shù)據(jù)
- ORL P3,#3CH ; 清原選通數(shù)據(jù)
- MOV A,R2 ; 移入數(shù)碼管位選數(shù)
- RL A ; 換一位
- ANL P3,A ; 選通低位的個位數(shù)碼管
- MOV R2,A ; 暫存位選數(shù)
- MOV A,@R0 ; 移入顯示數(shù)值
- MOV DPTR,#TABLE1 ; 移入表首地址
- MOVC A,@A+DPTR ; 查表
- ANL P1,A ; 送顯示數(shù)據(jù)
- ACALL DL1MS ; 延時
- INC R0 ; 指向低位的十位數(shù)
- JB P3.3,PLAYL ; 顯示低位的十位數(shù)
- ;
- PLAY1: JNB HPLMOD,PLAYH ; 高兩位數(shù)碼管不閃則"PLAYH"
- JB BRIGHT,PLAYH ; 亮滅指示為1也"PLAYH"
- ACALL NOPLAY ; 否則滅燈延時
- AJMP OUTPLY ; 轉(zhuǎn)結(jié)束
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;用來顯示高位
- PLAYH: ORL P1,#7FH ; 清原顯示數(shù)據(jù)
- ORL P3,#3CH ; 清原選通數(shù)據(jù)
- ANL P3,#0EFH ; 選通高位的個位數(shù)數(shù)碼管
- MOV A,@R0 ; 移入顯示數(shù)值
- MOV DPTR,#TABLE1 ; 移入表首地址
- MOVC A,@A+DPTR ; 查表
- ANL P1,A ; 送顯示數(shù)據(jù)
- ACALL DL1MS ; 延時
- INC R0 ; 指向高位的十位數(shù)
- ; ; 顯示高位的十位數(shù)
- ORL P1,#7FH ; 清原顯示數(shù)據(jù)
- ORL P3,#3CH ; 清原選通數(shù)據(jù)
- ANL P3,#0DFH ; 選通高位的十位數(shù)
- MOV A,@R0 ; 移入顯示數(shù)值
- MOV C,LED4 ; 指針放大+小燈狀態(tài)
- RLC A ;
- MOV DPTR,#TABLE2 ; 移入表首地址
- MOVC A,@A+DPTR ; 查表
- ANL P1,A ; 送顯示數(shù)據(jù)
- ACALL DL1MS ; 延時
- ;
- OUTPLY: POP PSW ; 恢復數(shù)據(jù)
- POP ACC
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
- ; "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
- ;
- TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH
- ; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:"
- ;
- ;
- ;
- ;**********************
- ; 無顯示(滅燈)程序 ;
- ;**********************
- NOPLAY: ORL P1,#7FH ; 清顯示數(shù)據(jù)
- ORL P3,#3CH ; 清選通數(shù)據(jù)
- INC R0 ; 指針自增2
- INC R0
- ACALL DL1MS ; 延時
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;******************
- ; 延時程序 ;
- ;******************
- DL1MS: MOV R3,#0F9H ; 延時 1250US 只為DISPLY所調(diào)用
- DL1MS1: NOP
- NOP
- NOP
- DJNZ R3,DL1MS1
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- KEYDLY: CLR BELL ; 按鍵消抖動專用延時程序,
- ACALL DISPLY ; 在消除抖動的同時發(fā)出按鍵提示音
- SETB BELL
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- DL50MS: MOV R7,#0AH ; 50毫秒延時程序
- DL50M1: ACALL DISPLY ; 每調(diào)用一次顯示程序5MS
- DJNZ R7,DL50M1 ; 調(diào)用10次
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- DL100: ACALL DL50MS ; 延時100毫秒
- ACALL DL50MS
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- DL05S: ACALL DL100 ; 延時0.5秒
- ACALL DL100
- ACALL DL100
- ACALL DL100
- ACALL DL100
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- DL1S: ACALL DL05S ; 延時1秒
- ACALL DL05S
- RET
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ;****************************
- ; ERR(出錯處理) 程序 ;
- ;****************************
- ERR: CLR EA ; 關中斷
- MOV DPTR,#ERR1 ; 準備返回地址
- PUSH DPL ; 壓棧
- PUSH DPH ;
- RETI ; 中斷返回
- ERR1: MOV 56H,#0AAH ; 建立上電標志(出錯標志)
- MOV 57H,#55H
- MOV A,#00H ; 準備返回地址
- PUSH ACC ; 壓棧
- PUSH ACC
- RETI ; 中斷返回
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;
- ORG 07FAH
- NOP
- NOP
- NOP
- LJMP ERR ; 軟件陷阱
- ;AAA:JNB P0.6,CCC
- ;CCC:LJMP YINYUE
- ;LJMP DIANZIQIN
- DIANZIQIN:;MOV P0,#00H
- ;clr p3.6
- ;setb P0.1
- SETB EA
- SETB ET1 ;計數(shù)器0
- MOV TMOD,#20H
- MOV TH1,#09CH
- MOV TL1,#09CH ;定時器初植
- CLR TR1 ;定時器不允許
- SCAN: ;鍵盤掃描
- MOV A,P2 ;判斷鍵盤按下,跳到SCAN_1,若未按,繼續(xù)掃描
- CJNE A,#0FFH,SCAN_1
- NOP
- SJMP SCAN
- SCAN_1:
- ACALL DELAY ;是不是真的要按下?如果是,則跳轉(zhuǎn)SU_KEY查詢是哪個按下?
- MOV A,P2
- CJNE A,#0FFH,SU_KEY
- NOP
- SJMP SCAN
- SU_KEY:JNB P0.6,LOOP11
- ;SJMP LOOP2
- ;LOOP11:LJMP AAA
- JNB P2.1,MU_1 ;判斷是哪個鍵按下?
- JNB P2.2,MU_2
- JNB P2.3,MU_3
- JNB P2.4,MU_4
- JNB P2.5,MU_5
- JNB P2.6,MU_6
- JNB P2.7,MU_7
- SJMP SCAN
- LOOP11:LJMP AAA
- ;R1信號周期
- MU_1: MOV R1,#19 ;如果第一個按鍵按下,則R1=19,同時程序轉(zhuǎn)NEXT
- SJMP NEXT
- MU_2: MOV R1,#17
- SJMP NEXT
- MU_3: MOV R1,#15
- SJMP NEXT
- MU_4: MOV R1,#14
- SJMP NEXT
- MU_5: MOV R1,#13
- SJMP NEXT
- MU_6: MOV R1,#11
- SJMP NEXT
- MU_7: MOV R1,#10
- SJMP NEXT
- NEXT: MOV A,R1
- MOV R0,A
- SETB TR1 ;啟動定時器0
- NEXT_1:MOV A,P2 ; 沒鍵按下繼續(xù)執(zhí)行,有鍵按下,返回讀引腳
- CJNE A,#0FFH,NEXT_1
- ACALL DELAY
- MOV A,P2 ;真的沒鍵按下?
- CJNE A,#0FFH,NEXT_1
- CLR TR1 ;不響
- AJMP SCAN ;掃描鍵盤去
- INT_1: ;中斷程序
- DJNZ R0,RE ;R0不等于0時,返回
- CPL P0.0
- MOV A,R1
- MOV R0,A
- RE: RETI
- DELAY:MOV R7,#100 ;延長時間等待,鍵盤消抖
- D1: MOV R6,#10
- D2: DJNZ R6,D2
- DJNZ R7,D1
- ;LJMP BBB
- RET
- AAA:
- SETB P3.6
- ;CLR P0.6
- MOV SP,#50H
- MOV TH1,#0D8H
- MOV TL1,#0EFH
- MOV TMOD,#10H
- MOV IE,#88H
- LJMP TIAO
- MUSIC0:;JB P0.6,QIN
- ;LJMP BBB
- TIAO:
- NOP
- MOV DPTR,#DAT ;表頭地址送DPTR
- MOV 20H,#00H ;中斷計數(shù)器清0
- MOV B,#00H ;表序號清0
- MUSIC1:
- ;JnB P0.1,duan
- NOP
- CLR A
- MOVC A,@A+DPTR ;查表取代碼
- JZ END0 ;是00H,則結(jié)束
- CJNE A,#0FFH,MUSIC5
- LJMP MUSIC3
- duan:ljmp BBB
- MUSIC5:
- NOP
- MOV R6,A
- INC DPTR
- MOV A,B
- MOVC A,@A+DPTR ;取節(jié)拍代碼送R7
- MOV R7,A
- SETB TR1 ;啟動計數(shù)
- MUSIC2:
- ;clr P3.6
- NOP
- CPL P0.0
- MOV A,R6
- MOV R3,A
- LCALL DEL
- MOV A,R7
- CJNE A,20H,MUSIC2 ;中斷計數(shù)器(20H)=R7否?
- ;不等,則繼續(xù)循環(huán)
- ;JB P0.6,QIN
- ;jb p0.6,QIN
- ;jnb p0.4,ting
- MOV 20H,#00H ;等于,則取下一代碼
- INC DPTR
- ;JB P0.6,QIN
- ; INC B
- LJMP MUSIC1
- ;ting:ljmp BBB
- ;QIN:CLR TR1
- ;QIN:LJMP DIANZIQIN
- ;DIANZIQIN
- MUSIC3:
- NOP
- CLR TR1 ;休止100毫秒
- MOV R2,#0DH
- MUSIC4:
- NOP
- MOV R3,#0FFH
- LCALL DEL
- DJNZ R2,MUSIC4
- INC DPTR
- LJMP MUSIC1
- END0:
- NOP
- MOV R2,#64H ;歌曲結(jié)束,延時1秒后繼續(xù)
- MUSIC6:
- MOV R3,#00H
- LCALL DEL
- DJNZ R2,MUSIC6
- LJMP MUSIC0
- DEL:
- NOP
- DEL3:
- MOV R4,#02H
- DEL4:
- NOP
- DJNZ R4,DEL4
- NOP
- DJNZ R3,DEL3
- RET
- NOP
- DAT:
- db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
- db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
- db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
- db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
- db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
- db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
- db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
- db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
- db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
- db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
- db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
- db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
- db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
- db 20h,10h,2bh,10h,26h,30h,30h,80h,00H
- END
復制代碼
|
|