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

📄 key.asm

📁 完整的PIC学习程序示例 软件功能: RT1602C驱动 UART串口输出
💻 ASM
字号:
;/**************************************************************************
;*                                                                         *
;*         Copyright (c) 2006 by JINRUN Technology Co., Ltd.               *
;*  Title  :    FPPA TM demo board---PIC PARTY
;*  Content:    AD,LCM Drive,Key input,LED flash,etc.,   
;*  MCU    :    PIC16F877A(PIC),PDK80C08(PDK)[FPPA TM]
;*  LCD    :    RT1602C
;*  OSC    :    8MHz(ext. HT) 
;*  WDT    :    OFF                                      
;*  Author :    Raker.Yang                                                 *
;*  FPPA TM 简介:FPPA TM是世界首创的多核心单晶片,所有RAM和ROM却能够共享
;*                目前支持8个核心(8路独立PC,STACK,ACC等)
;*                既然有了独立多核心,跑多任务程序也就更简单了。
;*                更重要的是,它可以非常方便的扩展MCU外围,如,PWM,IIC,UART等。
;*  如果你对FPPA TM技术感兴趣,欢迎访问笔者博客 http://gongkong.gkbk.com
;*  或加入作者QQ:595142970, QQ群25644462
;*  同时欢迎各路商家前来进行方案合作!
;*
;*  声明:本资料仅供个人学习PIC或FPPA TM软件设计参考,任何人都可以转载此资料。
;*        但任何单位或个人都不能将此资料作为商业用品。本资料可能存在一些缺陷,
;*        如果你将本资料用于产品,所引起的一切后果,均由使用者承担
;*                                                                        *
;**************************************************************************/

;--------KEY SCAN SUBROUTINE------------------------
; Name        :KEY_SCAN
; Input       :RC4,RC5,RC6(AUTO, STEP, MODE)
; Output      :MODE_REG,MODE_CNT,KEY_VAL,KEY_VAL_BUF(valid value)
; Temp REG    :TEMP0 ,TEMP1
; Function    :MODE SW,AUTO SW,STEP SW scan
;--------------------------------------------------
KEY_SCAN:
	BCF     TIMER_FLAG, KEY_SCAN_FLAG
	BANKSEL TRISC
	MOVF    TRISC, W
	BANKSEL TMR0
	MOVWF   TEMP0
	IORLW   B'00110000'
	BANKSEL TRISC
	MOVWF   TRISC
	NOP
	NOP
	BANKSEL TMR0
	MOVF    PORTC, W
	MOVWF   TEMP1             
CHECK_OTHER_SW:
        BTFSC   KEY_STATUS, KEY_VALID
        GOTO    KEY_SCAN_END            ;WAIT KEY PROCESS
	MOVF    TEMP1,W
        ANDLW   B'00110000'
        IORLW   B'11001111'
        XORLW   B'11111111'
        BTFSC   STATUS, Z  ;Z = 1:NO KEY
        GOTO    NO_KEY_INPUT
        BTFSC   KEY_STATUS, KEY_BUSY   ;KEY_BUSY表示按键正被按下
        GOTO    KEY_SCAN_END
        MOVWF   KEY_VAL
        SUBWF   KEY_VAL_BUF,W
        BTFSS   STATUS,Z   ;Z = 1: EQU LAST TIME
        GOTO    SAVE_KEY_VAL
        INCF    KEY_CNT
        MOVF    KEY_CNT, W
        SUBLW   0x02
        BTFSC  STATUS, C
        GOTO    KEY_SCAN_END
        BSF     KEY_STATUS, KEY_VALID ;
        BSF     KEY_STATUS, KEY_BUSY
        GOTO    KEY_SCAN_END
SAVE_KEY_VAL:
        MOVF    KEY_VAL, W
        MOVWF   KEY_VAL_BUF 
        BCF     KEY_STATUS, KEY_BUSY       
        GOTO    KEY_SCAN_END
NO_KEY_INPUT: 
	DECFSZ  KEY_CNT
	GOTO    KEY_SCAN_END
	BCF     KEY_STATUS, KEY_BUSY
	MOVLW   0x01
	MOVWF   KEY_CNT 	                       
KEY_SCAN_END:
	
        MOVF    TEMP0,W
        BANKSEL TRISC
        MOVWF   TRISC
        BANKSEL TMR0
        RETURN
;-------------------------------------------------------------
;
;---------KEY PROCESS------------------------------------------
;Name		:KEY_PROCESS
;Input		:KEY_STATUS,KEY_VAL_BUF
;Output		:MODE_REG,SYS_STATUS
;TEMP REG	:
;FUNCTION	:根据键的响应处理发送模式和显示模式
KEY_PROCESS:
        BCF     TIMER_FLAG, KEY_PROCESS_FLAG        
	BTFSS   KEY_STATUS, KEY_VALID
	GOTO    KEY_PROCESS_RET	
	MOVF    KEY_VAL_BUF, W
	XORLW   MODE_CHECK
	BTFSC   STATUS, Z
	GOTO 	MODE_PROCESS
	XORLW   MODE_CHECK | ONOFF_CHECK
	BTFSC   STATUS, Z
	GOTO    ON_OFF_PROCESS
KEY_PROCESS_RET:	
	BCF     KEY_STATUS, KEY_VALID
	CLRF    KEY_VAL_BUF
	RETURN  ;键值无效,返回
MODE_PROCESS:
        INCF    MODE_REG
        MOVF    MODE_REG, W
        XORLW   SentModeMax
        MOVLW   0x00
        BTFSC   STATUS, Z
        MOVWF   MODE_REG
        BSF     LCD_DRV_REQ, S_LCD_DRV_REQ
        BSF     LCD_DRV_REQ, G_LCD_DRV_REQ
        BSF     LCD_DRV_REQ, SCREEN_DRV_REQ
        GOTO    KEY_PROCESS_RET
ON_OFF_PROCESS:
	BTFSS   SYS_STATUS, UART_SENT_EN
	GOTO    SENT_EN_PROCESS              ;因为发送使能已经关闭,所以需要开启
        BSF     LCD_DRV_REQ, R_LCD_DRV_REQ   
        BSF     LCD_DRV_REQ, G_LCD_DRV_REQ	
	BCF     SYS_STATUS, UART_SENT_EN     ;因为发送使能已经开启,所以需要关闭
	BCF     SYS_STATUS, UART_BUSY
ON_OFF_PROCESS_RET:
	GOTO    KEY_PROCESS_RET
SENT_EN_PROCESS:
	BSF     SYS_STATUS, UART_BUSY
        BSF     SYS_STATUS, UART_SENT_EN
        BSF     LCD_DRV_REQ, S_LCD_DRV_REQ
        BSF     LCD_DRV_REQ, G_LCD_DRV_REQ
        BSF     LCD_DRV_REQ, SCREEN_DRV_REQ
        GOTO    ON_OFF_PROCESS_RET	
;-----------KEY PROCESS END--------------------
;	
		        	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -