?? mcu.asm
字號:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;作者:宋培林
;;;;;;;;;;版本:1.0
;;;;;;;;;;日期:2007-3-1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;假定12MHz晶體振蕩;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;內部RAM 30h~5Fh空間被作者占用,您不可以使用此空間保存數據。;;;;;;;;;;;;;;;;;;;;;;;;;;;
;///////////////常量定義////////////////////////////////////////////////////////////////////////
LCD_CMD_WR equ 0 ;寫命令。
LCD_DATA_WR equ 1 ;寫數據。
LCD_BUSY_RD equ 2 ;讀忙碌標志。
LCD_DATA_RD equ 3 ;讀數據。
LCD_CLS equ 1 ;清屏。
LCD_HOME equ 2 ;光標歸位。
LCD_SETMODE equ 4 ;設置模式。
LCD_SETVISIBLE equ 8 ;設置屏幕和光標是否顯示。
LCD_SHIFT equ 16 ;設置移位方式。
LCD_SETFUNCTION equ 32 ;功能設定。
LCD_SETCGADDR equ 64 ;設置CGRAM地址。
LCD_SETDDADDR equ 128 ;設置DDRAM地址。
;具體內容請參考LCD數據手冊。
;;;;;;;;;;以下定義的是保存數據的地址,您可以重新改寫。;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYCODE equ 30h ;按鍵鍵碼暫存內存。
MENUINDEX equ 31h ;當前主菜單序號。
ADCOUTCUR equ 32h ;當前ADC轉換的輸出數值。
ADCOUTBAK equ 33h ;前一次ADC轉換的輸出數值。
AUTOCOUNTER equ 34h ;自動計數當前數值。
SINEINDEX equ 35h ;當前正弦波采樣索引序號。
FREQHIGH equ 36h ;前一次測量頻率高字節備份。
FREQLOW equ 37h ;前一次測量頻率低字節備份。
MILSTART equ 38h ;毫秒表啟動標志。
DS18B20HIGH equ 39h ;DS18B20溫度高字節。
DS18B20LOW equ 3Ah ;DS18B20溫度低字節。
COMINDEX equ 3Bh ;串口發送索引值。
STATUS equ 3Ch ;外部電設備狀態字。
RESERVED0 equ 3Dh ;保留。
MODEFLAG equ 3Eh ;模式標志。
RETURNFLAG equ 3Fh ;返回主程序標志。
DIVD4ADDRESS0 equ 40h ;4字節無符號除法子程序余數最高字節。
DIVD4ADDRESS1 equ 41h ;4字節無符號除法子程序余數次高字節。
DIVD4ADDRESS2 equ 42h ;4字節無符號除法子程序余數次低字節。
DIVD4ADDRESS3 equ 43h ;4字節無符號除法子程序余數最低字節。
DIVD4ADDRESS4 equ 44h ;4字節無符號除法子程序被除數最高字節。
DIVD4ADDRESS5 equ 45h ;4字節無符號除法子程序被除數次高字節。
DIVD4ADDRESS6 equ 46h ;4字節無符號除法子程序被除數次低字節。
DIVD4ADDRESS7 equ 47h ;4字節無符號除法子程序被除數最低字節。
DIVD4ADDRESS8 equ 48h ;4字節無符號除法子程序除數最高字節。
DIVD4ADDRESS9 equ 49h ;4字節無符號除法子程序除數次高字節。
DIVD4ADDRESSA equ 4Ah ;4字節無符號除法子程序除數次低字節。
DIVD4ADDRESSB equ 4Bh ;4字節無符號除法子程序除數最低字節。
DIVD4ADDRESSC equ 4Ch ;沒有使用,保留。
DIVD4ADDRESSD equ 4Dh ;沒有使用,保留。
DIVD4ADDRESSE equ 4Eh ;沒有使用,保留。
DIVD4ADDRESSF equ 4Fh ;沒有使用,保留。
RESULT1 equ 50h ;待顯示的結果第1位。最多十五位,
;至少保留最后一位空終止符號。
RESULT2 equ 51h ;待顯示的結果第2位。
RESULT3 equ 52h ;待顯示的結果第3位。
RESULT4 equ 53h ;待顯示的結果第4位。
RESULT5 equ 54h ;待顯示的結果第5位。
RESULT6 equ 55h ;待顯示的結果第6位。
RESULT7 equ 56h ;待顯示的結果第7位。
RESULT8 equ 57h ;待顯示的結果第8位。
RESULT9 equ 58h ;待顯示的結果第9位。
RESULTA equ 59h ;待顯示的結果第10位。
RESULTB equ 5Ah ;待顯示的結果第11位。
RESULTC equ 5Bh ;待顯示的結果第12位。
RESULTD equ 5Ch ;待顯示的結果第13位。
RESULTE equ 5Dh ;待顯示的結果第14位。
RESULTF equ 5Eh ;待顯示的結果第15位。
RESULTNULL equ 5Fh ;空終止符號。
;;;;;;;;;;以下定義的是數據,不要改動。;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIP equ 0C0h ;供自建元器件使用。
FREQ744Hz equ 01h ;744Hz
FREQ679Hz equ 02h ;679Hz
FREQ625Hz equ 03h ;625Hz
FREQ579Hz equ 04h ;579Hz
FREQ539Hz equ 05h ;539Hz
FREQ401Hz equ 0Ah ;401Hz
FREQ265Hz equ 14h ;265Hz
FREQ158Hz equ 28h ;158Hz
FREQ087Hz equ 50h ;087Hz
FREQ46Hz equ 0A0h ;046Hz
FREQ30Hz equ 0FFh ;030Hz
;///////////////定義完畢////////////////////////////////////////////////////////////////////////
;;;;;;;;;;;;;;;;主程序開始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0000h ;單片機復位地址。
;***************重要提示************************************************************************
;***********************************************************************************************
;***************由于Proteus的固有缺陷,使用本程序仿真正弦波時極不流暢,為此您可以將下
;***************面這條語句打開(跳過所有功能),重新編譯,仿真時只顯示正弦波,這樣比
;***************較流暢。
;jmp FUNCTION10
;***********************************************************************************************
;***************提示完畢************************************************************************
jmp _tmain ;轉移至主程序處。
org 0003h ;外部中斷0的中斷響應地址。
EXT_INT0: jmp INT0ADDRESS ;
org 0013h ;外部中斷1的中斷響應地址。
EXT_INT1: jmp INT1ADDRESS ;
org 0023h ;串行中斷的中斷響應地址。
COMM_INT: jmp INTCOMM ;
org 0100h ;_tmain被定位在0x0100處。
_tmain: mov sp,#80h ;初始化堆棧指針。
mov dptr,#8000h ;
mov a,#0FFh ;告訴自建元器件當前進入復位狀態。
movx @dptr,a ;
call INITIALIZATION ;調用初始化子程序。
mov a,#38h ;8位數據長度,雙行,5x7字符。
call WRCMD ;調用寫命令子程序。
mov a,#LCD_SETVISIBLE+7 ;開啟顯示屏,開啟光標,光標所在
;字符閃爍。
call WRCMD ;調用寫命令子程序。
mov a,#LCD_CLS ;
call WRCMD ;清屏。
mov dptr,#ModeSelect_1 ;
call WRSTR ;初始化LCD屏幕,顯示第一行。
mov a,#LCD_SETDDADDR+64 ;換行。
call WRCMD ;
mov dptr,#ModeSelect_2 ;
call WRSTR ;初始化LCD屏幕,顯示第二行。
mov a,#0Fh ;
call POSTMESSAGE ;不必關心此條調用。
call READKEYPAD ;調用讀鍵盤子程序。
cjne a,#01h,Slave ;如果按下按鍵1,轉移至主動模式處執行,
;否則轉移至從動模式主程序處執行。
mov dptr,#8000h ;===
mov a,#0FEh ;===告訴自建元器件當前進入主動模式。
movx @dptr,a ;===
jmp main ;轉移至主動模式主程序處。
main: jmp START ;跳過字符串定義,轉移至START處執行。
Slave: jmp SlaveMode ;轉移至從動模式主程序處。
;///////////////字符串定義//////////////////////////////////////////////////////////////////////
TIPONOFF_1: db 'TIP ON(1)' ;需要提示。
db 0
TIOONOFF_2: db 'TIP OFF(Others)' ;不需要提示。
db 0
ModeSelect_1: db 'Master(1)' ;模式選擇。
db 0
ModeSelect_2: db 'Slave(Others)' ;
db 0
string_tip_1: db 'Do not press' ;提示字符串。
db 0
string_tip_2: db 'any key!' ;
db 0
string0_1: db 'Welcome!UP and' ;string代表顯示在LCD上的字符串,
;以0_1代表第零組字符串的第一行。
;最后以0空終止。注意每行最多16
;個字符(不算空終止符)。
db 0
string0_2: db 'DOWN Key'
db 0
string1_1: db '1.Measure Vol' ;測量電壓,0---5V。
db 0 ;不論打算完成什么功能,必須事先
;手動設置好硬件的跳線。
string1_2: db '0---5V'
db 0
string2_1: db '2.Measure Res' ;測量電阻,0---1KΩ。
db 0
string2_2: db '0---1K'
db 0
string3_1: db '3.Measure Temp' ;測量溫度,-40℃---+120℃。
db 0
string3_2: db '-40---+120'
db 0
string4_1: db '4.Auto Counter' ;數碼管自動循環計數。
db 0
string4_2: db '00-->99-->00'
db 0
string5_1: db '5.Led Array' ;Led閃爍顯示。
db 0
string5_2: db 'Display'
db 0
string6_1: db '6.Virtual Serial' ;虛擬串口通信。
db 0
string6_2: db 'Communication'
db 0
string7_1: db '7.Millisecond' ;毫秒表。
db 0
string7_2: db 'Meter'
db 0
string8_1: db '8.Drive Moto' ;驅動馬達。
db 0
string8_2: db 'Demo Only' ;僅僅是簡單地演示。
db 0
string9_1: db '9.Measure Freq' ;測量頻率。
db 0
string9_2: db 'Under 5KHz' ;5KHz以下。
db 0
string10_1: db '10.Output Sine' ;輸出正弦波。
db 0
string10_2: db 'Wave'
db 0
string11_1: db '11.1KHz Pulse' ;1KHz測試脈沖。
db 0
string11_2: db 'to Speaker'
db 0
string12_1: db '12.User Defined' ;用戶自定義功能。
db 0
string12_2: db 'Function'
db 0
string13_1: db 'The End!' ;結束。
db 0
string13_2: db 'Bye Bye!'
db 0
mistake_1: db 'Mistake!' ;錯誤指示。
db 0
mistake_2: db 'Reset!'
db 0
DEMO_1: db 'Wait Please' ;沒有什么意義,純粹調試程序使用。
db 0
DEMO_2: db '...'
db 0
WELCOME_1: db 'HELLO!' ;顯示歡迎提示。
db 0
WELCOME_2: db 'EVERYBODY!' ;
db 0
QUIT_1: db 'QUIT?' ;退出提示。
db 0
QUIT_2: db 'YES(1)NO(Others)' ;
db 0
SERIAL: db 20h,21h,22h,23h ;虛擬串口通信所要發送的字符,都是可
;以顯示的字符。請保證您正確地安裝了
;虛擬串口軟件并且設置好串口,再運行
;虛擬串口通信實驗。Proteus使用虛擬
;串口3,另外一側使用虛擬串口4。固定
;2400波特/s,8位數據,1位起始位,1
;位停止位,無奇偶校驗位。
db 24h,25h,26h,27h ;
db 28h,29h,2Ah,2Bh ;
db 2Ch,2Dh,2Eh,2Fh ;
db 10 ;換行。
db 30h,31h,32h,33h ;
db 34h,35h,36h,37h ;
db 38h,39h,3Ah,3Bh ;
db 3Ch,3Dh,3Eh,3Fh ;
db 10 ;換行。
db 40h,41h,42h,43h ;
db 44h,45h,46h,47h ;
db 48h,49h,4Ah,4Bh ;
db 4Ch,4Dh,4Eh,4Fh ;
db 10 ;換行。
db 50h,51h,52h,53h ;
db 54h,55h,56h,57h ;
db 58h,59h,5Ah,5Bh ;
db 5Ch,5Dh,5Eh,5Fh ;
db 10 ;換行。
db 60h,61h,62h,63h ;
db 64h,65h,66h,67h ;
db 68h,69h,6Ah,6Bh ;
db 6Ch,6Dh,6Eh,6Fh ;
db 10 ;換行。
db 70h,71h,72h,73h ;
db 74h,75h,76h,77h ;
db 78h,79h,7Ah,7Bh ;
db 7Ch,7Dh,7Eh,7Fh ;
db 10 ;換行。
db 0 ;結束。
LCD0: db '0' ;0的ASCII碼。
LCD1: db '1' ;1的ASCII碼。
LCD2: db '2' ;2的ASCII碼。
LCD3: db '3' ;3的ASCII碼。
LCD4: db '4' ;4的ASCII碼。
LCD5: db '5' ;5的ASCII碼。
LCD6: db '6' ;6的ASCII碼。
LCD7: db '7' ;7的ASCII碼。
LCD8: db '8' ;8的ASCII碼。
LCD9: db '9' ;9的ASCII碼。
LCDK: db 'K' ;K的ASCII碼。
LCDR: db 'R' ;R的ASCII碼。R代表歐姆符號Ω。
LCDV: db 'V' ;V的ASCII碼。
LCDPOINT: db '.' ;.的ASCII碼。
LCDH: db 'H' ;H的ASCII碼。
LCDz: db 'z' ;z的ASCII碼。
LCDm: db 'm' ;m的ASCII碼。
LCDS: db 'S' ;S的ASCII碼。
LCDT: db 'T' ;T的ASCII碼。T代表溫度符號℃。
LCDMINUS: db '-' ;-的ASCII碼。
LCDPLUS: db '+' ;+的ASCII碼。
;///////////////定義完畢////////////////////////////////////////////////////////////////////////
START: call INITIALIZATION ;調用初始化子程序。
call LCDINIT ;初始化LCD子程序。
CONTINUE: mov a,MENUINDEX ;
call POSTMESSAGE ;不必關心此條調用。
call READKEYPAD ;調用讀鍵盤子程序。
call MENUJUDGE ;調用按鍵判斷子程序。
call MENUDISPLAY ;調用菜單刷新子程序。
mov a,KEYCODE ;取得鍵值代碼,如果
;是ENTER鍵,則執行相
;應功能,否則繼續循環。
cjne a,#0Ch,CONTINUE ;判斷是否是ENTER鍵。
jmp FUNCTIONSELECT ;轉移至功能選擇子程序處。
;;;;;;;;;;;;;;;;初始化子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用a(資源占用只統計本子程序的使用情況,不包括再調用的子程序。)
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INITIALIZATION: mov a,#00h
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -