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

📄 ps2.asm

📁 PS2键盘演示程序,是51单片机编写的
💻 ASM
📖 第 1 页 / 共 2 页
字号:
DB 4CH,4DH,4EH,4FH,50H,51H,52H,53H,54H,55H,56H
DB 57H,58H,59H,5AH   ;A-Z

DB  29H,21H,40H,23H,24H,25H,5EH,26H,2AH,28H  ;0-9上行键

DB  5CH,5FH,2BH,7CH,20H,7BH,7DH,3AH,22H,3CH,3EH,3FH ;,2EH

DB  30H,31H,32H,33H,34H,35H  ;右边数字键
DB  36H,37H,38H,39H  ;0-9
;--------------------------------------------------------
;LCD初始化显示子程序
;--------------------------------------------------------
SET_LCD1:
          MOV  DPTR,#LMESS1   ;指针指到显示信息1
          MOV  A,#1           ;显示在第一行
          CALL  LCD_PRINT
          RET
SET_LCD2:
          MOV  DPTR,#LMESS2   ;指针指到显示信息2
          MOV  A,#2           ;显示在第二行
          CALL  LCD_PRINT
          RET
LMESS1:
          DB  "  PS2 KEYBOARD  ",0  ;LCD 第一行显示
LMESS2:
          DB  "  DEMO PROGRAM  ",0  ;LCD 第二行显示

SET_LCD3:
          MOV  DPTR,#LMESS3   ;指针指到显示信息1
          MOV  A,#1           ;显示在第一行
          CALL  LCD_PRINT
          RET
SET_LCD4:
          MOV  DPTR,#LMESS4   ;指针指到显示信息2
          MOV  A,#2           ;显示在第二行
          CALL  LCD_PRINT
          RET
LMESS3:
          DB  "   WELCOME TO   ",0  ;LCD 第一行显示
LMESS4:
          DB  " WWW.WILLAR.COM ",0  ;LCD 第二行显示
;--------------------------------------------------------
;LCD 初始化子程序

;8位数据传送方式,双行显示,字形5*7点阵。
;开显示,显示光标并闪动。
;--------------------------------------------------------
INIT_LCD:
          CALL    DELAY5MS   ;延时15MS
          CALL    DELAY5MS
          CALL    DELAY5MS   ;等待LCD电源稳定
          MOV  A,#38H        ;双行显示,字形5*7点阵,8位数据。
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS
          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS
          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS

          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM         ;检测忙信号
          CALL  DELAY5MS
          MOV  A,#0FH        ;开显示,显示光标,光标闪烁。
          CALL  WCOM
          CALL  DELAY5MS
          MOV  A,#01H        ;清除 LCD 显示屏
          CALL  WCOM
          CALL  DELAY5MS
          RET
; ---------------------------------------------------------
;LCD 显示子程序
;
;H_SCAN 行扫描标志
;----------------------------------------------------------
CONV1:
          JB  H_SCAN,CONV3       ;
CONV2:
          MOV   B,LCD_X
          ACALL  LCDP1
          INC  LCD_X
          MOV  R0,LCD_X
          CJNE  R0,#10H,CONV_END    ;一行显示完否?
          SETB  H_SCAN
          MOV   LCD_X,#00H          ;设置显示起始位置
          JMP  CONV_END
CONV3:
          MOV   B,LCD_X
          ACALL  LCDP2
          INC  LCD_X
          MOV  R0,LCD_X
          CJNE  R0,#11H,CONV_END    ;一行显示完否
          CLR  H_SCAN
          MOV  A,#01H               ;清屏
          ACALL  WCOM
          MOV   LCD_X,#00H          ;设置显示起始位置
CONV_END:
          RET
;--------------------------------------------------------
;清屏子程序
;--------------------------------------------------------
;CLR_DISP:
          MOV  A,#80H          ;设置 LCD 的第一行地址
          CALL  WCOM           ;写入命令
          CALL  CLR_LINE       ;清除该行字符数据
          MOV  A,#0C0H         ;设置 LCD 的第二行地址
          CALL  WCOM           ;写入命令
          CALL  CLR_LINE       ;清除该行字符数据
          RET
;--------------------------------------------------------
;在LCD的第一行显示字符
;--------------------------------------------------------
LCDP1:
         PUSH  ACC          ;入栈保护
         MOV  A,B           ;设置显示地址
         ADD  A,#80H       ;设置LCD的第二行地址
         CALL  WCOM         ;写入命令
         POP  ACC           ;由堆栈取出A
         CALL  WDATA        ;写入数据
         RET

