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

📄 main.asm

📁 一个用PIC做的无线点菜系统的系统
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;烧片选项
;	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 + -