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

📄 发送,接收,运算,4x4键盘,i2c,.asm

📁 汇编语言常用程序,包括运算,掉电保存,按键,液晶显示,串口传送
💻 ASM
📖 第 1 页 / 共 3 页
字号:

	
;///////////////////////////////////////////
rS EQU P2. 0					;决定要传送的是命令还是数据			
RW EQU P3.7					   ;决定要读还是写,一般写的时候多.
E  EQU P2.1 					;时钟信号
D1         EQU     39H
D2         EQU      3EH
D3         EQU      3FH
D4         EQU      46H
D5         EQU      47H	 
;//////////////////////////////////////////// 
      vscl bit p3.4        ;时钟信号       
      vsda bit p3.5    ;数据信号
      sla equ  7dh     ;寻址字节存放单元                                                                                                                                
      numbyt equ 7eh   ;传送字节数据存放单元
      mtd equ 73h      ;发放数据的缓冲区
      mrd equ 73h      ;接收数据的缓冲区
      slaw equ 0a0h    ;写命令字
      slar equ 0a1h    ;读命令字
;...........................................
 org	0000h
 ajmp	init
 org	30h
init:
;...........................................
    ; call  DELAY_10MS
      ;call  DELAY_10MS
;...........................................  
       mov sp,#5fh ; /////////串口初始化
       mov tmod,#00100000b
       mov th1,#0fdh
       mov TL1,#0fdh
       orl pcon,#00000000b	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
       setb tr1
       mov scon,#01010000b  

       mov dptr,#tab			        ;将表头位置送入DPTR      
 main: 
;.....................................................................
disstart:
       		
       mov 3ah,#00h                ;将30H个位显示缓冲单元清零          
       mov 3bh,#00h                ;将31H十位显示缓冲单元清零          
       mov 3ch,#00h                ;将32H百位显示缓冲单元清零          
       mov 3dh,#00h                ;将33H千位显示缓冲单元清零   
       mov 50h,#00h                ;将50H个位显示缓冲单元清零          
       mov 51h,#00h                ;将51H十位显示缓冲单元清零          
       mov 52h,#00h                ;将52H百位显示缓冲单元清零          
       mov 53h,#00h                ;将53H千位显示缓冲单元清零 
       mov 55h,#00h                ;将50H个位显示缓冲单元清零          
       mov 56h,#00h                ;将51H十位显示缓冲单元清零          
       mov 57h,#00h                ;将52H百位显示缓冲单元清零          
       mov 58h,#00h                ;将53H千位显示缓冲单元清零
       mov 5ah,#00h                ;将50H个位显示缓冲单元清零          
       mov 5bh,#00h                ;将51H十位显示缓冲单元清零          
       mov 5ch,#00h                ;将52H百位显示缓冲单元清零          
       mov 5dh,#00h                ;将53H千位显示缓冲单元清零 
       mov 61h,#00h                ;将53H千位显示缓冲单元清零 
		
;.............................................................
;////////////////////////////////////////////
      mov mtd,#2bh     ;写I2C总线器件的地址
      mov sla,#slaw    ;写命令
      mov numbyt,#1    ;写字节
      lcall wrnbyt     ;调用写子程序
      mov sla,#slar    ;读命令
      mov numbyt,#4    ;读的字节数
      lcall rdnbyt     ;调用读字节程序

      mov 3ah,73h      ;缓冲区地址_V
      mov 3bh,74h 
      MOV 3cH,75H	
      MOV 3dH,76H	
     ;mov 50h,78H 
     ;mov 51h,79h 

;.....................................
/*mov 77h,#01h
mov 78h,#02h
mov 7ah,#03h
mov 79h,#04h*/
    /*  mov 50h,77h      ;缓冲区地址_i
      mov 51h,78h 
      MOV 52H,79H	
      MOV 53H,7aH*/
;.......................................
   
;***************************************
  ;   mov 3ah,#05h                ;将30H个位显示缓冲单元清零          
  ;   mov 3bh,#06h                ;将31H十位显示缓冲单元清零          
   ; mov 3ch,#04h                ;将32H百位显示缓冲单元清零          
     ;mov 3dh,#03h 
;.............................................................
		
   MOV p1,#00000001B      ;清屏
   ACALL ENABLE 
   MOV p1,#00000001B      ;清屏 
   ACALL ENABLE 
   MOV p1,#00111000B     ;设置16*2显示,5*7点阵8位数据口
   ACALL ENABLE 
   MOV p1,#00001101B     ;开显示,显示光标光标闪烁
   ACALL ENABLE 
  ;  MOV p1,#00000110B     ;读写一个字符地址指针加一,整屏不移动
  ; ACALL ENABLE 
   call delay1
  ;call delay1  
   mov  34h,#0Ah
   MOV p1,#083H           ;点
   ACALL ENABLE  
   MOV  A, 34h
   MOVC A, @A+DPTR
   CALL  write2 
;.....................
   mov  54h,#0Ah
   MOV p1,#08bH           ;点
   ACALL ENABLE  
   MOV  A, 54h
   MOVC A, @A+DPTR
   CALL  write2 
;.....................
   mov  59h,#0Ah
   MOV p1,#0c3H           ;点
   ACALL ENABLE  
   MOV  A, 59h
   MOVC A, @A+DPTR
   CALL  write2 
;.....................
   mov  5eh,#0Ah
   MOV p1,#0ccH           ;点
   ACALL ENABLE  
   MOV  A, 5eh
   MOVC A, @A+DPTR
   CALL  write2 
;.....................

   mov  34h,#0Dh
   MOV p1,#086H           ;第一行显示起始地址 V
   ACALL ENABLE 
   MOV A,34H
   MOVC A, @A+DPTR
   call write2
;......................
   mov  54h,#0Eh
   MOV p1,#08eH           ;第一行显示起始地址 A
   ACALL ENABLE 
   MOV A,54H
   MOVC A, @A+DPTR
   call write2
;.....................
   mov  59h,#0Eh
   MOV p1,#0c6H           ;第一行显示起始地址 A
   ACALL ENABLE 
   MOV A,59H
   MOVC A, @A+DPTR
   call write2
;.....................
   MOV 5eh,#0cH
   MOV p1,#0ceH           ;第一行显示起始地址 w
   ACALL ENABLE 
   MOV A,5eH
   MOVC A, @A+DPTR
   call write2
;.....................
   setb p2.4
   CALL DISPLAYv
   call DISPLAYi
	
   nop
   nop
;	call  DELAY_10MS
  ; call  DELAY_10MS
  nop
  nop
  setb p2.2
  call 	DISPLAY_read_i
  call  DISPLAY_to_count_w
  call key
  clr p2.4
  ajmp v
;..............................................................................
key_start:
  cpl p2.4
 ;call  from_two_DATE_i
  ; call  DISPLAY_to_count_w
 ; call 	DISPLAY_read_i
  call from_two
 ; call from_two_2
  ;call test_loop
  call to_count_v  
 ; call nmul_to_count_w
  jb p2.2,chicke_keystoke 
  setb p2.4
  call 	 key              	;调用键盘扫描程序
  jmp v
chicke_keystoke:  
  jmp key_start
;..........................................
v:

   cjne a,#0bh,chick_i    ; 是否有按v,有,继续,无,检查I
   lcall key
loop_number1:
   cjne a,#0dh,fore_v 
   jmp key_start      ;是否有按ESC,是,退出,不是,送数字到千位
fore_v:
;........................
/*
   MOV p1,#00111000B     ;设置16*2显示,5*7点阵8位数据口
   ACALL ENABLE 
   MOV p1,#00001101B  */
;..........................
   mov 3ah,a   ;千位
	clr p2.4
   call  DISPLAYv_fore  ;  送千位显示
   lcall key
   cjne a,#0dh,three_v
   jmp key_start      ;是否有按ESC,是,退出,不是,送数字到百位
three_v:
   mov 3bh,a   ;百位
   call  DISPLAYv_three  ;  送百位显示
   lcall key
   cjne a,#0dh,two_v
   jmp key_start      ;是否有按ESC,是,退出,不是,送数字到十位
two_v:
   mov 3ch,a   ;十位
   call  DISPLAYv_two  ;  送十位显示
   lcall key
   cjne a,#0dh,one_v
   jmp key_start      ;是否有按ESC,是,退出,不是,送数字到个位
one_v:
   mov 3dh,a   ;个位
   call  DISPLAYv_one  ;  送个位显示
	
   lcall key
   cjne a,#0dh,ok_v
   jmp  key_start     ;是否有按ESC,是,退出,不是,向下
ok_v:
   cjne a,#0ah,loop_number1  ;是否有按Ok,是,发送,不是,循环千位
   setb p2.4
;///////////////////////////////
    mov mtd,#2bh  ;写器件地址            
    mov 74h,3aH 
    mov 75h,3bh 
    MOV 76H,3cH	
    MOV 77H,3dH
   /* mov 78h,50H 
    mov 79h,51h 
    MOV 7aH,52H	
    MOV 7bH,53H*/
    mov numbyt,#5  ;读的字节数
    mov sla,#slaw  ;写命令
    lcall wrnbyt  ;调用写子程序
;///////////////////////////////
    call to_count_v
    call to_v
    jmp key_start 
;.................................................................................  
       
chick_i:
   cjne a,#0ch,key_start   ; 是否有按I,没退出,循环检查按键,有,向下继续
   lcall key
loop_number2: 
   cjne a,#0dh,fore_i
   jmp key_start           ;是否有按ESC,是,退出,不是,送数字到千位
fore_i:
   mov 50h,a   ;千位	
   call  DISPLAYi_fore  ;  送千位显示
   lcall key
   cjne a,#0dh,three_i 
   jmp  key_start          ;是否有按ESC,是,退出,不是,送数字到百位
three_i:
   mov 51h,a   ;百位
   call  DISPLAYi_three  ;  送百位显示
   lcall key
   cjne a,#0dh,two_i
   jmp key_start           ;是否有按ESC,是,退出,不是,送数字到百位
two_i:
   mov 52h,a   ;十位
   call  DISPLAYi_two  ;  送十位显示
   lcall key
   cjne a,#0dh,one_i
   jmp key_start           ;是否有按ESC,是,退出,不是,送数字到百位
one_i:
   mov 53h,a   ;个位	
   call  DISPLAYi_one  ;  送个位显示
   lcall key
   cjne a,#0dh,ok_i
   jmp key_start            ;是否有按ESC,是,退出,不是,向下
ok_i:
   cjne a,#0ah,loop_number2  ;是否有按Ok,是,送I2C保存和显示,不是,循环千位
  
   call to_count_i
   call to_i
   jmp key_start 

;.................................................................................
KEY:
     
     LCALL KS                           ;调用检测按键子程序
     JNZ K1                             ;有键按下继续,累加器非0转移
     LCALL DELAY2                       ;无键按下调用延时去抖动程序

     AJMP KEY                          ;返回继续检测有无按键按下          
K1:  LCALL DELAY2                  
     LCALL DELAY2                       ;有键按下继续延时去抖动     
     LCALL KS                           ;再一次调用检测按键程序
     JNZ K2                             ;确认有按下进行下一步
     JMP KEY                           ;无键按下返回继续检测
K2:	
     MOV R7,#0EFH                    ;将扫描值送入 R7暂存 
     MOV R4,#00H                        ;将第一列的列值00H送入R4暂存,R4用于存放列值。
K3:	
     MOV P0,R7                      ;将R7的值送入P1口
L6:	
     JB P0.0,L1                      ;P1.0等于1跳转到L1
     MOV A,#00H                         ;将第一行的行值00H送入ACC
     AJMP LK                            ;跳转到键值处理程序
L1:	
     JB P0.1,L2                      ;P1.1等于1跳转到L2
     MOV A,#04H                         ;将第二行的行值送入ACC
     AJMP LK                            ;跳转到键值理程序进行键值处理
L2: 
     JB P0.2,L3                          ;P1.2等于1跳转到L3
     MOV A,#08H                         ;将第三行的行值送入ACC
     AJMP LK                            ;跳转到键值处理程序
L3:	
     JB P0.3,NEXT                    ;P1.3等于1跳转到NEXT处
     MOV A,#0cH                         ;将第四行的行值送入ACC
LK:	
     ADD A,R4                        ;行值与列值相加后的键值送入A
     PUSH ACC                           ;将A中的值送入堆栈暂存
K4:  LCALL DELAY2                       ;调用延时去抖动程序
     LCALL KS                           ;调用按键检测程序
     JNZ K4                             ;按键没有松开继续返回检测
     POP ACC                            ;将堆栈的值送入ACC
     RET
     
NEXT:
    INC  R4                             ;将列值加一
    MOV A,R7                            ;将R7的值送入A
    JNB ACC.7,KEY                       ;扫描完成跳至KEY处进行下一回合的扫描,直接寻址为0转移
    RL A                                ;扫描未完成将A中的值右移一位进行下一列的扫描
    MOV R7,A                            ;将ACC的值送入R7暂存
    AJMP K3                             ;跳转到K3继续
KS:  
     MOV P0,#0FH                        ;将P1口高四位置0低四位值1
     MOV A,P0                           ;读P1口
     XRL A,#0FH                         ;将A中的值与A中的值相异或,相异为1,相同为0
     RET                                ;子程序返回
;..................................................................................................
DISPLAYv:
       MOV p1,#081H           ;千位
       ACALL ENABLE  
       MOV A,3aH
       MOVC A, @A+DPTR
       CALL  write2
;.....................................................................................................
       MOV p1,#082H           ;百位
       ACALL ENABLE  
       MOV A,3bH
       MOVC A, @A+DPTR
       CALL  write2
;......................................................
       MOV p1,#084H           ;十位
       ACALL ENABLE 
       MOV A,3cH
       MOVC A, @A+DPTR
       CALL  write2   			     
;....................................................... 
       MOV p1,#085H           ;个位
       ACALL ENABLE  
       MOV A,3dH
       MOVC A, @A+DPTR
       CALL  write2
    	 ret
;///////////////////////////////////////////////////////
;.......................................................
DISPLAYv_fore:
       MOV p1,#081H           ;千位
       ACALL ENABLE  
       MOV A,3aH
       MOVC A, @A+DPTR
       CALL  write2
		 ret
;.........................................................
DISPLAYv_three:
       MOV p1,#082H           ;百位
       ACALL ENABLE  
       MOV A,3bH
       MOVC A, @A+DPTR
       CALL  write2
		 ret
;..........................................................    	        
DISPLAYv_two: 
       MOV p1,#084H           ;十位
       ACALL ENABLE 
       MOV A,3cH
       MOVC A, @A+DPTR
       CALL  write2
		 ret   			     
;.............................................
DISPLAYv_one: 
       MOV p1,#085H           ;个位
       ACALL ENABLE  
       MOV A,3dH
       MOVC A, @A+DPTR
       CALL  write2	    
       ret
;................................................       
;  //////////////////////////////////发送v区 
to_v:   
     /*  clr c                 ;设定电压,由于硬件放大2倍,所以发送时候要/2,用RRC指令一次,即/2
       mov 78h,66h
		 mov a,78h
		 rrc a
		 mov 78h,a
		 mov 79h,67h
       mov a,79h
		 rrc a
		 mov 79h,a
		 clr c*/
;............................   
       MOV A,#0a9h              ; 发送通信头a9
       MOV SBUF,a
loop18:
       jbc ti,next18
       ljmp loop18
next18:     
    ;  ANL A,#0FH		 
        MOV A,#06H              ; 发送字节数量06
        MOV SBUF,a
loop19:
       jbc ti,next19
       ljmp loop19
next19:
        MOV A,#01H              ; 发送电压标识01
        MOV SBUF,a
loop192:
       jbc ti,next192
       ljmp loop192
next192:
       
;.............................   
       MOV A,66h             ; 发送电压实际值
       MOV SBUF,a
loop20:
       jbc ti,next20
       ljmp loop20
next20:     
    ;  ANL A,#0FH		 
        MOV A,67H    
        MOV SBUF,a
loop21:
       jbc ti,next21
       ljmp loop21
next21:
;*************************************

⌨️ 快捷键说明

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