📄 main.asm
字号:
;未被删除显示本道 ;
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 + -