📄 last.asm
字号:
/**********************************************************
通过RB1,与RB2口连接两个接键,接不同的接键会在LCD上显示不同的
提示信息,最开始LCD上会出现工作界面:HELLO
;**********************************************************
__CONFIG 3F39H;设置配置位中振荡方式为XT,其它全部禁止或关闭
;***********************************************************
STATUS EQU 3H ;定义状态寄存器地址
pcl EQU 02H ;定义程序寄存器低8位
PORTA EQU 5H ;定义RA口数据寄存器地址
PORTB EQU 6H ;定义RB口数据寄存器地址
PORTC EQU 7H ;定义RC口数据寄存器地址
TRISA EQU 85H ;定义RA口方向控制寄存器地址
TRISB EQU 86H ;定义RB口方向控制寄存器地址
TRISC EQU 87H ;定义RC口方向控制寄存器地址
ADCON1 EQU 9FH ;定义ADC模块控制寄存器1的地址
OPTION_REG EQU 81H ;
;********************
Z EQU 2 ;定义0状态位的位地址
RP0 EQU 5 ;定义页选位RP0的位地址
;*********************
RS EQU 1 ;LCD寄存器选择信号脚定义在RA.1脚
RW EQU 2 ;LCD读/写信号脚定义在RA.2脚
E EQU 3 ;LCD片选信号脚定义在RA.3脚
BU EQU 7 ;LCD忙
;**************************
KEYNU EQU 25H ;显示字符数
ABC EQU 23H ;字符变量
KEYP EQU 24H ;
;*******************************
ZERO EQU 0
ONE EQU 1
TWO EQU 2
THR EQU 3
FOR EQU 4
;*******************************
ORG 000H
NOP ;放置一条ICD必需的空操作指令
GOTO MAIN
ORG 0008H
MAIN
BSF STATUS,RP0
MOVLW 07H
MOVWF ADCON1 ;设置RA口全部为普通数字IO口
MOVLW 00H ;定义RA口,RC口全部为输出
MOVWF TRISA
MOVWF TRISC
BCF OPTION_REG,7
MOVLW 0FFH
MOVWF TRISB ;定义RB口为输入口
BCF STATUS,RP0 ;进入页0进行设置
call LCDSET ;初始化lcd
;显示工作画面HELLO
MOVLW 00H
MOVWF ABC ;显示字符位数
LP1
MOVF ABC,W
CALL HELLO
MOVWF PORTC ;显示一个字符
CALL DATAEN ;WRITE DATA ENABLE
INCF ABC
MOVLW 05H ;共显示5个字符
SUBWF ABC,W
BTFSS STATUS,Z
GOTO LP1 ;工作画面显示完毕
MYKEY
MOVLW 0FFH
MOVWF KEYP
CALL KEY ;键盘子程序
MOVF KEYP,F
BTFSS STATUS,Z
GOTO MYKEY
;有按键按下
MOVLW 01H
MOVWF PORTC ;清屏
CALL ENABLE
MOVLW 00H
MOVWF ABC ;显示字符位数
LP2
MOVF ABC,W
CALL PRESSED
MOVWF PORTC ;显示一个字符
CALL DATAEN
INCF ABC
MOVLW 09H ;共显示9个字符
SUBWF ABC,W
BTFSS STATUS,Z
GOTO LP2
MOVF KEYNU,W ;把键码显示出来
CALL TABLE2
MOVWF PORTC ;显示一个字符
CALL DATAEN
goto MYKEY
;------------------------------------------------------
;--------------------------KEY-------------------------
;------------------------------------------------------
KEY
BTFSC PORTB,1 ;判断B1是否按下
GOTO KEY2 ;没有看B2
CALL DELAY5MS
CALL DELAY5MS
BTFSC PORTB,1
GOTO KEY2
CLRF KEYP
MOVLW 01H
MOVWF KEYNU ;把按键代码放入KEYNU中
KEY2
BTFSC PORTB,2
GOTO TAIL
CALL DELAY5MS
CALL DELAY5MS
BTFSC PORTB,2
GOTO TAIL
CLRF KEYP
MOVLW 02H
MOVWF KEYNU
TAIL
RETLW 0H
;-------------------------------------------------------
;-------------------下面为LCD初始化过程-----------------
;-------------------------------------------------------
LCDSET
call DELAY5MS ;延时15ms,LCD上电复位可能比PIC慢
call DELAY5MS
call DELAY5MS
MOVLW 01H
MOVWF PORTC ;清屏
CALL ENABLE
MOVLW 38H ;显示模式:8位2行5x7点阵
MOVWF PORTC
CALL ENABLE
MOVLW 38H
MOVWF PORTC ;显示模式:8位2行5x7点阵
CALL ENABLE
MOVLW 0FH ;显示器开、光标开、闪烁开
MOVWF PORTC
CALL ENABLE
MOVLW 06H ;读或写下个字符后光标自动右移
MOVWF PORTC
CALL ENABLE
MOVLW 0C0H ;写入显示起始地址(第一行第一个位置)
MOVWF PORTC
CALL ENABLE
retlw 0h
;------------------------------------------------
;---------------写入commend使能------------------
;------------------------------------------------
ENABLE
BCF PORTA,RS ;写入控制命令的子程序.RS=L
BCF PORTA,RW ;RW=L
BCF PORTA,E ;E为一高脉冲
CALL DELAY5MS
BSF PORTA,E
RETLW 0
;------------------------------------------------
;---------------写入 data 使能------------------
;------------------------------------------------
DATAEN
BSF PORTA,RS ;液晶模块写数字
BCF PORTA,RW
BCF PORTA,E
CALL DELAY5MS
BSF PORTA,E
RETLW 0
;----------------------------------------------
;------------------字码表----------------------
;----------------------------------------------
HELLO addwf pcl,f
dt 48h,45h,4ch,4ch,4fh ;HELLO
PRESSED addwf pcl,f ;pc相对寻相查表
dt 50h,52h,45h,53h,53h,45h,44h,20H,20H ;pressed
TABLE2 addwf pcl,f
dt 30h,33h,34H ;0,1,2,3,4
;---------------------------------------------
;延时5MS子程序
;---------------------------------------------
DELAY5MS movlw 08h ;外循环常数
movwf 20h ;外循环寄存器
loop1 movlw 0ffh ;内循环常数
movwf 21h ;内循环寄存器
loop2 decfsz 21h ;内循环寄存器递减
goto loop2 ;继续内循环
decfsz 20h ;外循环寄存器递减
goto loop1 ;继续外循环
return
end
;*******************END*******************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -