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

📄 ktest.asm

📁 这是一个基于485的矩阵键盘程序源码
💻 ASM
字号:
;*********************************************************************
;*                         收费机主程序                              *
;*********************************************************************
;使用W78E54单片机,晶振22.1184MHZ
;使用用片机看门狗,喂狗时间约2.5S,应在2S内喂狗一次
;串行通信波特率采用标准的9600bps
;单次消费数据4个,循环保存在500当中
;单次充值数据保存在500中,4个循环保存
;累计消费金额1个保存在500当中,累计金额超过999999重新开始计数
;累计充值金额1个保存在500当中,累计金额超过999999重新开始计数
;错误类型定义:
;             01:无连接
;             02:超时
;             03:不允许消费
INCLUDE        "EQU.ASM"
;--------------------------------------------------------------------
ORG     00H
        LJMP    MAIN                 ;主程序
ORG     0BH
        LJMP    PTI                  ;定时中断0
ORG     23H
        LJMP    PSI                  ;串行中断
ORG     30H
MAIN:
        LCALL   D100MS
;----------------初始化RAM
        MOV     R0,A
MAIN_01:
        MOV     @R0,#0
        DJNZ    R0,MAIN_01
        MOV     AUXR,#02H               ;定时器工作在普通51单片机模式,扩展RAM无效
        MOV     SP,#0D0H                ;初始化堆栈
;----------------系统初始化
        LCALL   INITSYS                 ;系统初始化
;----------------清显示缓冲区
        LCALL   CDISBUF
;----------------充值按钮检测
        LCALL   READMAC
        LCALL   CHECKMAC
MAIN_04:
        MOV     WDT,#3FH
        LCALL   DISNUM
        LCALL   NET
        LCALL   KEYCL
        JB      FKEYA,MAIN_05
        SJMP    MAIN_04
MAIN_05:                ;有卡时就不再响应按键,至到把上一个按键值取走
        MOV     WDT,#3FH
        JNB     FKEY,MAIN_04
        LCALL   NET
        SJMP    MAIN_05
;--------------------------------------------------------------------
;键处理
;按键具有充值与发卡两个功能
;此部分为判断是发卡还是充值
;充值为输入"*" 后输入金额,按"#"确认
;发卡为输入"**"后输入金额,按"#"确认
KEYCL:
        JBC    FKEY,KEYCL_01
        RET
KEYCL_01:
        MOV    A,KEY_BAK
        CJNE   A,KEYAL,KEYCL_001
        SJMP   KEYCL_002
KEYCL_001:
        MOV    NUMDIS,#0
KEYCL_002:
        MOV    KEYAL,KEY_BAK
        CJNE   A,#KEY_ESC,KEYCL_02   ;第一个键非ESC键即退出
        MOV    KEYSEND,#0EH          ;
        SJMP   KEYCL_RET
KEYCL_02:
        CJNE   A,#KEY_0,KEYCL_03
        MOV    KEYSEND,#30H
        SJMP   KEYCL_RET
KEYCL_03:
        CJNE   A,#KEY_1,KEYCL_04
        MOV    KEYSEND,#31H
        SJMP   KEYCL_RET
KEYCL_04:
        CJNE   A,#KEY_2,KEYCL_05
        MOV    KEYSEND,#32H
        SJMP   KEYCL_RET
KEYCL_05:
        CJNE   A,#KEY_3,KEYCL_06
        MOV    KEYSEND,#33H
        SJMP   KEYCL_RET
KEYCL_06:
        CJNE   A,#KEY_4,KEYCL_07
        MOV    KEYSEND,#34H
        SJMP   KEYCL_RET
KEYCL_07:
        CJNE   A,#KEY_5,KEYCL_08
        MOV    KEYSEND,#35H
        SJMP   KEYCL_RET
KEYCL_08:
        CJNE   A,#KEY_6,KEYCL_09
        MOV    KEYSEND,#36H
        SJMP   KEYCL_RET
KEYCL_09:
        CJNE   A,#KEY_7,KEYCL_10
        MOV    KEYSEND,#37H
        SJMP   KEYCL_RET
KEYCL_10:
        CJNE   A,#KEY_8,KEYCL_11
        MOV    KEYSEND,#38H
        SJMP   KEYCL_RET
