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

📄 12864lcdlocker.asm

📁 该汉字密码锁
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;****************************
;      汉字密码锁
;****************************

          E   BIT    P0.7       ;定义液晶屏的三个控制信号,使能信号
         RW   BIT    P0.6       ;读写信号,高电平读,低电平写
         RS   BIT    P0.5      ;寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器或者读忙信号。
        PSB   BIT    P0.4
     LCDRST   BIT    P0.3

       OKEY   BIT    P0.0       ;定义开锁输出端口
       BEEP   BIT    P3.1       ;定义蜂鸣器端口

        SCL   BIT    P0.2      ;24L04串行时钟端口
        SDA   BIT    P0.1     ;24L04串行数据端口

       SCLK   BIT    P3.5      ;定义1302串行时钟
         IO   BIT    P3.6      ;定义1302输入输出
        RST   BIT    P3.7     ;定义1302复位端

  date_line   BIT    P3.3     ;定义温度传感器输入输出

       IRIN   BIT    P3.2



      FLAG1   BIT    00H        ;功能键标志位,为1表示功能按键,为0表示数字按键。
   BUF_FULL   BIT    01H        ;密码已经够六位的标志位,为1表示满,为0表示未满。
        F_1   BIT    02H        ;后门处理标志位
        F_2   BIT    03H
        F_3   BIT    04H
        F_4   BIT    05H
     PSW_TF   BIT    06H        ;密码是否正确标志位,为1表示密码正确,为0表示密码不正确。
        F_5   BIT    07H        ;密码输入,修改密码切换标志位
        F_6   BIT    08H



     BK_BIT   BIT    09H
      FLASH   BIT    0AH

     IRIN_1   BIT    0BH        ;遥控解码执行标志位
     IRIN_2   BIT    0CH        ;遥控解码识别标志位
    IRIN_SF   BIT    0DH        ;判断是否有红外信号输入

    TEMPBIT   BIT    0EH        ;温度正负标志位,为1表示温度为负,为0表示温度为正。

     ADJ_RL   BIT    0FH        ;调整日历标志位

         KF   BIT    10H        ;顺序调整标志位
         KO   BIT    11H        ;逆序调整标志位
       KADD   BIT    12H        ;加1调整标志位
       KDEC   BIT    13H        ;减1调整标志位

       kBL1   BIT    14H
       KBL2   BIT    15H
       KBL3   BIT    16H
       KBL4   BIT    17H

        F_7   BIT    18H        ;修改日历标志位

    YEARBIT   BIT    19H        ;年闪标志位
   MONTHBIT   BIT    1AH        ;月闪标志位
    DATEBIT   BIT    1BH        ;日闪标志位
    HOURBIT   BIT    1CH        ;时闪标志位
     MINBIT   BIT    1DH        ;分闪标志位

   PASSBIT1   BIT    1EH
   PASSBIT2   BIT    20H
   PASSBIT3   BIT    21H
   PASSBIT4   BIT    22H
   PASSBIT5   BIT    23H


        ;密码缓冲区
        PS1   EQU    28H
        PS2   EQU    29H
        PS3   EQU    2AH
        PS4   EQU    2BH
        PS5   EQU    2CH
        PS6   EQU    2DH
        ;AT24C02读取缓冲区
        AT1   EQU    2EH
        AT2   EQU    2FH
        AT3   EQU    30H
        AT4   EQU    31H
        AT5   EQU    32H
        AT6   EQU    33H

        ;后门密码缓冲区
      BKPS1   EQU    34H
      BKPS2   EQU    35H
      BKPS3   EQU    36H
      BKPS4   EQU    37H
      BKPS5   EQU    38H
      BKPS6   EQU    39H




       BUFF   EQU    3AH        ;暂时存放数字键和功能键
     TIMERS   EQU    3BH        ;输入数字的位数
    TIMERS1   EQU    3CH        ;密码输入的次数

        ;新密码缓冲区
    NEWPRD1   EQU    3DH
    NEWPRD2   EQU    3EH
    NEWPRD3   EQU    3FH
    NEWPRD4   EQU    40H
    NEWPRD5   EQU    41H
    NEWPRD6   EQU    42H
        ;修改密码,二次比较密码缓冲区
    TWOPRD1   EQU    43H
    TWOPRD2   EQU    44H
    TWOPRD3   EQU    45H
    TWOPRD4   EQU    46H
    TWOPRD5   EQU    47H
    TWOPRD6   EQU    48H
        ;延时缓冲区
    DELBUF1   EQU    49H
    DELBUF2   EQU    4AH
    DELBUF3   EQU    4BH
    DELBUF4   EQU    4CH
    DELBUF5   EQU    4DH
    DELBUF6   EQU    4EH

    DELBUF7   EQU    4FH

    DELBUF8   EQU    50H

      LCD_X   EQU    51H
      LCD_Y   EQU    52H



     COUNT1   EQU    53H
     COUNT2   EQU    54H
     COUNT3   EQU    55H

     IRCOM    EQU    75H
         X    EQU    56H
      IRRD    EQU    57H

