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

📄 main.asm

📁 一个用PIC做的无线点菜系统的系统
💻 ASM
📖 第 1 页 / 共 3 页
字号:
								;未被删除显示本道				;
	MovLW	5													;
	MovWF	MenuNameAddrH										;
	ClrF	MenuNameAddr		;从0500H开始					;
LoadStartEEWORD:												;
	Call	LoadEEPROMWORD		;读出菜号						;
	MovFW	EEPROMBuffer										;
	XORLW	endCode												;
	BTFSC	STATUS,Z			;未结束跳转						;
	Goto	NewCarte			;未找到本菜,显示下一道			;
	MovFW	EEPROMBuffer										;
	XORWF	FOODID,W			;菜号低位是否相等				;
	BTFSS	STATUS,Z			;相等跳转						;
	Goto	NextWordAddress		;下一个							;
	XORWF	EEPROMBuffer + 1,W									;
	XORWF	FOODIDH,W			;判断高位						;
	BTFSC	STATUS,Z											;
	Goto	FindMenuOK			;找到显示						;
NextWordAddress:				;未找到,继续寻找				;
	MovLW	010H												;
	AddLW	MenuNameAddr		;计算下一个地址					;
	BTFSC	STATUS,C											;
	INCF	MenuNameAddrH										;
	BTFSC	MenuNameAddrH,7										;
	Goto	NewCarte			;未找到本菜,显示下一道			;
																;
FindMenuOK:														;
	INCF	MenuNameAddr										;
	INCF	MenuNameAddr		;计算菜名地址					;
	Call	LoadCarteName		;得到菜名,并存入显示缓存		;
	ClrF	SHOW_WORD_X											;
	Call	SHOW_WORD			;显示菜名						;
	MovLW	FOODSUM												;
	Call 	LoadSum												;
	MovLW	4													;
	MovWF	SHOW_WORD_X											;
	Call	SHOW_WORD			;显示菜量						;
	Goto	NextLoad			;显示下一道						;
																;
NextLoad:														;
	BTFSC	SHOW_WORD_Y,2					;显示三次			;
	RetLW	0					;完成							;
	INCF	SHOW_WORD_Y,F										;
NewCarte:						;显示下一道						;
	MovLW 	4													;
	AddWF	CarteAddr											;
	BTFSC	STATUS,C											;
	INCF	CarteAddrH,W										;
	MovWF	CarteAddrH											;
	XORLW	4													;
	BTFSS	STATUS,Z											;
	Goto 	LoadCarte											;
	MovF	CarteAddr,F											;
	BTFSC	STATUS,Z											;
	Goto	LoadCarte											;
	RetLW	0FFH				;全部显示完毕					;
;***************************************************************;


;********************20mS内无信号变化***************************;
Look20:															;
																;
	ClrF	TEMP			;接受端原始值						;
	BTFSC	ComPort,DIn											;
	BSF		TEMP,DIn											;
																;
	MovLW	0AH				;循环10次							;
	MovWF	Y													;
	ClrF	X				;循环256次							;
																;
AnLook:															;
																;
	MovFW	ComPort												;
	AndLW	B'00000001'											;
	XORWF	TEMP,W												;
	BTFSS	STATUS,Z											;
	Goto	Look20												;
	DECFSZ	X													;
	Goto	AnLook												;
	DECFSZ	Y													;
	Goto	AnLook												;
	RetLW  1													;
;***************************************************************;

;***********************从计算机读取数据************************;
;发送请求数据指令,并校验,校验结果放于SendVerify中				;
;下一次请求数据时发出校验										;
GetNow:															;
	MovFW	SendCommand		;发送指令							;
	MovWF	XmtReg												;
	Call	Xmtr												;
																;
	MovFW	meNo			;发送遥控器号						;
	MovWF	XmtReg												;
	Call	Xmtr												;
																;
	MovFW	SendVerify		;发送校验字节						;
	MovWF	XmtReg												;
	Call	Xmtr												;
																;
	MovLW	SendBuffer		;设置间址寻址首地址					;
	MovWF	FSR													;
																;
	ClrF	SendVerify		;清除校验字节						;
																;
Get1:															;
	Call	Rcvr			;接收一字节							;
	MovFW	RcvReg												;
	MovWF	INDF												;
	XORWF	SendVerify,F	;异或校验							;
	AddLW	1				;判断是否结束						;
	BTFSC	STATUS,Z											;
	Return														;
	INCF	FSR													;
	DECFSZ	SendLen												;
	Goto	Get1												;
	Return														;
;***************************************************************;


;***********************发送数据至计算机************************;
;发送数据指令													;
;下一次请求数据时发出校验										;
PutNow:															;
	MovFW	SendCommand		;发送指令							;
	MovWF	XmtReg												;
	Call	Xmtr												;
																;
	MovFW	meNo			;发送遥控器号						;
	MovWF	XmtReg												;
	Call	Xmtr												;
																;
	MovLW	SendBuffer		;设置间址寻址首地址					;
	MovWF	FSR													;
																;
	ClrF	SendVerify		;清除校验字节						;
																;
Put1:															;
	MovWF	INDF												;
	MovWF	XmtReg												;
	XORWF	SendVerify,F	;异或校验							;
																;
	Call	Xmtr			;发送一字节							;
																;
	INCF	FSR													;
	DECFSZ	EEPROM_Len											;
	Goto	Put1												;
;校验忽略														;
	Return														;
;***************************************************************;


;******************从计算机下载菜单*****************************;
DownLoadMenus:													;
	Call	InitMenuNameAddr	;初始化菜单						;
	Call	Look20				;延时20mS判断是否可以进行通讯	;
	MovLW	05H													;
	MovWF	SendCommand											;
	ClrF	SendVerify			;清除校验						;
																;
DownLoad1:														;
	MovLW	0CH													;
	MovWF	SendLen				;接收12Byte						;
	Call	GetNow				;请求更新,并得到第一个数据包	;
																;
	MovLW	04H													;
	MovWF	SendCommand											;
																;
	AddLW	1													;
	BTFSC	STATUS,C											;
	Goto	GetErr				;返回0FFH错误					;
																;
	MovLW	0CH													;
	MovWF	EEPROM_Len			;得到12Byte数据					;
	MovFW	MenuNameAddr										;
	MovWF	EEPROM_AddressL										;
	MovFW	MenuNameAddrH										;
	MovWF	EEPROM_AddressH		;保存至EEPROM					;
	MovLW	SendBuffer											;
	Call	EEPROMSave											;
																;
	MovFW	SendBuffer											;
	XORLW	0FFH												;
	BTFSC	STATUS,Z			;得到0FFH结束					;
	Goto	GetEnd				;								;
																;
	MovLW	010H												;
	AddWF	MenuNameAddr										;
	BTFSC	STATUS,C											;
	INCF	MenuNameAddrH		;下一EEPROM地址					;
																;
	Goto	DownLoad1			;读取下一个						;
																;
GetErr:															;
GetEnd:															;
	Call	GOTO_MENU_NO1		;跳转至窗体1					;
	Return														;
;***************************************************************;


;***************转换2Byte数据为显示,放入显示缓存***************;
;在当前位置显示指定的两个字节BCD数字							;
;SHOW_WORD_Y  标识显示行										;
;w 保存当前需要显示的字节首地址									;
;结果放于ShowBuffer												;
LoadSum:														;
																;
	MovWF	FSR													;
																;
	SwapF	INDF					;首字节高位					;
	Call	SwitchInput				;转换						;
	MovWF	SHOW_WORD_ADDRESS									;
	MovFW	INDF					;首字节低位					;
	Call	SwitchInput											;
	MovWF	SHOW_WORD_ADDRESS + 1								;
																;
	INCF	FSR,F												;
																;
	SwapF	INDF					;次字节高位					;
	Call	SwitchInput				;转换						;
	MovWF	SHOW_WORD_ADDRESS + 2								;
	MovFW	INDF					;次字节低位					;
	Call	SwitchInput											;
	MovWF	SHOW_WORD_ADDRESS + 3								;
	ClrF	SHOW_WORD_ADDRESS + 4								;
	Return														;
;***************************************************************;


;*******************初始化点菜菜单******************************;
;初始化点菜菜单首地址											;
InitCarteAddr:													;
																;
	MovLW	04H													;
	MovWF	CarteAddr											;
	ClrF	CarteAddrH											;
	Return														;
;***************************************************************;


;**************************初始化菜单***************************;
;初始化菜单首地址												;
InitMenuNameAddr:												;
																;
	MovLW	05H													;
	MovWF	MenuNameAddrH										;
	ClrF	MenuNameAddr										;
	Return														;
;***************************************************************;

;*************************块传送********************************;
;将源数据块复制至目标数据块,所有参数按址寻址					;
;源数据块地址:Source											;
;复制数据长度:Lens												;
;目标地址    :Object											;
;FSR保护	 :FSRAegis											;
;临时变量	 :Temp												;
Source		EQU													;
Lens		EQU													;
Object		EQU													;
FSRAegis	EQU													;
Temp		EQU													;
																;