KEYCL_11:
        CJNE   A,#KEY_9,KEYCL_12
        MOV    KEYSEND,#39H
        SJMP   KEYCL_RET
KEYCL_12:
        CJNE   A,#KEY_EN,KEYCL_13
        MOV    KEYSEND,#0FH
        SJMP   KEYCL_RET
KEYCL_13:
        CJNE   A,#0BH,KEYCL_14
        MOV    KEYSEND,#0AH
        SJMP   KEYCL_RET
KEYCL_14:
        CJNE   A,#0AH,KEYCL_15
        MOV    KEYSEND,#0BH
        SJMP   KEYCL_RET
KEYCL_15:
        CJNE   A,#09H,KEYCL_16
        MOV    KEYSEND,#0CH
        SJMP   KEYCL_RET
KEYCL_16:
        CJNE   A,#08H,KEYCL_RET
        MOV    KEYSEND,#0DH
KEYCL_RET:
        SETB   FKEYA
        RET
;------------------------------------------
;显示输入数字
DISNUM:
        MOV    R0,#DIS_BUF
        MOV    @R0,#0AH
        INC    R0
        MOV    @R0,#0AH
        INC    R0
        MOV    @R0,#0AH
        INC    R0
        MOV    @R0,#0AH
        INC    R0
        MOV    A,NUMDIS
        MOV    B,#64H
        DIV    AB
        MOV    A,B
        MOV    NUMDIS,A
        MOV    B,#0AH
        DIV    AB
        MOV    @R0,A
        INC    R0
        MOV    @R0,B
        RET
;------------------------------------------
;系统初始化
INITSYS:
        CLR    W_ALE                    ;首先初始化IO端口与标志
        CLR    D_ALE
        CLR    U4_ALE

        SETB   WORKLED                  ;刷卡指示灯
        MOV    KEY_JSQ,#FD_JSZ          ;键盘防抖
        MOV    DIS_P,#7FH               ;动态扫描位指针
        MOV    JSQ_X,#4                 ;分频计数器

        MOV    WDT,#3FH                 ;看门狗初始化与喂狗指令
        MOV    JSQ_SPEAK,#40
        CLR    SPEAK
        MOV    R7,#8
        MOV    R0,#DIS_BUF
INITSYS_01:
        MOV    @R0,#0FH                 ;初始化显示缓冲区
        INC    R0
        DJNZ   R7,INITSYS_01
        SETB   WORKLED
        SETB   SYSLED

        MOV    TMOD,#21H                ;T0 工作方式1,16位定时器
                                        ;T1 工作方式2,重装初值的8位定时器
        MOV    TL0,#00H
        MOV    TH0,#0EEH                ;T0 2.5ms 中断一次 65536-0.0025*22118400/12=0EE00H
        SETB   ET0
        MOV    TH1,#250                 ;串行中断设置
        MOV    TL1,#250                 ;9600
        MOV    SCON,#50H                ;工作方式1,异步通讯8个数据位1个停止位,允许接受.
        ANL    PCON,#7FH                ;SMOD=0
        SETB   TR1
        SETB   TR0
        SETB   ES
        SETB   PS
        SETB   EA
        RET
;======================================
;          数据传递
;入口:R0=被传送数据地址
;     R1=传送数据地址
;     R2=传送字节数
;======================================
MEM_COPYA:
         MOV A,@R0
         MOV @R1,A
         INC R0
         INC R1
         DJNZ R2,MEM_COPYA
         RET
MEM_COPYB:
         MOV A,@R0
         MOV @R1,A
         DEC R0
         DEC R1
         DJNZ R2,MEM_COPYB
         RET
;======================================
;          将ROM数据装入RAM区
;入口:R0=RAM地址
;     DPTR=ROM地址
;     R2=传送字节数
;======================================
TO_MEM:  CLR A
         MOVC A,@A+DPTR
         MOV @R0,A
         INC R0
         INC DPTR
         DJNZ R2,TO_MEM
         RET

;=======================================
;            延时子程序
;按22.1184MHz晶体计算
;占用资源:R6,R7
;=======================================
D100US:  MOV R6,#93
         DJNZ R6,$
         RET
D100MS:  MOV R7,#180
DELAY:   MOV R6,#0
del1:    NOP
         NOP
         DJNZ R6,del1
         DJNZ R7,DELAY
	 RET
;-----------------------------------
;对物理编号校验并显示
CHECKMAC:
         MOV  R7,#4                     ;读入物理编号
         MOV  DPTR,#MAC
         MOV  R0,#MACBUF
CHECKMAC_01:         
         CLR  A
         MOVC A,@A+DPTR
         MOV  @R0,A
         INC  R0
         INC  DPTR
         DJNZ R7,CHECKMAC_01
         MOV  R7,#4                    ;检验有没有进行自动增量操作
         MOV  R0,#MACBUF
CHECKMAC_02:
         MOV  A,@R0
         SUBB A,#30H
         JNZ  CHECKMAC_DIS
         INC  R0
         DJNZ R7,CHECKMAC_02
         SJMP CHECKMAC_ERR
CHECKMAC_DIS:
         MOV   R7,#5
CHECKMAC_DIS_01:         
         MOV   DIS_BUF+0,#0AH
         MOV   DIS_BUF+1,#0AH
         MOV   R0,#MACBUF
         MOV   A,@R0
         ANL   A,#0FH
         MOV   DIS_BUF+2,A
         INC   R0
         MOV   A,@R0
         ANL   A,#0FH
         MOV   DIS_BUF+3,A
         INC   R0
         MOV   A,@R0
         ANL   A,#0FH
         MOV   DIS_BUF+4,A
         INC   R0
         MOV   A,@R0
         ANL   A,#0FH
         MOV   DIS_BUF+5,A
         MOV   WDT,#3FH
         MOV   JSQ_LOCAL_LOOP,#50
         CLR   FLAG2
         JNB   FLAG2,$
         MOV   DIS_BUF+0,#0AH
         MOV   DIS_BUF+1,#0AH
         MOV   DIS_BUF+2,#0AH
         MOV   A,MACNO
         MOV   B,#100
         DIV   AB
         MOV   DIS_BUF+3,A
         MOV   A,B
         MOV   B,#10
         DIV   AB
         MOV   DIS_BUF+4,A
         MOV   DIS_BUF+5,B
         MOV   JSQ_LOCAL_LOOP,#50
         CLR   FLAG2
         JNB   FLAG2,$
         DJNZ  R7,CHECKMAC_DIS_01
         RET
CHECKMAC_ERR:
         MOV  DIS_BUF+0,#0DH            ;显示错误
         MOV  DIS_BUF+1,#0EH
         MOV  DIS_BUF+2,#0EH
         MOV  DIS_BUF+3,#0CH
         MOV  DIS_BUF+5,#00H            
CHECKMAC_ERR_01:
         MOV  WDT,#3FH
         LCALL D100US
         SJMP  CHECKMAC_ERR_01
;---------------------------------------------------
;内外部数据校验程序
READMAC:
        CLR    EA
        MOV    ISP_ADDRH,#FLASH_ADDH
        MOV    ISP_ADDRL,#FLASH_ADDL
        MOV    ISP_CONTR,#WAIT_TIME
        MOV    ISP_CMD,#ISP_READBYTE
        MOV    ISP_TRIG,#46H
        MOV    ISP_TRIG,#0B9H
        MOV    MACNO,ISP_DATA
        SETB   EA
        RET
WRITEMAC:
        MOV    ISP_ADDRH,#FLASH_ADDH
        MOV    ISP_ADDRL,#FLASH_ADDL
        CLR    EA
        MOV    ISP_CONTR,#WAIT_TIME
        MOV    ISP_CMD,#ISP_SECTOR
        MOV    ISP_TRIG,#46H
        MOV    ISP_TRIG,#0B9H

        MOV    ISP_ADDRH,#FLASH_ADDH
        MOV    ISP_ADDRL,#FLASH_ADDL
        MOV    ISP_DATA,MACNO
        MOV    ISP_CONTR,#WAIT_TIME
        MOV    ISP_CMD,#ISP_PROBYTE
        MOV    ISP_TRIG,#46H
        MOV    ISP_TRIG,#0B9H
        SETB   EA
        RET 

             
;----------------------------------
;共四个字节
MAC:
DB       "0000"
INCLUDE        "DP.ASM"
INCLUDE        "FINT.ASM"
INCLUDE        "NET.ASM"
END

⌨️ 快捷键说明

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