9.asm
Upload User: hongrida
Upload Date: 2022-08-07
Package Size: 154k
Code Size: 6k
Category:

SCM

Development Platform:

Asm

  1.            RELAY  EQU  P1.3
  2.            RS    EQU  P2.0
  3.            RW    EQU  P2.1
  4.            EN    EQU  P2.2
  5.            X     EQU  26H       ;LCD 地址变量
  6.            ORG  0000H
  7.            JMP  MAIN
  8.            ORG 000BH
  9.            LJMP BREAK 
  10.            ORG 0030H
  11. MAIN:      MOV  SP,#60H
  12.            MOV TMOD,#01H
  13.            CLR   EN
  14.            CALL  SET_LCD
  15.            CALL  MENU1
  16. LOOP0:
  17.            MOV  P1,#0F0H
  18.            MOV  A,P1
  19.            CJNE  A,#0F0H,LOOP1  ;有键按下转LOOP1
  20.            JMP   LOOP0
  21. LOOP1:
  22.            CALL  KEY_IN
  23.            CALL START
  24.            MOV P1,#0F0H
  25.            MOV A,P1
  26.            CJNE A,#0F0H,CONV
  27.            CLR EA
  28.    SETB P3.7
  29.            JMP  LOOP0
  30. CONV:
  31.           MOV   X,#11        ;设置显示起始位置
  32.           MOV   A,R3
  33.           
  34.           ADD A,#01H
  35.           PUSH  ACC
  36.           CLR   C
  37.           SUBB  A,#08H        ;减8
  38.           POP   ACC
  39.           JC    ASCII1        ;该数小于8,转ASCII1
  40.           SUBB   A,#07H
  41.           PUSH ACC
  42.           CLR C
  43.           SUBB A,#08H
  44.           POP ACC
  45.           JC ASCII1
  46.           SUBB A,#07H       
  47. ASCII1:   ADD   A,#30H        ;小于10的数加上30H
  48.           INC   X
  49.           MOV   B,X
  50.           CALL  LCDP2
  51.           JMP LOOP0
  52.    
  53.    
  54. START:     SETB EA
  55.            SETB TR0
  56.            SETB ET0
  57.            CLR EA
  58.            MOV A,R3
  59.            RL A
  60.            MOV DPTR,#TABLE
  61.            MOVC A,@A+DPTR
  62.            MOV TH0,A
  63.            MOV 21H,A
  64.            MOV A,R3
  65.            RL A
  66.            INC A
  67.            MOVC A,@A+DPTR
  68.            MOV TL0,A
  69.            MOV 20H,A
  70.            SETB EA
  71.            RET 
  72. KEY_IN:    MOV  P1,#0F0H
  73.            MOV  A,P1
  74.            ANL  A,#0F0H
  75.            MOV  B,A
  76.            MOV  P1,#0FH
  77.            MOV  A,P1
  78.            ANL  A,#0FH
  79.            ORL  A,B
  80.            CJNE  A,#0FFH,KEY_IN1
  81.            RET
  82. KEY_IN1:   MOV  B,A
  83.            MOV  DPTR,#KEYTABLE
  84.            MOV  R3,#0FFH
  85. KEY_IN2:   INC  R3
  86.            MOV  A,R3
  87.            MOVC  A,@A+DPTR
  88.            CJNE  A,B,KEY_IN3
  89.            MOV  A,R3
  90.            MOV  R5,#08H
  91.            CALL  DELAY
  92.            RET
  93. KEY_IN3:   CJNE  A,#0FFH,KEY_IN2
  94.            RET   
  95. SET_LCD:
  96.           CLR  EN
  97.           CALL  INIT_LCD     ;初始化 LCD
  98.           CALL  DELAY1
  99.           MOV  DPTR,#INFO1   ;指针指到显示信息1
  100.           MOV  A,#1          ;显示在第一行
  101.           CALL  LCD_SHOW
  102.           MOV  DPTR,#INFO2   ;指针指到显示信息2
  103.           MOV  A,#2          ;显示在第二行
  104.           CALL  LCD_SHOW
  105.           RET
  106. INIT_LCD:                 ;8位I/O控制 LCD 接口初始化
  107.           MOV  A,#38H     ;双列显示,字形5*7点阵
  108.           CALL  WCOM
  109.           CALL  DELAY1
  110.           MOV  A,#38H     ;双列显示,字形5*7点阵
  111.           CALL  WCOM
  112.           CALL  DELAY1
  113.           MOV  A,#38H     ;双列显示,字形5*7点阵
  114.           CALL  WCOM
  115.           CALL  DELAY1
  116.           MOV  A,#0CH     ;开显示,关光标,
  117.           CALL  WCOM
  118.           CALL  DELAY1
  119.           MOV  A,#01H     ;清除 LCD 显示屏
  120.           CALL  WCOM
  121.           CALL  DELAY1
  122.           RET
  123. LCD_SHOW:           ;在LCD的第一行或第二行显示信息字符
  124.           CJNE  A,#1,LINE2  ;判断是否为第一行
  125.   LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
  126.           CALL  WCOM        ;写入命令
  127.           CALL  CLR_LINE    ;清除该行字符数据
  128.           MOV  A,#80H       ;设置 LCD 的第一行地址
  129.           CALL  WCOM        ;写入命令
  130.           JMP  FILL
  131.   LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
  132.           CALL  WCOM        ;写入命令
  133.           CALL  CLR_LINE    ;清除该行字符数据
  134.           MOV  A,#0C0H      ;设置 LCD 的第二行地址
  135.           CALL  WCOM
  136.   FILL:   CLR  A            ;填入字符
  137.           MOVC  A,@A+DPTR   ;由信息区取出字符
  138.           CJNE  A,#0,LC1    ;判断是否为结束码
  139.           RET
  140.   
  141.   LC1:    CALL  WDATA       ;写入数据
  142.           INC  DPTR         ;指针加1
  143.           JMP  FILL         ;继续填入字符
  144.           RET
  145. CLR_LINE:                  ;清除该行 LCD 的字符
  146.           MOV  R0,#24
  147.    CL1:   MOV  A,#' '
  148.           CALL  WDATA
  149.           DJNZ  R0,CL1
  150.           RET
  151. MENU1:                      ;LCD 显示工作菜单信息
  152.          MOV   DPTR,#MENU2
  153.          MOV   A,#1         ;在第一行显示信息
  154.          CALL  LCD_SHOW
  155.          RET
  156. MENU2:  DB  "   WELCOME   ",0
  157. INFO1:  DB  "                ",0  ;LCD 第一行显示信息
  158. INFO2:  DB  "Music site:  ",0  ;LCD 第二行显示信息
  159. WCOM:                      ;写指令使能
  160.           MOV  P0,A
  161.           CLR RS           ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
  162.           CLR RW
  163.           SETB EN
  164.           CALL  DELAY0
  165.           CLR EN
  166.           RET
  167. WDATA:                    ;写数据使能
  168.           MOV  P0,A
  169.           SETB  RS        ;RS=H,RW=L,D0-D7=数据,E=高脉冲
  170.           CLR   RW
  171.           SETB  EN
  172.           CALL  DELAY0
  173.           CLR   EN
  174.           RET
  175. DELAY0:   MOV  R7,#250      ;延时500微秒
  176.           DJNZ  R7,$
  177.           RET
  178. LCDP2:                    ;在LCD的第二行显示字符
  179.          PUSH  ACC        ;
  180.          MOV  A,B         ;设置显示地址
  181.          ADD  A,#0C0H     ;设置LCD的第二行地址
  182.          CALL  WCOM       ;写入命令
  183.          POP  ACC         ;由堆栈取出A
  184.          CALL  WDATA      ;写入数据
  185.          RET
  186. DELAY1:                    ;延时5MS
  187.          MOV  R6,#25
  188.   D2:    MOV  R7,#100
  189.          DJNZ  R7,$
  190.          DJNZ  R6,D2
  191.          RET
  192. DELAY:                    ;延时R5×10MS
  193.          MOV  R6,#50
  194.   D1:    MOV  R7,#100
  195.          DJNZ  R7,$
  196.          DJNZ  R6,D1
  197.          DJNZ  R5,DELAY
  198.          RET
  199. BREAK:   PUSH ACC
  200.          PUSH PSW
  201.          MOV TL0,20H
  202.          MOV TH0,21H
  203.          CPL P3.7
  204.          POP PSW
  205.          POP ACC
  206.          RETI 
  207.        
  208. KEYTABLE:
  209.     DB  0EEH,0EDH,0EBH,0E7H,0DEH  ;0,1,2,3,4,  顺序码
  210.     DB  0DDH,0DBH,0D7H,0BEH,0BDH  ;5,6,7,8,9,
  211.     DB  0BBH,0B7H,07EH,07DH,07BH  ;A,B,C,D,E,
  212.     DB  077H,0FFH                 ;F      0FF为结束码
  213. TABLE: DW 63628,63835,64021,64103,64260,64400,64524
  214.        DW 64580,64684,64777,64820,64898,64968,65030
  215.        DW 65058,65110
  216. END