📄 main.asm
字号:
;烧片选项
; RC Enabled
; OFF
; On
; Off
; On
; Disabled
; Off
; Enabled
;USE PIC16CF873 OSC=XT,INT=4MHZ,WDT=OFF
LIST P=16F873
;16F873寄存器定义
Include <P16F873.inc>
;自定义变量
Include <Global.inc>
;自定义宏
Include <Macros.inc>
;显示模块
Include <LCDShowLib.asm>
;*****************************************
;------------------------
ORG 000H
Goto START
ORG 004H ;INTERRUPT SUBROUTINE
Goto INTP
Show_Menu_Run:
AddWF PCL
NOP
Goto SHOW_MENU_NO1
Goto SHOW_MENU_NO2
Goto SHOW_MENU_NO3
Goto SHOW_MENU_NO4
Goto SHOW_MENU_NO5
Goto SHOW_MENU_NO6
Goto SHOW_MENU_NO7
Run_Menu:
AddWF PCL
Goto Run_Menu_NO1
Goto Run_Menu_NO2
Goto Run_Menu_NO3
Goto Run_Menu_NO4
Goto Run_Menu_NO5
Goto Run_Menu_NO6
Goto Run_Menu_NO7
START:
Call Initialize ;初始化
MsgClean
Call SetLCDMode
LCD_ON
MovLW B'00000001'
MovWF PCNO ;初始化
ss12:
MakeMsg ShowBuffer
SS11:
ClrF TestTimesLO
ClrF TestTimesHI
eess:
ClrF KeyData
Main:
; ClrWDT ;清除软件狗
;消息分发
MsgSend ShowCurData,ShowCDSub ;当前光标处显示当前键值,光标右移1位并显示光标
NOP
MsgSend ShowDefine,ShowDSub ;显示初始化消息
NOP
MsgSend ShowCursor,ShowCSub ;显示光标消息
NOP
MsgSend ShowBuffer,ShowBSub ;显示缓存中全部数据,光标移至D4
NOP
MsgSend SendNewFood,SendNFSub ;发送数据消息
NOP
MsgSend KeyIN,KeyMSG ;有按键消息需要处理
NOP
Main1:
MsgSend KeySeeMsg,KeyEnable ;键盘扫描时间到,执行键盘扫描
Goto Main
;******************中断处理**************
INTP:
MovWF W_TEMP ;****************
SwapF STATUS,W ;现场保护
MovWF STATUS_TEMP ;****************
INTCloseINT: ;
;关闭总中断 ;
BCF INTCON,GIE ;由于中断将出现在程序运行的 ;
BTFSC INTCON,GIE ;的任意位置,因此,这里不使用 ;
Goto INTCloseINT ;Call,以降低堆栈资源的占用 ;
BCF STATUS,RP0 ;Bank0
INTOK:
BTFSS INTCON,T0IF
Goto INTEnd
Call INT_TMR0 ;TMR0中断处理
INTEnd:
BSF INTCON,GIE ;*******************
SwapF STATUS_TEMP,W ;现场恢复
MovWF STATUS ;中断返回
SwapF W_TEMP,F ;
SwapF W_TEMP,W ;*******************
RetFIE
;试验运行处理
;定时器TMR0中断处理程序
INT_TMR0:
;计数值加1
BCF INTCON,T0IF
MovLW 1 ;计数器计数
AddWF EnumerateLO,F
BTFSC STATUS,C
AddWF EnumerateHI,F
;扫描延时
MovLW B'00000111' ;计数值 模8
AndWF EnumerateLO,W
BTFSS STATUS,Z
Goto INEND
MakeMsg KeySeeMsg ;设置键盘扫描
INEND:
Return
;
;*********************DELAY
DELAY_LONG:
MovLW B'11111111'
MovWF H_byte
FF0:
MovLW B'00000000'
MovWF L_byte
FF1:
INCFSZ L_byte,F
Goto FF1
INCFSZ H_byte,F
Goto FF0
Return
Delay256:
MovLW 0F0h
MovWF H_byte
delay1:
INCFSZ H_byte,F
Goto delay1
Return
;*************************
Initialize:
BSF STATUS,RP0 ;选择BANK 1
BCF STATUS,RP1
MovLW B'00001111'
; _ B口弱上拉连通
; _ RB0/INT上升沿触发
; _ 使用内部指令时钟
; _ 预分频分给WDT
; ___ 预分频1:8
MovWF OPTION_REG
;NOINT: ;关闭总中断
; ClrF INTCON
; BTFSC INTCON,GIE
; Goto NOINT
MovLW B'00000000'
MOVWF TRISA
MovLW B'00000000'
MovWF TRISB
; MovLW B'10100000'
; _ 总中断开启
; _
; _ TMR0中断开启
; _ 外部中断关闭
; _ B口中断关闭
; MovWF INTCON
BCF STATUS,RP0
RetLW 0
KeyEnable: ;按键处理
MsgDel KeySeeMsg
BCF STATUS,C
RRF PCNO,F ;当前键盘扫描位置循环右移
BTFSC STATUS,C ;如4BIT全部移出
BSF PCNO,3 ;置D3
see:
COMF PCNO,W ;当前扫描位输出
MovWF PORTA ;
;判断按键及信号
COMF PORTB,W
AndLW B'11110000'
; AndWF PORTB,W ;读Com值
BTFSC STATUS,Z ;
Goto CleanKey ;该行无键按下,清除旧标志
XORWF PCNO,W
MovWF TEMP ;
XORWF KeyCode,W
BTFSC STATUS,Z
Return ;上次按键未释放
NewKeyDown: ;新的按键
MovFW TEMP
MovWF KeyCode
MakeMsg KeyIN ;待处理标志
Return
CleanKey: ;清除当前按键标志
MovLW B'00001111'
AndWF KeyCode,W
AndWF PCNO,W ;判断上次按键纪录是否与本次扫描行相同
BTFSS STATUS,Z
ClrF KeyCode ;清除按键数据
Return ;与上次按键扫描值不等,返回
;相等:表明键以放开或上次为误动作
;****************************************************************
;***************************按键消息处理*************************
KeyMSG:
MsgDel KeyIN ;清除待处理标志
MenuRun: ;判断当前窗体状态
INCF Show_Menu_No,W
Goto Run_Menu
Run_Menu_No1: ;欢迎窗体
MovFW KeyCode
XORLW KeyOk ;是否为确认键
SKPNZ
Goto Goto_Menu_No2 ;确认键,进入第二个窗体
MovFW KeyCode
XORLW KeyAdd ;是否为添加键
SKPZ
Return
Call Goto_Menu_No7 ;显示下载窗体
Call DownLoadMenus ;下载菜单
Return
Run_Menu_No2: ;输入桌号、员工号、客人人数
Run_Menu_No3: ;输入菜号、数量
KeySee: ;判断键类型
BTFSS KeyCode,3 ;判断第四行按键
Goto lin3
BTFSC KeyCode,7
MovLW 0 ;0
BTFSC KeyCode,6
MovLW 1 ;1
BTFSC KeyCode,5
MovLW 2 ;2
BTFSC KeyCode,4
MovLW 3 ;3
Goto SumKey
lin3:
BTFSS KeyCode,2 ;判断第三行按键
Goto lin2
BTFSC KeyCode,7
MovLW 4 ;4
BTFSC KeyCode,6
MovLW 5 ;5
BTFSC KeyCode,5
MovLW 6 ;6
BTFSC KeyCode,4
MovLW 7 ;7
Goto SumKey
lin2:
BTFSS KeyCode,1 ;判断第二行按键
Goto lin1
BTFSC KeyCode,4
Call RunkeyPower ;电源开关
BTFSC KeyCode,5
MovLW 0DH ;.
BTFSC KeyCode,6
MovLW 9 ;9
BTFSC KeyCode,7
MovLW 8 ;8
Goto SumKey
lin1:
; BTFSC KeyCode,7
; Goto RunkeyAdd23 ;keyAdd 添加键
BTFSC KeyCode,6
Goto RunkeyOk23 ;keyOk 确认键
BTFSC KeyCode,5
Goto RunkeyCancel23 ;keyCancel 取销键
BTFSC KeyCode,4
Goto RunkeyCheck23 ;keyCheck 核对键
KeyMSGEND:
Return
RunkeyOK23: ;keyOk 确认键
Goto ENDInputLine
RunkeyCancel23: ;keyCancel 取消键
Call ClrInputBuff ;清除输入缓存
Call ClrShowLine ;清除本行显示,并复位光标
Return
RunkeyCheck23:
Call Goto_Menu_No4 ;转至核对窗体
Return
;**********************键处理(包括小数点)*********************;
;需要显示的数字存放于W寄存器 ;
SumKey: ;
;
Call Save_Word1 ;保存单个字符,不改变W ;
Call SwitchInput ;转换为显示的GB码;默认高位为0A3H ;
Call SHOW_WORD1 ;显示单个字符 ;
;
INCF SHOW_WORD_X,F ;光标自动后移 ;
BTFSS SHOW_WORD_X,4 ;判断是否超出一行 ;
Return ;结束 ;
;
; 超出单行跳转至行结束处理 ;
;
ENDInputLine: ;结束当前行,并创建新输入行, ;
Call SaveInputLine ;保存当前本行 ;
;
NextInputLine: ;创建新输入行 ;
MovLW 4 ;得到新的列坐标 ;
MovWF SHOW_WORD_X ;
INCF SHOW_WORD_Y,F ;行坐标 ;
BTFSS SHOW_WORD_Y,2 ;判断行是否超出4行 ;
Return ;未超出结束 ;
;
; 超出一屏 ;
;
EndInputPage: ;结束当前屏显示 ;
MovFW Show_Menu_No ;
XORLW 2 ;
SKPNZ ;
Goto EndTablePage ;窗体2键溢出,保存 ;
;
NewInputPage: ;窗体3 ;
Call SaveInputPage ;保存到EEPROM ;
Call NewP ;
;开始新的一道菜设置新的坐标 ;
MovLW 4 ;
AddWF CarteAddr,F ;
BTFSC STATUS,C ;
INCF CarteAddrH,F ;生成下一个菜单E2PROM地址 ;
Call GOTO_Menu_NO3 ;刷新显示并结束键处理 ;
Return ;
;
EndTablePage: ;窗体2超出 ;
MovFW KeyCode ;
XORLW keyOk ;
SKPZ ;判断是否是"确认"键 ;
Return ;不是确认键,结束 ;
Call Goto_Menu_No3 ;窗体改为窗体3 ;
Call InitCarteAddr ;初始化点菜菜单 ;
Return ;
;***************************************************************;
;**************************核对窗体*****************************;
Run_Menu_No4: ;核对窗体 ;
MovFW KeyCode ;
XORLW keyUp ;
BTFSC STATUS,Z ;
Goto runKeyUp ;向上滚动 ;
MovFW KeyCode ;
XORLW keyDown ;
BTFSC STATUS,Z ;
Goto runKeyDown ;向下滚动 ;
MovFW KeyCode ;
XORLW keyok ;
BTFSC STATUS,Z ;
Goto SendMenu ;发送菜单 ;
MovFW KeyCode ;
XORLW keyCencel ;
BTFSC STATUS,Z ;
Goto DelMenu ;删除菜单 ;
MovFW KeyCode ;
XORLW keyAdd ;
BTFSC STATUS,Z ;追加菜单 ;
Goto RunAddMenu ;
Return ;
;
DelMenu: ;
DECF I,W ;
MovWF FCarteAddr ;FCarteAddr临时变量,计算删除地址 ;
RLF FCarteAddr,F ;
RLF FCarteAddr,W ;
AddWF CrateAddr,F ;
BTFSC STATUS,C ;
INCF CarteAddr,F ;得到需要删除的地址 ;
MovFW CarteAddrEnd ;读出最后一个数据 ;
MovWF EEProm_AddressL ;
MovFW CarreAddrEndH ;
MovWF EEProm_AddressH ;
MovLW 4 ;
MovWF EEPROM_Len ;
MovLW FOODID ;
Call EEPROMLoad ;
Call SaveInputPage ;覆盖需要删除的位置 ;
MovLW 4 ;
SubWF CarteAddrEnd,F ;
BTFSS STATUS,C ;
DECF CarteAddrEndH ;改变尾指针 ;
Call Menu4View ;刷新显示 ;
Return ;
;
RunAddMenu: ;
MovFW CarteAddrEnd ;改变当前点菜指针至最后 ;
AddLW 4 ;
BTFSC STATUS,C ;
INCF CarteAddrEndH,W ;
MovWF CarteAddrH ;
MovFW CarteAddrEnd ;
MovWF CarteAddr ;
Call GOTO_MENU_NO3 ;转至点菜窗体 ;
Return ;
;
SendMenu: ;发送菜单 ;
;发送点菜菜单包头 ;
Call Look20 ;等待20mS空闲 ;
MovLW 8 ;
MovWF SendLens ;发送数据长度8Byte ;
MovLW 01H ;
MovWF SendCommand ;发送指令 ;
BankCopy TableNo,6,SendBuffer ;发送桌号,员工号,客人数 ;
Call PutNow ;发送 ;
SubLW 0 ;
BTFSS STATUS,C ;返回结果非0错误 ;
Goto SendErr ;
;
;发送点菜菜单数据包 ;
Call InitCarteAddr ;菜单起始位置 ;
SendN4: ;
MovFW CarteAddr ;
MovWF EEProm_AddressL ;
MovFW CarteAddrH ;
MovWF EEProm_AddressH ;
MovLW 010H ;
MovWF EEPROM_Len ;
MovLW SendBuffer ;
Call EEPROMLoad ;读出4道菜并放入发送寄存器 ;
;
MovLW 12H ;发送数据长度18Byte ;
MovWF SendLens ;
MovLW 02H ;发送点菜菜单 ;
MovWF SendCommand ;
Call PutNow ;发送 ;
SubLW 0 ;
BTFSS STATUS,C ;返回结果非0错误 ;
Goto SendErr ;
;
INCF SendBuffer,W ;
BTFSC STATUS,C ;
Goto SendCarteEnd ;发送完成 ;
INCF SendBuffer + 04H,W ;
BTFSC STATUS,C ;
Goto SendCarteEnd ;发送完成 ;
INCF SendBuffer + 08H,W ;
BTFSC STATUS,C ;
Goto SendCarteEnd ;发送完成 ;
INCF SendBuffer + 0CH,W ;
BTFSC STATUS,C ;
Goto SendCarteEnd ;发送完成 ;
;
MovLW 010H ;发送下4道菜 ;
AddWF CarteAddr,F ;
BTFSC STATUS,C ;
INCF CarteAddrH,F ;
Goto SnedN4 ;
;
SendCarteEnd: ;发送完成 ;
Call GOTO_MENU_NO5 ;显示发送成功 ;
Return ;
SendErr: ;
Call Goto_MENU_NO6 ;显示发送不成功 ;
Return ;
;
runKeyUp: ;向上滚动 ;
DECFSZ I,F ;
Goto ViewCurSer ;显示光标 ;
;超出屏幕上限 ;
INCF I,F ;I=1 ;
MovLW 4 ;
SubWF CarteAddr,F ;当前第一条显示的菜单地址 ;
BTFSC STATUS,C ;判断借位 ;
DECF CarteAddrH,F ;借位,高位地址减一 ;
BTFSS STATUS,Z ;判断是否超出第一条 ;
Goto ViewN ;高位不为0,未超出 ;
MovF CarteAddr,F ;高位为零,判断低位 ;
BTFSS STATUS,Z ;
Goto ViewN ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -