📄 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 + -