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

📄 main.asm

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