?? 99qda.asm
字號:
;/********************************************************************************
;* 標題: xl系列單片機實驗儀演示程序 乘法口訣模擬答題器 *
;* 日期: 2006-1-5 *
;* 版本: 3.0 (試驗通過版)可用xl600-xl1000單片機綜合試驗儀試驗 *
;* 郵箱: sxj1974@163.com *
;* 網(wǎng)站: http://www.51c51.com www.8951.com *
;********************************************************************************
;* 描述: *
;* 0#--- 模擬出題控制開關(guān); 0c--- 正確答案提示; *
;* (0-9)--- 有效數(shù)字輸入; *
;* 開機后,按0#鍵,隨機出題,看到題目后從鍵盤輸入答案 答題正確,蜂鳴器響3聲 *
; 繼續(xù)出下一題,如果不知道答案則按0c鍵, 提示正確的答案 *
;* 硬件連接:插上1602液晶,喇叭接P3.7 ,矩陣鍵盤接p1口 *
;********************************************************************************
;* 【版權(quán)】 Copyright(C)深圳市學(xué)林電子有限公司 www.51c51.com *
;* 【聲明】 此程序僅用于學(xué)習(xí)與參考,引用請注明版權(quán)和作者信息! *
;* 【技術(shù)支持】請訪問http://www.51c51.com/bbs/index.asp 官方論壇 *
;********************************************************************************/
TEMP EQU 40H ;被乘數(shù)、乘數(shù)、乘積存放單元
HDATA EQU 45H ;輸入答案值高位
LDATA EQU 46H ;輸入答案值低位
STRING BIT 20H.0 ;寫字符串延時標志
TRUER BIT 20H.1 ;數(shù)據(jù)比較正確標志
KEYDOWN BIT 20H.3 ;鍵按下標志
BEEP BIT P3.7
LCD_RS EQU P2.0
LCD_RW EQU P2.1
LCD_EN EQU P2.2
;**********************************************************
ORG 0000H
LJMP MAIN
ORG 0030H
;**********************************************************
; 主程序
;**********************************************************
MAIN:
MOV SP,#70H
MOV TEMP+0,#00H ;初始化內(nèi)存單元
MOV TEMP+1,#00H
MOV TEMP+2,#00H
MOV TEMP+3,#00H
MOV HDATA,#00H
MOV LDATA,#00H
CLR KEYDOWN
ACALL LCD_INIT
SETB STRING
MOV A,#80H ;顯示在第一行
MOV DPTR,#CHAR1
ACALL WR_STRING ;顯示 WELCOME TO
MOV A,#0C0H ;顯示在第二行
ACALL LCD_CMD
MOV DPTR,#CHAR2 ;
ACALL WR_STRING
MOV R5,#20
MAIN1:
ACALL DELAY ;延時
ACALL DELAY
DJNZ R5,MAIN1
CLR STRING
MOV A,#01H ;清除屏幕
ACALL LCD_CMD
MOV A,#80H ;顯示在第一行
MOV DPTR,#CHAR3 ;顯示字符串3
ACALL WR_STRING
MOV A,#0C0H ;顯示在第二行
ACALL LCD_CMD
MOV DPTR,#CHAR4 ;顯示字符串4
ACALL WR_STRING
MOV TMOD,#20H ;將T1設(shè)置為8位自動重裝工作方式。
MOV TH1,#175 ;對T1定時常數(shù)進行預(yù)置。
MOV TL1,#175
SETB TR1 ;啟動T1。
MAIN2:
CALL KEY_SCAN
CJNE A,#0FH,MAIN2 ;F 隨機出題鍵
CALL RUBRIC ;出題
CALL DISP ;顯示題目
MAIN3:
CALL KEY_DATA ;鍵入答案值
CALL DATA_COMP ;數(shù)據(jù)比較
JB TRUER,MAIN2 ;比較正確后,重新出題
CALL ASK_DISP
JNB TRUER,MAIN3 ;比較不正確,重新答題
JMP MAIN1
;***************************************************************
; 鍵入數(shù)據(jù)子程序
;***************************************************************
KEY_DATA:
MOV A,TEMP+1
CJNE A,#30H,K_DATA1 ;乘積高位為0,則跳過輸入高位值
JMP K_DATA2
K_DATA1:
CALL KEY_SCAN
JNB KEYDOWN,K_DATA1 ;無鍵按下返回
CJNE A,#0CH,K_DATA1A ;C 鍵,輸入正確答案
CALL PRODUCT_DISP ;顯示正確答案
JMP KEY_END
K_DATA1A:
CLR C
SUBB A,#0AH ;判是否為有效的數(shù)字鍵
JNC K_DATA1 ;為無效鍵返回
MOV A,R3
ADD A,#30H
MOV HDATA,A ;鍵入答案高位
MOV A,#0CBH ;顯示鍵入答案高位
ACALL LCD_CMD
MOV A,HDATA
ACALL LCD_WDATA
MOV A,#20H
ACALL LCD_WDATA
K_DATA2:
CALL KEY_SCAN
JNB KEYDOWN,K_DATA2 ;無鍵按下返回
CJNE A,#0CH,K_DATA2A ;C 鍵,輸入正確答案
CALL PRODUCT_DISP ;顯示正確答案
JMP KEY_END
K_DATA2A:
CLR C
SUBB A,#0AH ;判是否為有效的數(shù)字鍵
K_DATA3:
JNC K_DATA2 ;為無效鍵返回
MOV A,R3
ADD A,#30H
MOV LDATA,A ;鍵入答案低位
MOV A,#0CCH ;顯示鍵入答案低位
ACALL LCD_CMD
MOV A,LDATA
ACALL LCD_WDATA
KEY_END:
RET
;***************************************************************
; 數(shù)據(jù)比較子程序
;***************************************************************
DATA_COMP:
MOV A,TEMP+1 ;判乘積的高位是否為0
CJNE A,#30H,COMP1
JMP COMP2 ;高位為0,跳過高位比較
COMP1:
MOV B,HDATA
CJNE A,B,COMP3 ;比較高位
COMP2:
MOV A,TEMP+0
MOV B,LDATA
CJNE A,B,COMP3 ;比較低位
SETB TRUER
CALL BEEP_BL ;比較正確,蜂鳴器響3聲
CALL BEEP_BL
CALL BEEP_BL
JMP COMP_END
COMP3:
CLR TRUER ;比較錯誤
COMP_END:
RET
;***************************************************************
;寫指令數(shù)據(jù)到LCD
;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
;***************************************************************
LCD_CMD:
ACALL CHECKBUSY
LCD_CMD_NC:
CLR LCD_RS
CLR LCD_RW
MOV P0,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;***************************************************************
;寫顯示數(shù)據(jù)到LCD
;RS=H,RW=L,D0-D7=數(shù)據(jù),E=高脈沖
;***************************************************************
LCD_WDATA:
ACALL CHECKBUSY
SETB LCD_RS
CLR LCD_RW
MOV P0,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;***************************************************************
;檢測LCD控制器忙狀態(tài)
;讀數(shù)據(jù)
;RS=L,RW=H,E=H,輸出:D0-D7=數(shù)據(jù)
;***************************************************************
CHECKBUSY:
PUSH ACC
MOV P0,#0FFH
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
BUSYLOOP:
NOP
JB P0.7,BUSYLOOP
CLR LCD_EN
POP ACC
RET
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -