Digital code lock using lcd and keypad

Discussion in 'The Projects Forum' started by naspek, Aug 21, 2010.

  1. naspek

    Thread Starter Member

    Feb 17, 2010
    45
    0
    hello there..

    i've already done the assembly language for my digital lock code project..
    however.. when i simulate it using EdSim51, nothing came out from the lcd..
    can someone please guide me to solve this problem?

    Code ( (Unknown Language)):
    1.     lcd_port equ P3
    2.     en equ P3.7
    3.     rs equ P3.5
    4.     lock equ P1.3
    5.     LCD_CLR equ 01H
    6.     LCD_LN1 equ 80H
    7.     LCD_LN2 equ 0C0H
    8.     LOCK_i equ 0
    9.     UNLOCK_i equ 1
    10.     EX_i equ 2
    11.     OK_i equ 3
    12.  
    13.     var1 equ r2
    14.     temp equ r3
    15.     delay equ r4
    16.  
    17.     scan equ r5
    18.     iskey equ 0H
    19.     newcode equ 1H
    20.     keyval equ r6
    21.     status equ r7
    22.     max equ 30H
    23.     count equ 31H
    24.     length equ 32H
    25.     retries equ 33H
    26.     input equ 40H
    27.     upass equ 50H
    28.  
    29.     is_ok equ 2H
    30.  
    31.     FALSE equ 0
    32.     TRUE equ 1
    33.     RETRY equ 2
    34.     EXIT equ 3
    35.  
    36.     keyport equ P1
    37.     col1 equ P1.0
    38.     col2 equ P1.1
    39.     col3 equ P1.2
    40.  
    41.     org 0H
    42.     acall lcd_init
    43.     acall keypad_init
    44.     clr iskey
    45.     mov sp,#60H
    46.     mov retries,#3
    47. main:
    48.     mov a,#LCD_CLR
    49.     acall lcd_cmd
    50.     mov dptr,#str_enter
    51.     acall lcd_str
    52.     mov a,#0C0H
    53.     acall lcd_cmd
    54.     mov a,#LOCK_i
    55.     acall lcd_dat
    56.     mov a,#':'
    57.     acall lcd_dat
    58.     mov max,#5
    59.     acall get_input
    60.     cjne status,#TRUE,main
    61.     mov dptr,#chk_12345
    62.     mov count,#5
    63.     acall chk
    64.     jnb is_ok,main_2
    65.     acall set_upass
    66.     sjmp main
    67. main_2:
    68.     jb newcode,main_3
    69.     mov dptr,#chk_upass
    70.     mov count,#5
    71.     acall chk
    72.     sjmp main_4
    73. main_3:
    74.     acall chk_newcode
    75. main_4:
    76.     jnb is_ok, main_5
    77.     mov retries,#3
    78.     clr lock
    79.     mov a,#LCD_CLR
    80.     acall lcd_cmd
    81.     mov a,#OK_i
    82.     acall lcd_dat
    83.     mov dptr,#inactive
    84.     acall lcd_str
    85.     mov a,#LCD_LN2
    86.     acall lcd_cmd
    87.     mov dptr,#inactive1
    88.     acall lcd_str
    89.     acall delay_1sec
    90.     mov a,#LCD_CLR
    91.     acall lcd_cmd
    92.     mov dptr,#inactive2
    93.     acall lcd_str
    94.     mov a,#LCD_LN2
    95.     acall lcd_cmd
    96.     mov dptr,#inactive3
    97.     acall lcd_str
    98. main_6:
    99.     acall get_key
    100.     cjne keyval,#12,main_6
    101.     setb lock
    102.     mov a,#LCD_CLR
    103.     acall lcd_cmd
    104.     mov a,#OK_i
    105.     acall lcd_dat
    106.     mov dptr,#active
    107.     acall lcd_str
    108.     acall delay_1sec
    109.     ajmp main
    110. main_5:
    111.     mov a,#LCD_CLR
    112.     acall lcd_cmd
    113.     mov a,#LCD_LN1
    114.     acall lcd_cmd
    115.     mov a,#EX_i
    116.     acall lcd_dat
    117.     mov a,#2FH
    118.     add a,retries
    119.     acall lcd_dat
    120.     mov dptr,#str_retry
    121.     acall lcd_str
    122.     acall delay_1sec
    123.     djnz retries,main_8
    124.     sjmp main_7
    125. main_8:
    126.     ajmp main
    127. main_7:
    128.     mov a,#LCD_CLR
    129.     acall lcd_cmd
    130.     mov a,#LCD_LN1
    131.     acall lcd_cmd
    132.     mov a,#EX_i
    133.     acall lcd_dat
    134.     mov dptr,#str_blocked
    135.     acall lcd_str
    136.     mov a,#EX_i
    137.     acall lcd_dat
    138.     mov a,#LCD_LN2
    139.     acall lcd_cmd
    140.     mov a,#LOCK_i
    141.     acall lcd_dat
    142.     mov a,#':'
    143.     acall lcd_dat
    144.     mov max,#10
    145.     acall get_input
    146.     mov count,#10
    147.     mov dptr,#chk_master
    148.     acall chk
    149.     jnb is_ok, main_7
    150.     mov a,#LCD_CLR
    151.     acall lcd_cmd
    152.     mov a,#LCD_LN1
    153.     acall lcd_cmd
    154.     mov a,#OK_i
    155.     acall lcd_dat
    156.     mov dptr,#str_unblocked
    157.     acall lcd_str
    158.     acall delay_1sec
    159.     mov retries, #3
    160. main_1:
    161.     ajmp main
    162.  
    163. str_enter:
    164. db 'E', 'n', 't', 'e', 'r', ' ', 'l', 'o', 'c', 'k', ' ', 'C', 'o', 'd', 'e',0
    165. str_master:
    166. db 'E', 'n', 't', 'e', 'r', ' ', 'M', 'a', 's', 't', 'e', 'r', ' ', 'c', 'o', 'd', 'e', 0
    167. str_retry:
    168. db 'T', 'r', 'i', 'e', 's', ' ', 'l', 'e', 'f', 't', 0
    169. str_blocked:
    170. db 'B', 'l', 'o', 'c', 'k', 'e', 'd',0
    171. str_unblocked:
    172. db 'U', 'n', 'b', 'l', 'o', 'c', 'k', 'e', 'd',0
    173. inactive:
    174. db  'L', 'o', 'c', 'k', ' ', 'i', 's',0
    175. inactive1:
    176. db 'd', 'e', 'a', 'c', 't', 'i', 'v', 'a', 't', 'e', 'd', '!', 0
    177. inactive2:
    178. db 'P', 'r', 'e', 's', 's', ' ', '#', ' ', 'k', 'e', 'y', ' ', 't', 'o', 0
    179. inactive3:
    180. db 'l', 'o', 'c', 'k', ' ', ' ', 'a', 'g', 'a', 'i', 'n', 0
    181. active:
    182. db 'L', 'o', 'c', 'k', ' ', 'i', 's', ' ', 'a', 'c', 't', 'i', 'v', 'e', '!', 0
    183.  
    184.  
    185. lcd_reset:
    186.     mov lcd_port, #0FFH
    187.     mov delay,#20
    188.     acall delayms
    189.     mov lcd_port, #83H
    190.     mov lcd_port, #03H
    191.     mov delay,#15
    192.     acall delayms
    193.     mov lcd_port, #83H
    194.     mov lcd_port, #03H
    195.     mov delay,#5
    196.     acall delayms
    197.     mov lcd_port, #83H
    198.     mov lcd_port, #03H
    199.     mov delay,#5
    200.     acall delayms
    201.     mov lcd_port, #82H
    202.     mov lcd_port, #02H
    203.     mov delay,#5
    204.     acall delayms
    205.     ret
    206.  
    207. lcd_init:
    208.     acall lcd_reset
    209.     mov a,#28H
    210.     acall lcd_cmd
    211.     mov a,#0CH
    212.     acall lcd_cmd
    213.     mov a,#06H
    214.     acall lcd_cmd
    215.     mov a,#80H
    216.     acall lcd_cmd
    217.     acall cgbuild
    218.     ret
    219.  
    220. cgbuild:
    221.     mov count,#32
    222.     mov a,#40H
    223.     acall lcd_cmd
    224.     mov dptr,#icons
    225. cgbuild_l1:
    226.     clr a
    227.     movc a,@a+dptr
    228.     acall lcd_dat
    229.     inc dptr
    230.     djnz count,cgbuild_l1
    231.     ret
    232.  
    233. lcd_cmd:
    234.     mov temp,a
    235.     swap a
    236.     anl a,#0FH
    237.     add a,#80H
    238.     mov lcd_port,a
    239.     anl a,#0FH
    240.     mov lcd_port,a
    241.  
    242.     mov a,temp
    243.     anl a,#0FH
    244.     add a,#80H
    245.     mov lcd_port,a
    246.     anl a,#0FH
    247.     mov lcd_port,a
    248.  
    249.     mov delay,#10
    250.     acall delayms
    251.     ret
    252.  
    253. lcd_dat:
    254.     mov temp,a
    255.     swap a
    256.     anl a,#0FH
    257.     add a,#0A0H
    258.     mov lcd_port,a
    259.     nop
    260.     clr en
    261.  
    262.     mov a,temp
    263.     anl a,#0FH
    264.     add a,#0A0H
    265.     mov lcd_port,a
    266.     nop
    267.     clr en
    268.  
    269.     mov delay,#10
    270.     acall delayms
    271.     ret
    272.  
    273. lcd_str:
    274.     clr a
    275.     movc a,@a+dptr
    276.     jz lcd_str_end
    277.     inc dptr
    278.     acall lcd_dat
    279.     sjmp lcd_str
    280. lcd_str_end:
    281.     ret
    282.  
    283. lcd_str1:
    284.     clr a
    285.     mov a,@r0
    286.     jz lcd_str_end1
    287.     inc r0
    288.     acall lcd_dat
    289.     sjmp lcd_str1
    290. lcd_str_end1:
    291.     ret
    292.  
    293. delayms:
    294.     mov var1,#230
    295. d:
    296.     nop
    297.     nop
    298.     djnz var1,d
    299.     djnz delay,delayms
    300.     ret
    301.  
    302. keypad_init:
    303.     anl keyport,#0FH
    304.     ret
    305.  
    306. get_key:
    307.     mov keyval,#1
    308.     mov a,#80H
    309.     mov temp,#04
    310. read:
    311.     mov scan,a
    312.     cpl a
    313.     anl keyport,a
    314.    
    315.     jb col1,next
    316.     jnb col1,$
    317.     setb iskey
    318.     ret
    319. next:    
    320.     jb col2,next1
    321.     inc keyval
    322.     jnb col2,$
    323.     setb iskey
    324.     ret
    325. next1:
    326.     jb col3,nokey
    327.     inc keyval
    328.     inc keyval
    329.     jnb col3,$
    330.     setb iskey
    331.     ret
    332. nokey:
    333.     mov a,scan
    334.     orl keyport,a
    335.     inc keyval
    336.     inc keyval
    337.     inc keyval
    338.     rr a
    339.     mov delay,#10
    340.     acall delayms
    341.     djnz temp,read
    342.  
    343.     clr iskey
    344.     ret
    345.  
    346. translate:
    347.     mov a,keyval
    348.     cjne a,#10,jmp1
    349.     mov keyval,#'x'
    350.     ret
    351. jmp1:
    352.     cjne a,#11,jmp2
    353.     mov keyval,#'0'
    354.     ret
    355. jmp2:
    356.     cjne a,#12,jmp3
    357.     mov keyval,#'e'
    358.     ret
    359. jmp3:
    360.     add a,#'0'
    361.     mov keyval,a
    362.     ret
    363.  
    364. get_input:
    365.     mov r0,#input
    366.     mov count,#0
    367.     inc max
    368. get_input_cnt:
    369.     acall get_key
    370.     jnb iskey,get_input_cnt
    371.     acall translate
    372.     mov a, keyval
    373.     mov @r0,a
    374.     cjne @r0,#'x',chk_e
    375.     mov a,count
    376.     jnz get_input_l1
    377.     mov status,#EXIT
    378.     ret
    379. get_input_l1:
    380.     inc max
    381.     dec count
    382.     mov @r0,#0
    383.     dec r0
    384.     mov a,#0C2H
    385.     add a,count
    386.     acall lcd_cmd
    387.     mov a,#' '
    388.     acall lcd_dat
    389.     mov a,#0C2H
    390.     add a,count
    391.     acall lcd_cmd
    392.     sjmp get_input_cnt
    393. chk_e:
    394.     cjne @r0,#'e',chk_key
    395.     mov @r0,#0
    396.     dec max
    397.     mov a,max
    398.     jnz get_input_lerr
    399.     mov status,#TRUE
    400.     ret
    401. chk_key:
    402.     inc count
    403.     djnz max, get_input_nxt
    404.     mov dptr,#get_input_err
    405. get_input_retry:
    406.     mov input,#0
    407.     mov a,#LCD_CLR
    408.     acall lcd_cmd
    409.     mov a,#LCD_LN1
    410.     acall lcd_cmd
    411.     mov a,#EX_i
    412.     acall lcd_dat
    413.     acall lcd_str
    414.     acall delay_1sec
    415.     mov status,#RETRY
    416.     ret
    417. get_input_nxt:
    418.     mov a,@r0
    419.     acall lcd_dat
    420.     inc r0
    421.     sjmp get_input_cnt
    422. get_input_lerr:
    423.     mov dptr,#get_input_err1
    424.     sjmp get_input_retry
    425. get_input_err1:
    426. db  'C', 'o', 'd', 'e', ' ', 'i', 's', ' ', 's', 'm', 'a', 'l', 'l', '.', '.', '.', 0
    427. get_input_err:
    428. db  'C', 'o', 'd', 'e', ' ', 'i', 's', ' ', 'l', 'o', 'n', 'g', '.', '.', '.', '.', 0
    429.  
    430. chk:
    431.     mov r0,#input
    432. chk_l2:
    433.     clr a
    434.     movc a,@a+dptr
    435.     mov b,@r0
    436.     cjne a,b,chk_l1
    437.     inc dptr
    438.     inc r0
    439.     djnz count,chk_l2
    440.     setb is_ok
    441.     ret
    442. chk_l1:
    443.     clr is_ok
    444.     ret
    445.  
    446. chk_newcode:
    447.     mov count,#5
    448.     mov r0,#input
    449.     mov r1,#upass
    450. chk_newcode_l1:
    451.     mov a,@r0
    452.     mov b,@r1
    453.     cjne a,b,chk_newcode_l2
    454.     inc r0
    455.     inc r1
    456.     djnz count, chk_newcode_l1
    457.     setb is_ok
    458.     ret
    459. chk_newcode_l2:
    460.     clr is_ok
    461.     ret
    462.  
    463. chk_12345:
    464. db    '1', '2', '3', '4', '5',0
    465.  
    466. chk_master:
    467. db     '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',0
    468.  
    469. chk_upass:
    470. db     '5', '4', '3', '2', '1',0
    471.  
    472. set_upass:
    473.     mov a,#LCD_CLR
    474.     acall lcd_cmd
    475.     mov a,#LCD_LN1
    476.     acall lcd_cmd
    477.     mov dptr,#str_master
    478.     acall lcd_str
    479.     mov a,#LCD_LN2
    480.     acall lcd_cmd
    481.     mov a,#LOCK_i
    482.     acall lcd_dat
    483.     mov a,#':'
    484.     acall lcd_dat
    485.     mov max,#10
    486.     acall get_input
    487.     cjne status,#TRUE,set_upass_l1
    488.     mov count,#10
    489.     mov dptr,#chk_master
    490.     acall chk
    491.     jnb is_ok,set_upass_l1
    492. set_upass_l4:
    493.     mov a,#LCD_CLR
    494.     acall lcd_cmd
    495.     mov a,#LCD_LN1
    496.     acall lcd_cmd
    497.     mov dptr,#str_new
    498.     acall lcd_str
    499.     mov a,#LCD_LN2
    500.     acall lcd_cmd
    501.     mov a,#LOCK_i
    502.     acall lcd_dat
    503.     mov a,#':'
    504.     acall lcd_dat
    505.     mov max,#5
    506.     acall get_input
    507.     cjne status,#TRUE, set_upass_l5
    508.     mov a,#LCD_CLR
    509.     acall lcd_cmd
    510.     mov a,#OK_i
    511.     acall lcd_dat
    512.     mov dptr,#str_saved
    513.     acall lcd_str
    514.     setb newcode
    515.     acall copy_code
    516.     acall delay_1sec
    517.     ret
    518. set_upass_l5:
    519.     cjne status,#RETRY,set_upass_l2
    520.     sjmp set_upass_l4
    521. set_upass_l1:
    522.     cjne status,#RETRY,set_upass_l2
    523.     sjmp set_upass
    524. set_upass_l2:
    525.     ret
    526.  
    527. str_new:
    528. db     'E', 'n', 't', 'e', 'r', ' ', 'n', 'e', 'w', ' ', 'c', 'o', 'd', 'e', 0
    529. str_saved:
    530. db     'L', 'o', 'c', 'k', ' ', 'c', 'o', 'd', 'e', ' ', 's', 'a', 'v', 'e', 'd', '!', 0
    531.  
    532. copy_code:
    533.     mov r0,#input
    534.     mov r1,#upass
    535.     mov count,#5
    536. copy_code_l1:
    537.     mov a,@r0
    538.     mov @r1,a
    539.     inc r0
    540.     inc r1
    541.     djnz count, copy_code_l1
    542.     ret
    543.  
    544. delay_1sec:
    545.     mov delay,#250
    546.     acall delayms
    547.     mov delay,#250
    548.     acall delayms
    549.     mov delay,#250
    550.     acall delayms
    551.     mov delay,#250
    552.     acall delayms
    553.     ret
    554.  
    555. icons:
    556. db 0xe, 0xa, 0x1f, 0x1f, 0x1b, 0x1b, 0xe, 0x0, 0xe, 0x2, 0x1f, 0x1f, 0x1b, 0x1b, 0xe, 0x0, 0x1f, 0x1b, 0x1b, 0x1b, 0x1b, 0x1f, 0x1b, 0x1f, 0x0, 0x1, 0x3, 0x16, 0x1c, 0x8, 0x0, 0x0
    557.  
    558.     end
     
Loading...