⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcu.asm

📁 proteus实例集锦
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;作者:宋培林
;;;;;;;;;;版本: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 + -