DS1302_ADDR   EQU    59H     ;DS1302寄存器地址单元
DS1302_DATA   EQU    5AH     ;DS1302寄存器数据单元

      TEMPL   EQU    5BH     ;DS18B20温度低字节位地址单元
      TEMPH   EQU    5CH     ;DS18B20温度高字节位地址单元

   TEMP_TEN   EQU    5DH
  TEMP_UNIT   EQU    5EH
   TEMP_DEC   EQU    5FH

   TEMP_BUF   EQU    60H

 week_byte1   EQU    61H
 WEEK_BYTE2   EQU    62H
 WEEK_BYTE3   EQU    63H
 WEEK_BYTE4   EQU    64H
 WEEK_BYTE5   EQU    65H

  TIME_YEAR   EQU    66H      ;日历地址单元,年
 TIME_MONTH   EQU    67H      ;月地址单元
       WEEK   EQU    68H      ;星期地址单元
   TIME_DAY   EQU    69H      ;日地址单元
       HOUR   EQU    6AH      ;小时地址单元
     MINTUE   EQU    6BH      ;分钟地址单元
     SECOND   EQU    6CH      ;秒钟地址单元



;********************************************
;********* 12864汉字密码锁   *********
;********************************************

        ORG   0000H

       AJMP   MAIN
        ORG   0003H             ;外部中断P3.2脚INT0入口地址
       LJMP   INT               ;转入外部中断服务子程序(解码程序)

        ORG   30H

;*****************************************
;            主程序
;*****************************************
      MAIN:
      ;*********************************主程序入口地址




        MOV   SP,#7EH
        MOV   R1,#126          ;清RAM 128单元
        MOV   R0,#2
        MOV   A,#0
     CLEAR:
        MOV   @R0,A
        INC   R0
       DJNZ   R1,CLEAR
        MOV   R0,A

        MOV   TMOD,#11H        ;设置定时器0工作方式1,定时器1工作方式1
       SETB   EA               ;打开总中断
       SETB   ET1              ;打开定时器1中断
       SETB   IT0              ;设定INT0的触发方式为脉冲负边沿触发
       SETB   EX0              ;打开外部中断0中断
       SETB   PX0              ;设置外部中断0为最高中断级别


        MOV   BKPS1,#7         ;后门密码唯一:778166
        MOV   BKPS2,#7
        MOV   BKPS3,#8
        MOV   BKPS4,#1
        MOV   BKPS5,#6
        MOV   BKPS6,#6

        CLR   PSB ;复位
      LCALL   DELAY50MS

        NOP
       SETB   PSB ;通讯方式为8位数据并口

;********************初始化**********************
      LGS0:
        MOV   A,#34H ;34H--扩充指令操作
      LCALL   SEND_I
      LCALL   DEL100US
        MOV   A,#30H ;30H--基本指令操作
      LCALL   SEND_I
      LCALL   DEL100US
        MOV   A,#01H ;清除显示
      LCALL   SEND_I
      LCALL   DEL100US
        MOV   A,#06H ;指定在资料写入或读取时,光标的移动方向
      LCALL   SEND_I ;DDRAM 的地址计数器(AC)加1
      LCALL   DEL100US
        MOV   A,#0CH ;开显示,关光标,不闪烁
      LCALL   SEND_I
      LCALL   DEL100US
        MOV   DS1302_ADDR,#8EH
        MOV   DS1302_DATA,#00H       ;写1302,目的是防止断电以后,再次上电使数据错乱,不能够正常读取
      LCALL   WRITE

        MOV   DS1302_ADDR,#90H
        MOV   DS1302_DATA,#0A7H       ;1302充电,充电电流1.1mA
      LCALL   WRITE
        MOV   DS1302_ADDR,#80H        ;1302开始工作
        MOV   DS1302_DATA,#00H
      LCALL   WRITE
        MOV   DS1302_ADDR,#8EH        ;禁止写1302,目的是防止断电以后,再次上电使数据错乱,不能够正常读取
        MOV   DS1302_DATA,#80H
      LCALL   WRITE
      LCALL   FMQ