Macro	BankCopy	SourceFrist,SourceLen,ObjectFrist			;
	MovLW	SourceFrist											;
	MovWF	Source												;
	MovLW	SourceLen											;
	MovWF	Lens												;
	MovLW	ObjectFrist											;
	MovWF	Object												;
	Call	MovBank												;
Endm															;
MovBank:														;
	MovFW	FSR													;
	MovWF	FSRAegis			;保护FSR						;
																;
Move1:															;
	MovFW	Source												;
	MovWF	FSR													;
	MovFW	INDF												;
	MovWF	Temp				;读出							;
	MovFW	Object												;
	MovWF	FSR													;
	MovFW	Temp												;
	MovWF	INDF				;写入							;
																;
	INCF	Source,F											;
	INCF	Object,F											;
	DECFSZ	Lens,W												;
	Goto	Move1				;下一个							;
								;完成块传送						;
	MovFW	FSRAegis											;
	MovWF	FSR					;恢复FSR						;
	Return														;
;***************************************************************;



;*********************将w中的数字保存于InputBuffer中************;    1
Save_Word1:														;
;Show_word_x标识了在InputBuffer中的位置							;
;4->0															;
;5->1															;
;6->2															;
;7->3															;
;不改变W值														;
	MovWF	keyTemp												;
	MovFW	SHOW_WORD_X		;计算显示偏移量						;
	AndLW	B'00000011'											;
	AddLW	InputBuffer0	;得到保存位置						;
	MovWF	FSR													;
	MovFW	keyTemp												;
	MovWF	INDF			;保存当前输入值						;
	Return														;
;***************************************************************;

;**********************显示单个数字*****************************;
SHOW_WORD1:														;
;显示当前数字,低位放置于W,高位默认为0A3H						;
	MovWF	SHOW_WORD_ADDRESS									;
	MovLW	0A3H												;
	MovWF	SHOW_WORD_ADDRESS + 1								;
	ClrF	SHOW_WORD_ADDRESS + 2								;
	Call	SHOW_WORD		;显示当前输入值						;
	Return														;
;***************************************************************;

	
;*************************转换为显示的GB码**********************;    1
SwitchInput:													;
;需要转换的数字存放于W寄存器									;
;转换的结果低位从W寄存器返回,高位始终为0A3H					;
	AndLW	B'00001111'											;
	XORLW	0DH				;判断是否是小数点					;
	SKPNZ														;
	MovLW	0FEH			;是小数点,加修正量					;
	AddLW	0B0H			;转换为GB码							;
	Return														;
;***************************************************************;


;************************保存当前行数据*************************;
SaveInputLine:													;
;SHOW_WORD_Y 标识了要保存的行窗									;
;在窗体2和窗体3中需要保存输入的数据								;
;代码优化,使用间址寻址,										;
;根据不同的窗体指定不同的首地址									;
;对于窗体2,直接保存到目标变量中;								;
;对于窗体3,保存与输入缓存中,在进行页面保存时,存入E2PROM		;
	RLF		SHOW_WORD_Y,W			;得到行偏移量				;
									;每行数据占用2字节			;
																;
	AddWF	0FEH+TableID,W			;行偏移量-2,窗体2存储偏移	;
	BTFSC	SHOW_MENU_No,0										;
	AddWF	0FEH-TableID+FoodID,W	;行偏移量-4,窗体3存储偏移	;
	MovWF	FSR						;行存储目标首地址			;
	SwapF	InputBuffer1,W			;得到第二个字符并放于高位	;
	AddWF	InputBuffer0,W			;生成第一个半字节BCD码		;
	MovWF	INDF												;
	INCF	FSR,F												;
	SwapF	InputBuffer3,W			;得到第四个字符并放于高位	;
	AddWF	InputBuffer2,W			;生成第三个半字节BCD码		;
	MovWF	INDF												;
	Call	ClrInputBuff			;清除输入缓存				;
	Return														;
;***************************************************************;	


;************************清除输入缓存***************************;      1
ClrInputBuff:													;
	ClrF	InputBuffer0										;
	ClrF	InputBuffer1										;
	ClrF	InputBuffer2										;
	ClrF	InputBuffer3										;
	Return														;
;***************************************************************;

;*************************清除一个输入行显示********************;       3
;SHOW_WORD_Y 标识要清除的行										;
ClrShowLine:													;
	MovLW	4													;
	MovWF	SHOW_WORD_X											;
	MovLW	0FFH												;
	MovWF	SHOW_WORD_ADDRESS									;
	MovWF	SHOW_WORD_ADDRESS + 2								;
	MovWF	SHOW_WORD_ADDRESS + 4								;
	MovWF	SHOW_WORD_ADDRESS + 6								;
	MovLW	0A1H												;
	MovWF	SHOW_WORD_ADDRESS + 1								;
	MovWF	SHOW_WORD_ADDRESS + 3								;
	MovWF	SHOW_WORD_ADDRESS + 5								;
	MovWF	SHOW_WORD_ADDRESS + 7								;
	ClrF	SHOW_WORD_ADDRESS + 8								;
	Call	SHOW_WORD											;
	MovLW	4							;复位光标				;
	MovWF	SHOW_WORD_X											;
	Return														;
;***************************************************************;


;*****************点菜数据保存至EEProm**************************;
SaveInputPage:				;菜单保存至E2PROM					;
;EEProm_AddressL												;
;EEProm_AddressH		EEProm保存首地址 0000H~7FFFH (32k) 		;
;EEProm_Len				EEProm保存数据长度 01H~40H 				;
;						(目前使用范围01H~10H)					;
;W						需要保存数据的起始地址	必须连续		;
	MovFW	CarteAddr				;保存点菜菜单				;
	MovWF	EEProm_AddressL										;
	MovFW	CarteAddr + 1										;
	MovWF	EEProm_AddressH										;
	MovLW	5						;长度为5Byte包括尾指针		;
	MovWF	EEProm_Len											;
	MovLW	endCode												;
	MovWF	FOODEND					;标志尾指针					;
	MovLW	FOODID					;保存菜号,菜量				;
	Call	EEPROMSAVE				;保存菜单到EEPROM			;
	Return														;
;***************************************************************;

;*****************得到新的点菜菜单保存地址指针******************;
NewP:															;
	MovFW	CarteAddr				;保存尾指针					;
	MovWF	CarteAddrEnd			;尾指针标志了最后一个菜		;
	MovFW	CarteAddrH											;
	MovWF	CarteAddrEndH										;
	MovLW	4													;
	AddWF	CarteAddr,F				;CartrAddr指针下移4Byts		;
	BTFSC	STATUS,C											;
	INCF	CarteAddrH,F										;
																;
	Return														;
;***************************************************************;

;*****************从EEProm读出点菜数据**************************;
LoadCarteData:													;
;EEProm_AddressL												;
;EEProm_AddressH		EEProm地址 0000H~7FFFH (32k) 			;
;EEProm_Len				EEProm读出的数据长度 01H~40H 			;
;						(目前使用范围01H~10H)					;
;W						保存数据的起始地址	必须连续			;
	MovFW	CarteAddr				;保存点菜菜单				;
	MovWF	EEProm_AddressL										;
	MovFW	CarteAddr + 1										;
	MovWF	EEProm_AddressH										;
	MovLW	4						;长度为4Byte				;
	MovWF	EEProm_Len											;
	MovLW	FOODID					;保存地址					;
	Call	EEPROMLoad				;EEPROM读出					;
	Return														;
;***************************************************************;

;*****************从EEProm读出1WORD菜号*************************;
LoadEEPROMWORD:													;
;EEProm_AddressL												;
;EEProm_AddressH		EEProm地址 0000H~7FFFH (32k) 			;
;EEProm_Len				EEProm读出的数据长度 01H~40H 			;
;						(目前使用范围01H~10H)					;
;W						保存数据的起始地址	必须连续			;
;EEPROMBuffer			EEPROM缓存								;
	MovFW	MenuNameAddr			;从全部菜单中读取			;
	MovWF	EEProm_AddressL										;
	MovFW	MenuNameAddrH										;
	MovWF	EEProm_AddressH										;
	MovLW	2						;长度为1Byte				;
	MovWF	EEProm_Len											;
	MovLW	EEPROMBuffer			;保存地址					;
	Call	EEPROMLoad				;EEPROM读出					;
	Return														;
;***************************************************************;


;*****************从EEProm读出菜名,并存入显示缓存**************;
LoadCarteName:													;
;EEProm_AddressL												;
;EEProm_AddressH		EEProm地址 0000H~7FFFH (32k) 			;
;EEProm_Len				EEProm读出的数据长度 01H~40H 			;
;						(目前使用范围01H~10H)					;
;W						保存数据的起始地址	必须连续			;
;EEPROMBuffer			EEPROM缓存								;
	MovFW	MenuNameAddr			;从全部菜单中读取			;
	MovWF	EEProm_AddressL										;
	MovFW	MenuNameAddrH										;
	MovWF	EEProm_AddressH										;
	MovLW	8						;长度为8Byte				;
	MovWF	EEProm_Len											;
	MovLW	SHOW_WORD_ADDRESS		;保存地址					;
	ClrF 	SHOW_WORD_ADDRESS + 8								;
	Call	EEPROMLoad				;EEPROM读出					;
	Return														;
;***************************************************************;


	END	
;************************************************
;************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -