基于protus的读键子程序的仿真学习,已附代码。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- ;===============================================================================
- ; LED Digit Display & 4*6 KeyPad
- ; By:Wu,ChuiHong
- ;===============================================================================
- ;20181106 V1.0
- ;===============================================================================
- Dark Equ 10H
- ;===============================================================================
- DisModePort Equ 0000H ;0:Light up
- DisCSPort Equ 2000H ;1:Light up
- ;-------------------------------------------------------------------------------
- KeyInPort Equ P1 ;Use P1.0..P1.3
- KeyOutPort Equ DisCSPort
- ;===============================================================================
- DisBuf Equ 30H;..35H
- ;===============================================================================
- Org 0000H
- AJmp Main
- ;===============================================================================
- Display: Mov R0,#DisBuf
- Mov R1,#00000001B
- DisplayLp: Mov A,R1
- Mov Dptr,#DisCSPort
- Movx @Dptr,A
- Mov A,@R0
- Mov Dptr,#DisTab
- Movc A,@A+Dptr
- Mov Dptr,#DisModePort
- Movx @Dptr,A
- ACall Delay
- Inc R0
- Mov A,R1
- RL A
- Mov R1,A
- Cjne R0,#DisBuf+6,DisplayLp
- Ret
- ;-------------------------------------------------------------------------------
- ; Code 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h ,08h, 09h
- ; Char "0", "1", "2", "3", "4", "5", "6", "7" ,"8", "9"
- DisTab: DB 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h,80h, 90h
- ; Code 0ah, 0bh, 0ch , 0dh , 0eh, 0fh, 10h
- ; Char "a", "b", "c" , "d" , "e", "f", " "
- DB 88h, 83h, 0c6h, 0a1h, 86h, 8eh, 0FFH
- ;--------------------------------------------------------------------------
- Delay: Mov r6,#4 ;8*256*2*T(1us)=8*512=4000us=2ms
- Delay1: Mov r7,#0
- Djnz r7,[ DISCUZ_CODE_1 ]nbsp; ;2
- Djnz r6,Delay1
- Ret
- ;-------------------------------------------------------------------------------
- InitDis: Mov DisBuf+0,#0
- Mov DisBuf+1,#Dark
- Mov DisBuf+2,#Dark
- Mov DisBuf+3,#Dark
- Mov DisBuf+4,#Dark
- Mov DisBuf+5,#Dark
- Ret
- ;===============================================================================
- KeySCan: Mov Dptr,#KeyOutPort ;Fast Judge if Key pressed
- Clr A ;Output all 0
- Movx @Dptr,A
- Mov P1,#0FFH ;Input to A
- Mov A,P1
- Cpl A
- Anl A,#0FH
- Ret
- ;-------------------------------------------------------------------------------
- ReadKey: ACall KeyScan ;If Any Key Pressed
- ACall Display ;?
- Jz ReadKey ;No Key, Wait
- ACall Display ;Delay
- ACall Display
- ACall KeyScan
- Jz ReadKey ;If Key Still Pressed
- Mov R1,#0 ;Key Column Code
- Mov R2,#11111110B
- Mov Dptr,#KeyOutPort
- ReadKeyLoop: Mov A,R2 ;Key Output
- Movx @Dptr,A
- Jb KeyInPort.0,ReadKeyNxt0;If .0=1(No Key) to next
- Mov A,#0 ;Key Line Code
- AJmp ReadKeyOk
- ReadKeyNxt0: Jb KeyInPort.1,ReadKeyNxt1;If .0=1(No Key) to next
- Mov A,#6
- AJmp ReadKeyOk
- ReadKeyNxt1: Jb KeyInPort.2,ReadKeyNxt2;If .0=1(No Key) to next
- Mov A,#12
- AJmp ReadKeyOk
- ReadKeyNxt2: Jb KeyInPort.3,ReadKeyNxt3;If .0=1(No Key) to next
- Mov A,#18
- AJmp ReadKeyOk
- ReadKeyNxt3: Mov A,R2
- RL A
- Mov R2,A
- Inc R1
- AJmp ReadKeyLoop
- ReadKeyOk: Add A,R1 ;A=A+R1=Key Code
- Push Acc
- ReadKey1: ACall Display
- ACall KeySCan
- Jnz ReadKey1
- Pop Acc ;Return A=KeyCode
- Ret
- ;===============================================================================
- AToDisHex: Mov B,#16
- Div AB
- Mov DisBuf+0,B
- Mov DisBuf+1,A
- Ret
- ;===============================================================================
- Main: Mov Sp,#07H
- ACall InitDis
- ;-------------------------------------------------------------------------------
- MainLoop: ACall Display ;Dynamic Display
- ACall ReadKey ;Read Key and get Key_Code
- ;ACall AToDisHex ;Show Key code,MUST after ReadKey
- Mov DisBuf+5,DisBuf+4
- Mov DisBuf+4,DisBuf+3
- Mov DisBuf+3,DisBuf+2
- Mov DisBuf+2,DisBuf+1
- Mov DisBuf+1,DisBuf+0
- Mov DisBuf+0,A
- AJmp MainLoop
- ;===============================================================================
- End
复制代码
全部资料51hei下载地址:
Demo.zip
(34.66 KB, 下载次数: 13)
|