;===============================================

     MAIN1:                     ;显示图形
     ;LCALL   PHOTO
     ;LCALL   AAFLASH         ;连续闪烁3次,每次间隔0.4秒

        MOV   A,#0CH
      LCALL   SEND_I

      LCALL   MENU1         ;开机工作画面显示 年 月 日
      LCALL   MENU2         ;开机工作画面显示  星期
      LCALL   MENU3         ;开机工作画面显示  当年温度是:
      LCALL   MENU4         ;开机工作画面显示  密码
     ;LCALL   PASS_FK1      ;开机工作画面显示 输入密码方框

     START:


      LCALL   TEMPDIS       ;温度显示
      LCALL   TIMEDIS       ;日历时间,显示


    CH_KEY:
      LCALL   KS              ;检查有没有按键按下
        JNZ   LK1
         JB   F_7,CH_KEY

         JB   F_1,CH_KEY
         JB   F_5,CH_KEY
       AJMP   START



       LK1:
      LCALL   DELAY6MS       ;防止按键误触发
      LCALL   KS
        JNZ   LK2
         JB   F_7,CH_KEY

         JB   F_1,CH_KEY
         JB   F_5,CH_KEY
       AJMP   START

       LK2:
      LCALL   DELAY6MS       ;再次延时防止按键误触发
      LCALL   KS
        JNZ   LK_3
         JB   F_7,CH_KEY

         JB   F_1,CH_KEY
         JB   F_5,CH_KEY
       AJMP   START

      LK_3:
        NOP
      LCALL   SBIE             ;按键识别子程序
        MOV   BUFF,A           ;送缓冲区以识别是数字键还是功能键?
      LCALL   CH_KF            ;判断按键功能。
         JB   FLAG1,KEY_FUN1   ;标志为1,则为功能键
       AJMP   KEY_DIG
  KEY_FUN1:
       AJMP   KEY_FUN          ;跳转到功能按键执行程序