;--------------------------------------------------------
;在LCD的第二行显示字符
;--------------------------------------------------------
LCDP2:
         PUSH  ACC          ;入栈保护
         MOV  A,B           ;设置显示地址
         ADD  A,#0C0H       ;设置LCD的第二行地址
         CALL  WCOM         ;写入命令
         POP  ACC           ;由堆栈取出A
         CALL  WDATA        ;写入数据
         RET
;--------------------------------------------------------
;在LCD的第一行或第二行显示字符
;--------------------------------------------------------
LCD_PRINT:
          CJNE  A,#1,LINE2  ;判断是否为第一行
  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
          CALL  WCOM        ;写入命令
          CALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#80H       ;设置 LCD 的第一行地址
          CALL  WCOM        ;写入命令
          JMP  FILL
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM        ;写入命令
          CALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM
  FILL:   CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由信息区取出字符
          CJNE  A,#00H,LC1    ;判断是否为结束码
          RET
  LC1:    CALL  WDATA       ;写入数据
          INC  DPTR         ;指针加1
          JMP  FILL         ;继续填入字符
          RET
;--------------------------------------------------------
;清除 LCD 指定行的字符
;“空白”的ASCII代码为20H。
;--------------------------------------------------------
CLR_LINE:
          MOV  R0,#24
   CL1:   MOV  A,#20H       ;' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET
;--------------------------------------------------------
;写控制指令子程序

;写控制指令到LCD
;传入参数: ACC(要写入的指令)
;RS=L,RW=L,E=高脉冲,D0-D7=指令码 。
;--------------------------------------------------------
WCOM:
          ACALL  CHECKBUSY
WCOM_NC:
          MOV  P0,A         ;写入指令
          CLR  LCD_EN
          NOP
          NOP
          CLR LCD_RS
          CLR LCD_RW
          SETB LCD_EN
          ACALL DEL_250
          CLR  LCD_EN
          RET
;--------------------------------------------------------
;写数据子程序

;写显示数据到LCD
;传入参数: ACC(要写入的数据)
;RS=H,RW=L,E=高脉冲,D0-D7=数据码 。
;--------------------------------------------------------
WDATA:
          ACALL  CHECKBUSY
          MOV  P0,A         ;写入数据
          CLR  LCD_EN
          NOP
          NOP
          SETB  LCD_RS
          CLR   LCD_RW
          SETB  LCD_EN
          CALL  DEL_250
          CLR  LCD_EN
          RET

 DEL_250:
          MOV  R7,#125      ;延时250微秒
          DJNZ  R7,$
          RET
;--------------------------------------------------------
;检测LCD控制器忙碌状态

;正常读写操作之前必须检测LCD控制器状态
;BUSY FLAG(P0.7)=1时,忙,不能接收MCU送来的指令和数据。
;BUSY FLAG(P0.7)=0时,闲,能够接收MCU送来的指令和数据。
;读数据时
;RS=L,RW=H,E=H,输出:D0-D7=数据
;--------------------------------------------------------
CHECKBUSY:
          PUSH  ACC
          MOV  P0,#0FFH           ;置P0口为输入状态
          CLR  LCD_EN
          NOP
          NOP
          SETB  LCD_RW
          CLR  LCD_RS
          SETB  LCD_EN
BUSYLOOP:
          NOP
          JB P0.7,BUSYLOOP
          CLR  LCD_EN
          POP  ACC
          RET
;---------------------------------------------------------
;延时50MS子程序
;---------------------------------------------------------
DELAY50MS:
  	  MOV  R6,#100
DEL2:     MOV  R7,#250
          DJNZ  R7,$
          DJNZ  R6,DEL2
          RET
;--------------------------------------------------------
;延时5MS子程序
;--------------------------------------------------------
DELAY5MS:
         MOV  R6,#25
DEL3:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DEL3
         RET
;===================================================
;
;蜂鸣器响一声子程序
;
;===================================================
BEEP_BL:
          MOV  R6,#100
  BL1:    CALL  DEX1
          CPL  BEEP          ;P3.7取反
          DJNZ  R6,BL1
          MOV  R5,#8        ;修改此参数可以调整键盘响应速度
          CALL  DELAY
          RET
 DEX1:    MOV  R7,#180
 DEX2:    NOP
          DJNZ  R7,DEX2
          RET
DELAY:                       ;延时R5*20MS
          MOV  R6,#50
  D1:     MOV  R7,#200
          DJNZ  R7,$
          DJNZ  R6,D1
          DJNZ  R5,DELAY
          RET
;----------------------------------------------------------
         END

⌨️ 快捷键说明

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