📄 main.asm
字号:
RetLW 0FFH ;超出,返回 ;
;
runkeyDOwn: ;
INCF I,F ;
BTFSS I,2 ;判断I ?= 4 ;
Goto ViewCurSer ;显示光标 ;
;超出屏幕下限 ;
DECF I,F ;I=3 ;
MovLW 4 ;
AddWF CarteAddr,F ;当前第一条显示的菜单地址 ;
BTFSC STATUS,C ;判断进位 ;
INCF CarteAddrH,F ;进位,高位地址加一 ;
MovFW CarteAddrH ;
XORLW 5 ;
BTFSS STATUS,Z ;判断是否超出4FCH ;
Goto ViewN ;高位不为0,未超出 ;
RetLW 0FFH ;超出,返回 ;
;
ViewN: ;
Call Menu4View ;显示 ;
MovFW I ;
MovWF SHOW_WORD_Y ;
ClrF SHOW_WORD_X ;
ViewCurser: ;
Call SHOW_CURSOR ;
Return ;
;***************************************************************;
;*********************发送成功**********************************;
Run_Menu_NO5: ;
Call InitCarteAddr ;
MovLW 4 ;
MovWF CarteAddrEnd ;
ClrF CarteAddrEndH ;清除所有点菜数据 ;
;
Call GOTO_MENU_NO3 ;任意键跳转至点菜窗体 ;
Return ;
;***************************************************************;
;*********************发送失败**********************************;
Run_Menu_NO6: ;
MovFW CarteAddrEnd ;
MovWF CarteAddr ;
MovFW CarteAddrEndH ;
MovWF CarteAddrH ;继续点菜 ;
;
Call GOTO_MENU_NO3 ;任意键跳转至点菜窗体 ;
Return ;
;***************************************************************;
;切换当前菜单
Goto_Menu_No1:
MovLW 1H
Goto Menu_No_Make
Goto_Menu_No2:
MovLW 2H ;设置为窗体2
MovWF Show_Menu_No
Call SHOW_MENU
MovLW 4
MovWF SHOW_WORD_X
MovLW 1
MovWF SHOW_WORD_Y
Call SHOW_CURSOR ;显示光标并结束
Call InitTabelSet ;初始化系统菜单
Return
;*******************显示点菜窗体*************************;
Goto_Menu_No3:
MovLW 3H ;标识窗体3
MovWF Show_Menu_No
Call SHOW_MENU
MovLW TableNo ;显示TableNo开始的2Byte
Call LoadSum ;读出数字,并转换为显示编码
;保存于ShowBuffer
MovLW 1
MovWF SHOW_WORD_Y ;第二行
MovLW 4
MovWF SHOW_WORD_X ;第五列开始
Call SHOW_WORD ;显示桌号
MovLW 2
MovWF SHOW_WORD_Y ;第二行
MovLW 4
MovWF SHOW_WORD_X ;第五列开始
Call SHOW_CURSOR ;显示光标并结束
Return
Goto_Menu_No4:
MovLW 4H
MovWF Show_Menu_No ;显示核对窗体
Call InitCarteAddr ;初始化核对窗体点菜显示指针
Call SHOW_MENU ;显示核对窗体
Call Menu4View ;显示核对窗体数据
MovLW 1
MovWF SHOW_WORD_Y
ClrF SHOW_WORD_X
Call SHOW_CURSOR ;显示光标至第一行
Return
Goto_Menu_No5:
MovLW 5H
Goto Menu_No_Make
Goto_Menu_No6:
MovLW 6H
Goto Menu_No_Make
Goto_Menu_No7:
MovLW 7H
Menu_No_Make:
MovWF Show_Menu_No
Call SHOW_MENU ;显示窗体并结束
Return
;
;******************转换为LCD模式************
SetLCDMode:
;****************关闭键盘扫描
BCF INTCON,GIE
BTFSC INTCON,GIE
Goto SetLCDMode
;****************端口设为LCD模式
BSF STATUS,RP0 ;选择BANK 1
MovLW PortBLCDMode ;B口设为LCD模式
MovWF TRISB
;BCF TRISB,LCDCS
MovLW B'00011111'
MovWF TRISA
BCF STATUS,RP0
; BSF PORTB,LCDWR
; LCD_Enabled
MovLW b'11111011'
MovWF PORTB
Return
;*******************************************
;******************转换为Key模式************
SetKeyMode:
;****************端口设为键盘扫描模式
LCD_Disabled
q21:
BSF STATUS,RP0 ;选择BANK 1
MovLW PortBKeyMode ;B口恢复Key模式
MovWF TRISB
MovLW B'00001111'
MovWF OPTION_REG
ClrF TRISA
BCF STATUS,RP0
;****************打开键盘扫描
BSF INTCON,GIE
BCF PORTB,BCKLED
Call DELAY_LONG
q22:
Return
;******************************************
;****************无线发送******************
;发送Buffer4~0;LCDZ15~0;LCD高字放指令
SendNFSub:
;关闭总中断
BCF INTCON,GIE
BTFSC INTCON,GIE
Goto SendNFSub
;2mS内无信号开始发送
Call Look2
MovLW 3 ;发送三次
MovWF TEMP
Send1Byte:
MovLW 0BBH ;发送开始标志
MovWF XmtReg
Call Xmtr
MovLW 4
MovWF I
MovLW Buffer7
MovWF FSR
SendNLCDZ1:
SwapF INDF,W
AndLW B'11110000'
MovWF XmtReg
DECF FSR,F
MovLW B'00001111'
AndWF INDF,W
XORWF XmtReg
Call Xmtr
DECF FSR,F
DECFSZ I
Goto SendNLCDZ1
DECFSZ TEMP
Goto Send1Byte
NOINT11: ;打开总中断
BSF INTCON,GIE
BTFSS INTCON,GIE
Goto NOINT11
EndSend:
MsgDel SendNewFood ;删除发送消息
MakeMsg ShowBuffer
Return
;*******************************************
;*****************LCDINIT*******************
;LCD初始化
LCDINIT:
LCD_Enabled
MovLW 3
MovWF sign
MovLW 80H
MovWF ShowRam
Call SendLCDByte
MovLW 9
MovWF sign
MovLW 01H
MovWF ShowRam
Call SendLCDByte
MovLW 9
MovWF sign
MovLW 18H
MovWF ShowRam
Call SendLCDByte
MovLW 9
MovWF sign
MovLW 05H
MovWF ShowRam
Call SendLCDByte
MovLW 9
MovWF sign
MovLW 08H
MovWF ShowRam
Call SendLCDByte
MovLW 9
MovWF sign
MovLW 80H
MovWF ShowRam
Call SendLCDByte
MovLW 9
MovWF sign
MovLW 29H
MovWF ShowRam
Call SendLCDByte
MovLW 9
MovWF sign
MovLW 03H
MovWF ShowRam
Call SendLCDByte
LCD_Disabled
Return
;*******************************************
;******************************************
ShowAll:
; call BCKNot
MovLW 8 ;循环8次
MovWF TEMP
MovLW Buffer0
MovWF FSR
LCD_Enabled
MovLW B'10100000' ;LCD写起始地址
MovWF ShowRam
MovLW 9
MovWF sign
Call SendLCDByte ;发送地址
NxtShow:
MovLW B'00001111' ;读出缓存数据,放入W
AndWF INDF,W
Call TABLE_LED ;解码
MovWF ShowRam
MovFW TEMP
AddWF CursorD,W
XORLW 8H
BTFSC STATUS,Z ;如果为D4则显示小数点
BSF ShowRam,DigSpace
MovLW 8
MovWF sign
Call SendLCDByte ;显示一位
INCF FSR,F
DECFSZ TEMP,F
Goto NxtShow
LCD_Disabled
Return
;*******************无线部分*******************
Talk:
ClrF RcvReg ; 清接收寄存器
BTFSC PORTC,DIn ; 等待起始位
Goto User ; 延时 104/2 uS
Call Delay4 ; 延时 104+104/4 uS
;***************************************************************
; 无线接收
; 每次接收1字节
Rcvr:
IF RNbit
MovLW 8 ; 8 位数据位
ELSE
MovLW 7 ; 7 位数据位
ENDIF
;
MovWF Count
R_next:
BCF STATUS,C
IF RMODE
RRF RcvReg,F ; to set if MSB first or LSB first
ELSE
RLF RcvReg,F
ENDIF
BTFSC PORTC,DIn
;
IF RMODE
IF RNbit
BSF RcvReg,MSB ; Conditional Assembly
ELSE
BSF RcvReg,MSB-1
ENDIF
ELSE
BSF RcvReg,LSB
ENDIF
;
Call DelayY
DECFSZ Count,F
Goto R_next
;****************************************************
R_over:
MovFW RcvReg ; 接受到的数据存入寄存器
MovWF XmtReg
;****************************************************
; 无线发送
;
Xmtr:
IF XNbit
MovLW 8 ;8 位数据位
ELSE
MovLW 7 ;7 位
ENDIF
MovWF Count
;
IF XMODE
ELSE
IF XNbit
ELSE
RLF XmtReg,F
ENDIF
ENDIF
;
BCF PORTC,DOut ;发送起始位
Call Delay1
X_next:
BCF STATUS,C
;
IF XMODE
RRF XmtReg,F ; Conditional Assembly
ELSE ; to set if MSB first or LSB first
RLF XmtReg,F
ENDIF
;
BTFSC STATUS,C
BSF PORTC,DOut
BTFSS STATUS,C
BCF PORTC,DOut
Call DelayX
DECFSZ Count,F
Goto X_next
BSF PORTC,DOut ; 发送停止位
Call Delay1
;
IF Sbit2
BSF PORTC,DOut
Call Delay1
ENDIF
;
Return
Goto Talk ; 下一次接收或发送
;
; 发送过程结束
;
DelayY:
MovLW BAUDY
Goto save
DelayX:
MovLW BAUDX
Goto save
Delay4:
MovLW BAUD4
Goto save
Delay1:
MovLW BAUD1 ; 104 uS for 9600 baud
Goto save
Delay2:
MovLW BAUD2
save:
MovWF DlyCnt
redo_1:
DECFSZ DlyCnt,F
Goto redo_1
RetLW 0 ;
RSmain:
BSF PORTC,DIn
Goto Talk
User:
MovLW BAUD3
MovWF DlyCnt
redo_2:
DECFSZ DlyCnt,F ;
Goto redo_2
Goto Talk ; 循环直至发现开始位
Goto RSmain
;***************************************
;**********************生成组1数据******************
;将Buffer7--Buffer2中的数据放入LCDZ15~CDZ10中
MakeZu1:
MovLW B'00001111'
AndWF Buffer7,F
SwapF Buffer7,W
XORWF LCDZ15,F
MovLW B'00001111'
AndWF Buffer6,F
SwapF Buffer6,W
XORWF LCDZ14,F
MovLW B'00001111'
AndWF Buffer5,F
SwapF Buffer5,W
XORWF LCDZ13,F
MovLW B'00001111'
AndWF Buffer4,F
SwapF Buffer4,W
XORWF LCDZ12,F
MovLW B'00001111'
AndWF Buffer3,F
SwapF Buffer3,W
XORWF LCDZ11,F
MovLW B'00001111'
AndWF Buffer2,F
SwapF Buffer2,W
XORWF LCDZ10,F
Return
;************************************************
;************************核对菜单显示***************************;
Menu4View: ;
;从CarteAddr中得到需要显示的菜名及菜量 ;
;每次显示三道菜 ;
;最初及最后二道不滚动 ;
MovLW 1 ;
MovWF SHOW_SHOW_Y ;
;
LoadCarte: ;
Call LoadCarteData ;从EEPROM得到首行点菜数据 ;
MovLW endCode ;
XORWF FOODID,W ;判断是否结束 ;
BTFSC STATUS,Z ;未结束跳转 ;
RetLW 0FFH ;到达点菜菜单底部 ;
MovLW 0FEH ;
XORWF FOODID,W ;是否被删除 ;
BTFSC STATUS,Z ;
Goto NewCarte ;被删除,读出下一条 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -