键盘演示程序.docx
- 文档编号:6833480
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:18
- 大小:18.37KB
键盘演示程序.docx
《键盘演示程序.docx》由会员分享,可在线阅读,更多相关《键盘演示程序.docx(18页珍藏版)》请在冰豆网上搜索。
键盘演示程序
键盘演示程序,
PS2_CLKBITP3.3
PS2_DATABITP3.4
LCD_RSBITP2.0;LCD控制端口
LCD_RWBITP2.1
LCD_ENBITP2.2
LCD_XEQU27H;LCD地址变量
KEY_DATAEQU30H
EXT1_NUMEQU31H
BEEPBITP3.3
RESETBIT20H.0
H_SCANBIT20H.1;行扫描标志
SHIFTBIT20H.3;SHIFT标志
BREAK_CBIT20H.4;断码标志
;---------------------------------------------------
ORG0000H
JMPMAIN
ORG0013H
JMPEXT1
ORG0043H
;---------------------------------------------------
MAIN:
MOVSP,#60H
MOVP0,#0FFH
MOVP2,#0FFH
MOVP3,#0FFH
ACALLINIT_LCD
ACALLSET_LCD1
ACALLSET_LCD2
MOVR5,#100;延时5S
ACALLDELAY
MOVA,#01H
ACALLWCOM;清屏
MOV20H,#00H
MOVLCD_X,#00H
MOVR1,#00H
MOVR2,#00H
MOVKEY_DATA,#00H
CLRIT1;外部中断1为低电平触发
SETBEA;开总中断
SETBEX1;开外部中断1
DISP:
JBRESET,MAIN;程序热复位
JMPDISP
;----------------------------------------------------------
;根据PS2的键值来查找其代码,并取得顺序码。
;然后再根据顺序码来查找ASCII码。
;入口:
;APS2的键值
;出口:
;A键值的ASCII码
;R3存放顺序码
;----------------------------------------------------------
PS2KEY_D:
MOVB,A
MOVDPTR,#TABLE_D
MOVR3,#0FFH
KEY_IN1:
INCR3
MOVA,R3
MOVCA,@A+DPTR
CJNEA,B,KEY_IN2
MOVA,R3;找到,取顺序码
MOVDPTR,#TABLE_D_ASC;根据顺序码来查找ASCII码
MOVCA,@A+DPTR
RET
KEY_IN2:
CJNEA,#0FFH,KEY_IN1;末完,继续查
RET;0FFH为结束码
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PS2KEY_U:
MOVB,A
MOVDPTR,#TABLE_D
MOVR3,#0FFH
KEY_IN3:
INCR3
MOVA,R3
MOVCA,@A+DPTR
CJNEA,B,KEY_IN4
MOVA,R3;找到,取顺序码
MOVDPTR,#TABLE_U_ASC;根据顺序码来查找ASCII码
MOVCA,@A+DPTR
RET
KEY_IN4:
CJNEA,#0FFH,KEY_IN3;末完,继续查
RET;0FFH为结束码
;------------------------------------------------------
;外部中断子程序
;R1中断次数计数
;------------------------------------------------------
EXT1:
CJNER1,#00H,IN_LOOP;跳过第一位启动位
JMPIN_LOOP3
IN_LOOP:
CJNER1,#09H,IN_LOOP1;2-9位为数据
IN_LOOP1:
JNCIN_LOOP3;大于或等于9,转。
RRA;
JBPS2_DATA,IN_LOOP2;判数据是“1”,还是“0”
ANLA,#7FH;是“0”最高置位为0
JMPIN_LOOP3
IN_LOOP2:
ORLA,#80H;是“1”最高置位为1
IN_LOOP3:
INCR1;中断计数
JNBPS2_CLK,$;等待PS2_CLK变高
IN_LOOP4:
CJNER1,#0BH,IN_LOOP5;一桢数据是否读完?
IN_LOOP5:
JNCIN_LOOP6;大于或等于11,转。
JMPEXT1_END
IN_LOOP6:
CJNEA,#0F0H,IN_LOOP6E;断码是否开始
SETBBREAK_C;置断码标志
MOVR1,#00H
JMPEXT1_END
IN_LOOP6E:
CJNEA,#66H,IN_LOOP6A;BackSpace键功能
JBBREAK_C,IN_LOOP6F
MOVR1,#00H
MOVR4,LCD_X
CJNER4,#00H,IN_LOOP6G;判是否到显示起始位
JMPEXT1_END
IN_LOOP6G:
DECLCD_X;删除前一位数
MOVA,#20H
ACALLCONV1;有INCLCD_X指令
DECLCD_X;所以要再减一次
MOVA,#10H;光标左移一格
ACALLWCOM
JMPEXT1_END
IN_LOOP6F:
CLRBREAK_C
MOVR1,#00H
JMPEXT1_END
IN_LOOP6A:
CJNEA,#12H,IN_LOOP6C;左SHIFT
JBBREAK_C,IN_LOOP6B
MOVR1,#00H
SETBSHIFT;置SHIFT标志
JMPEXT1_END
IN_LOOP6B:
CLRSHIFT
CLRBREAK_C
MOVR1,#00H
JMPEXT1_END
IN_LOOP6C:
CJNEA,#59H,IN_LOOP7;右SHIFT
JBBREAK_C,IN_LOOP6D
MOVR1,#00H
SETBSHIFT
JMPEXT1_END
IN_LOOP6D:
CLRSHIFT
CLRBREAK_C
MOVR1,#00H
JMPEXT1_END
IN_LOOP7:
CJNEA,#71H,IN_LOOP8;DEL键功能,清屏。
JBBREAK_C,IN_LOOP7A
MOVR1,#00H
MOVA,#01H
ACALLWCOM
MOV20H,#00H;清所有的标志
MOVLCD_X,#00H;
JMPEXT1_END
IN_LOOP7A:
CLRBREAK_C
MOVR1,#00H
JMPEXT1_END
IN_LOOP8:
CJNEA,#5AH,IN_LOOP9;ENTER键功能,换行。
JBBREAK_C,IN_LOOP8C
MOVR1,#00H
CPLH_SCAN;换行取反
JNBH_SCAN,IN_LOOP8A
MOVA,#0C0H;设置LCD的第二行地址
ACALLWCOM
ACALLCLR_LINE;清第二行的内容
MOVA,#0C0H;设置LCD的第二行地址
ACALLWCOM
MOVLCD_X,#00H
JMPIN_LOOP8B
IN_LOOP8A:
MOVA,#80H;设置LCD的第一行地址
ACALLWCOM
ACALLCLR_LINE;清第一行的内容
MOVA,#80H;设置LCD的第一行地址
ACALLWCOM
MOVLCD_X,#00H
IN_LOOP8B:
JMPEXT1_END
IN_LOOP8C:
CLRBREAK_C
MOVR1,#00H
JMPEXT1_END
IN_LOOP9:
CJNEA,#05H,IN_LOOPA;F1帮助键功能
JBBREAK_C,IN_LOOP9A
MOVR1,#00H
ACALLSET_LCD3
ACALLSET_LCD4
JMPEXT1_END
IN_LOOP9A:
CLRBREAK_C
MOVR1,#00H
JMPEXT1_END
IN_LOOPA:
CJNEA,#76H,IN_LOOPB;ESC键功能
SETBRESET;置复位标志
JMPEXT1_END
IN_LOOPB:
CLREX1;关中断,准备显示
MOVR1,#00H
JBSHIFT,IN_LOOPBA
ACALLPS2KEY_D
CJNEA,#0FFH,IN_LOOPC;没有定义的键不显示
JMPIN_LOOPD
IN_LOOPBA:
ACALLPS2KEY_U
CJNEA,#0FFH,IN_LOOPC;没有定义的键不显示
JMPIN_LOOPD
IN_LOOPC:
ACALLCONV1
ACALLBEEP_BL
IN_LOOPD:
SETBEX1;显示完毕,开中断
EXT1_END:
RETI
;----------------------------------------------------------
;PS2键值表(下行键)
;----------------------------------------------------------
TABLE_D:
DB1CH,32H,21H,23H,24H,2BH,34H,33H,43H,3BH,42H
DB4BH,3AH,31H,44H,4DH,15H,2DH,1BH,2CH,3CH,2AH
DB1DH,22H,35H,1AH;A-Z
DB45H,16H,1EH,26H,25H,2EH
DB36H,3DH,3EH,46H;0-9
DB0EH,4EH,55H,5DH,29H,54H
DB5BH,4CH,52H,41H,49H,4AH;,71H
DB70H,69H,72H,7AH,6BH;右边数字键
DB73H,74H,6CH,75H,7DH;0-9
DB0FFH
;----------------------------------------------------------
;键值的ASCII码(下行键)
;----------------------------------------------------------
TABLE_D_ASC:
DB61H,62H,63H,64H,65H,66H,67H,68H,69H,6AH,6BH
DB6CH,6DH,6EH,6FH,70H,71H,72H,73H,74H,75H,76H
DB77H,78H,79H,7AH;A-Z
DB30H,31H,32H,33H,34H,35H
DB36H,37H,38H,39H;0-9
DB60H,2DH,3DH,0A4H,20H,5BH
DB5DH,3BH,27H,2CH,2EH,2FH;,2EH
DB30H,31H,32H,33H,34H,35H;右边数字键
DB36H,37H,38H,39H;0-9
DB0FFH
;**********************************************************
;上行键ASCII码表
;**********************************************************
TABLE_U_ASC:
DB41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH
DB4CH,4DH,4EH,4FH,50H,51H,52H,53H,54H,55H,56H
DB57H,58H,59H,5AH;A-Z
DB29H,21H,40H,23H,24H,25H,5EH,26H,2AH,28H;0-9上行键
DB5CH,5FH,2BH,7CH,20H,7BH,7DH,3AH,22H,3CH,3EH,3FH;,2EH
DB30H,31H,32H,33H,34H,35H;右边数字键
DB36H,37H,38H,39H;0-9
;--------------------------------------------------------
;LCD初始化显示子程序
;--------------------------------------------------------
SET_LCD1:
MOVDPTR,#LMESS1;指针指到显示信息1
MOVA,#1;显示在第一行
CALLLCD_PRINT
RET
SET_LCD2:
MOVDPTR,#LMESS2;指针指到显示信息2
MOVA,#2;显示在第二行
CALLLCD_PRINT
RET
LMESS1:
DB"PS2KEYBOARD",0;LCD第一行显示
LMESS2:
DB"DEMOPROGRAM",0;LCD第二行显示
SET_LCD3:
MOVDPTR,#LMESS3;指针指到显示信息1
MOVA,#1;显示在第一行
CALLLCD_PRINT
RET
SET_LCD4:
MOVDPTR,#LMESS4;指针指到显示信息2
MOVA,#2;显示在第二行
CALLLCD_PRINT
RET
LMESS3:
DB"WELCOMETO",0;LCD第一行显示
LMESS4:
DB"WWW.WILLAR.COM",0;LCD第二行显示
;--------------------------------------------------------
;LCD初始化子程序
;8位数据传送方式,双行显示,字形5*7点阵。
;开显示,显示光标并闪动。
;--------------------------------------------------------
INIT_LCD:
CALLDELAY5MS;延时15MS
CALLDELAY5MS
CALLDELAY5MS;等待LCD电源稳定
MOVA,#38H;双行显示,字形5*7点阵,8位数据。
CALLWCOM_NC;不检测忙信号
CALLDELAY5MS
MOVA,#38H;双行显示,字形5*7点阵
CALLWCOM_NC;不检测忙信号
CALLDELAY5MS
MOVA,#38H;双行显示,字形5*7点阵
CALLWCOM_NC;不检测忙信号
CALLDELAY5MS
MOVA,#38H;双行显示,字形5*7点阵
CALLWCOM;检测忙信号
CALLDELAY5MS
MOVA,#0FH;开显示,显示光标,光标闪烁。
CALLWCOM
CALLDELAY5MS
MOVA,#01H;清除LCD显示屏
CALLWCOM
CALLDELAY5MS
RET
;---------------------------------------------------------
;LCD显示子程序
;
;H_SCAN行扫描标志
;----------------------------------------------------------
CONV1:
JBH_SCAN,CONV3;
CONV2:
MOVB,LCD_X
ACALLLCDP1
INCLCD_X
MOVR0,LCD_X
CJNER0,#10H,CONV_END;一行显示完否?
SETBH_SCAN
MOVLCD_X,#00H;设置显示起始位置
JMPCONV_END
CONV3:
MOVB,LCD_X
ACALLLCDP2
INCLCD_X
MOVR0,LCD_X
CJNER0,#11H,CONV_END;一行显示完否
CLRH_SCAN
MOVA,#01H;清屏
ACALLWCOM
MOVLCD_X,#00H;设置显示起始位置
CONV_END:
RET
;--------------------------------------------------------
;清屏子程序
;--------------------------------------------------------
;CLR_DISP:
MOVA,#80H;设置LCD的第一行地址
CALLWCOM;写入命令
CALLCLR_LINE;清除该行字符数据
MOVA,#0C0H;设置LCD的第二行地址
CALLWCOM;写入命令
CALLCLR_LINE;清除该行字符数据
RET
;--------------------------------------------------------
;在LCD的第一行显示字符
;--------------------------------------------------------
LCDP1:
PUSHACC;入栈保护
MOVA,B;设置显示地址
ADDA,#80H;设置LCD的第二行地址
CALLWCOM;写入命令
POPACC;由堆栈取出A
CALLWDATA;写入数据
RET
;--------------------------------------------------------
;在LCD的第二行显示字符
;--------------------------------------------------------
LCDP2:
PUSHACC;入栈保护
MOVA,B;设置显示地址
ADDA,#0C0H;设置LCD的第二行地址
CALLWCOM;写入命令
POPACC;由堆栈取出A
CALLWDATA;写入数据
RET
;--------------------------------------------------------
;在LCD的第一行或第二行显示字符
;--------------------------------------------------------
LCD_PRINT:
CJNEA,#1,LINE2;判断是否为第一行
LINE1:
MOVA,#80H;设置LCD的第一行地址
CALLWCOM;写入命令
CALLCLR_LINE;清除该行字符数据
MOVA,#80H;设置LCD的第一行地址
CALLWCOM;写入命令
JMPFILL
LINE2:
MOVA,#0C0H;设置LCD的第二行地址
CALLWCOM;写入命令
CALLCLR_LINE;清除该行字符数据
MOVA,#0C0H;设置LCD的第二行地址
CALLWCOM
FILL:
CLRA;填入字符
MOVCA,@A+DPTR;由信息区取出字符
CJNEA,#00H,LC1;判断是否为结束码
RET
LC1:
CALLWDATA;写入数据
INCDPTR;指针加1
JMPFILL;继续填入字符
RET
;--------------------------------------------------------
;清除LCD指定行的字符
;“空白”的ASCII代码为20H。
;--------------------------------------------------------
CLR_LINE:
MOVR0,#24
CL1:
MOVA,#20H;''
CALLWDATA
DJNZR0,CL1
RET
;--------------------------------------------------------
;写控制指令子程序
;写控制指令到LCD
;传入参数:
ACC(要写入的指令)
;RS=L,RW=L,E=高脉冲,D0-D7=指令码。
;--------------------------------------------------------
WCOM:
ACALLCHECKBUSY
WCOM_NC:
MOVP0,A;写入指令
CLRLCD_EN
NOP
NOP
CLRLCD_RS
CLRLCD_RW
SETBLCD_EN
ACALLDEL_250
CLRLCD_EN
RET
;--------------------------------------------------------
;写数据子程序
;写显示数据到LCD
;传入参数:
ACC(要写入的数据)
;RS=H,RW=L,E=高脉冲,D0-D7=数据码。
;--------------------------------------------------------
WDATA:
ACALLCHECKBUSY
MOVP0,A;写入数据
CLRLCD_EN
NOP
NOP
SETBLCD_RS
CLRLCD_RW
SETBLCD_EN
CALLDEL_250
CLRLCD_EN
RET
DEL_250:
MOVR7,#125;延时250微秒
DJNZR7,$
RET
;--------------------------------------------------------
;检测LCD控制器忙碌状态
;正常读写操作之前必须检测LCD控制器状态
;BUSYFLAG(P0.7)=1时,忙,不能接收MCU送来的指令和数据。
;BUSYFLAG(P0.7)=0时,闲,能够接收MCU送来的指令和数据。
;读数据时
;RS=L,RW=H,E=H,输出:
D0-D7=数据
;-----------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 键盘 演示 程序