;===================================================
;    日历时间显示子程序
;===================================================
   TIMEDIS:
          JB   ADJ_RL,TIMEDIS1
         MOV   A,#0CH
       LCALL   SEND_I
        AJMP   TIMEDIS2
   TIMEDIS1:
         MOV   A,#0FH
       LCALL   SEND_I
   TIMEDIS2:
         MOV   DS1302_ADDR,#8DH       ;读出年数据
       LCALL   READ
         MOV   TIME_YEAR,DS1302_DATA
         MOV   R0,TIME_YEAR
       LCALL   DIVIDE
         MOV   A,#81H
       LCALL   SEND_I
         MOV   A,R2
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,R1
         ADD   A,#30H
       LCALL   SEND_D

         MOV   DS1302_ADDR,#89H       ;读出月数据
       LCALL   READ
         MOV   TIME_MONTH,DS1302_DATA
         MOV   R0,TIME_MONTH
       LCALL   DIVIDE
         MOV   A,#83H
       LCALL   SEND_I
         MOV   A,R2
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,R1
         ADD   A,#30H
       LCALL   SEND_D



         MOV   DS1302_ADDR,#87H       ;读出日数据
       LCALL   READ
         MOV   TIME_DAY,DS1302_DATA
         MOV   R0,TIME_DAY
       LCALL   DIVIDE
         MOV   A,#85H
       LCALL   SEND_I
         MOV   A,R2
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,R1
         ADD   A,#30H
       LCALL   SEND_D


         MOV   A,#92H      ;星期几
       LCALL   SEND_I



       LCALL   GETWEEK
         MOV   A,WEEK
        CJNE   A,#0,WE_1
         MOV   DPTR,#WE_TAB0
        AJMP   WEEK_DIS
       WE_1:
        CJNE   A,#1,WE_2
         MOV   DPTR,#WE_TAB1
        AJMP   WEEK_DIS
       WE_2:
        CJNE   A,#2,WE_3
         MOV   DPTR,#WE_TAB2
        AJMP   WEEK_DIS
        WE_3:
        CJNE   A,#3,WE_4
         MOV   DPTR,#WE_TAB3
        AJMP   WEEK_DIS
       WE_4:
        CJNE   A,#4,WE_5
         MOV   DPTR,#WE_TAB4
        AJMP   WEEK_DIS
       WE_5:
        CJNE   A,#5,WE_6
         MOV   DPTR,#WE_TAB5
        AJMP   WEEK_DIS
       WE_6:
        CJNE   A,#6,WEEK_DIS
         MOV   DPTR,#WE_TAB6


   WEEK_DIS:
         MOV   A,#0
        MOVC   A,@A+DPTR
       LCALL   WEEK_SHOW



         MOV   DS1302_ADDR,#85H       ;读出小时数据
       LCALL   READ
         MOV   HOUR,DS1302_DATA
         MOV   A,#94H
       LCALL   SEND_I
         MOV   R0,HOUR
       LCALL   DIVIDE
         MOV   A,R2
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,R1
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,#":"
       LCALL   SEND_D


         MOV   DS1302_ADDR,#83H       ;读出分钟数据
       LCALL   READ
         MOV   MINTUE,DS1302_DATA
         MOV   R0,MINTUE
       LCALL   DIVIDE
         MOV   A,R2
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,R1
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,#":"
       LCALL   SEND_D


         MOV   DS1302_ADDR,#81H       ;读出秒钟数据
       LCALL   READ
         MOV   SECOND,DS1302_DATA
         MOV   R0,SECOND
       LCALL   DIVIDE
         MOV   A,R2
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,R1
         ADD   A,#30H
       LCALL   SEND_D



    NEXT_F0:
         JNB   YEARBIT,NEXT_F1
         MOV   A,#81H                 ;年闪
       LCALL   SEND_I
        AJMP   NEXT_OUT

    NEXT_F1:
         JNB   MONTHBIT,NEXT_F2
         MOV   A,#83H                ;月闪
       LCALL   SEND_I
        AJMP   NEXT_OUT

    NEXT_F2:
         JNB   DATEBIT,NEXT_F3
         MOV   A,#85H                ;日闪
       LCALL   SEND_I
        AJMP   NEXT_OUT

    NEXT_F3:
         JNB   HOURBIT,NEXT_F4
         MOV   A,#94H                ;时闪
       LCALL   SEND_I
        AJMP   NEXT_OUT
    NEXT_F4:
         JNB   MINBIT,NEXT_OUT
         MOV   A,#96H                ;分闪
       LCALL   SEND_I

    NEXT_OUT:
         RET

    WE_TAB0:
          DB   "日",0
    WE_TAB1:
          DB   "一",0
    WE_TAB2:
          DB   "二",0
    WE_TAB3:
          DB   "三",0
    WE_TAB4:
          DB   "四",0
    WE_TAB5:
          DB   "五",0
    WE_TAB6:
          DB   "六",0

;===================================================
;    温度显示子程序
;===================================================
    TEMPDIS:
         MOV   A,#0CH
       LCALL   SEND_I

         MOV   A,#8DH             ;当前温度:
       LCALL   SEND_I
       LCALL   GET_TEMPER
         JNB   TEMPBIT,TEMPDIS1
         MOV   A,#"-"
       LCALL   SEND_D
        AJMP   TEMPDIS2
   TEMPDIS1:
         MOV   A,TEMP_TEN
         ADD   A,#30H
       LCALL   SEND_D
   TEMPDIS2:
         MOV   A,TEMP_UNIT
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,#"."
       LCALL   SEND_D
         MOV   A,TEMP_DEC
         ADD   A,#30H
       LCALL   SEND_D
         MOV   A,#8FH
       LCALL   SEND_I
         MOV   A,#0A1H       ;显示温度的符号
       LCALL   SEND_D
         MOV   A,#0E6H
       LCALL   SEND_D
         MOV   A,#0FH
       LCALL   SEND_I
         MOV   A,#9AH
       LCALL   SEND_I
         RET



;***********数字按键输入并且存放到缓冲区内等待比较***********
   KEY_DIG:
        NOP
        NOP                   ;设一标志,辨别输入是否满
         JB   F_7,KEY_OUT
         JB   IRIN_1,KEY_OUT

        INC   TIMERS          ;输入数字的位数

⌨️ 快捷键说明

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