1. 连接实验箱上的数码管,编程在上面显示数字2017 2. 连接实验箱上的键盘和数码管,编写程序,将键盘输入值写在数码管的最右端,原来的数值,向左端移动。 3. 消除按键一次,输入多次的情况
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- ORG 0000H
- MAIN: CLR P1.0 ;因为是共阴极的二极管,故当P1.0电平为低电平时,二极管会亮
- MOV P0,#5BH ;2
- LCALL D1MS ;延时
- SETB P1.0 ;置位,不选中这一位
- CLR P1.1 ;和上述方法一样
- MOV P0,#3FH ;0
- LCALL D1MS;
- SETB P1.1
- CLR P1.2 ;和上述方法一样
- MOV P0,#06H ;1
- LCALL D1MS
- SETB P1.2
- CLR P1.3 ;和上述方法一样
- MOV P0,#07H ;7
- LCALL D1MS
- SETB P1.3
- LJMP MAIN ;循环显示
- D1MS: MOV R7,#02H
- DL: MOV R6,#0FFH
- DL1: DJNZ R6,DL1
- DJNZ R7,DL
- RET
- END
- 2和3:
- KBUF DATA 30H ;显示缓冲区,存放要显示的数据
- ORG 0000H
- LJMP START1
- ORG 0100H
- START1: LCALL KEY ;调用KEY,有没有键按下
- JC START4 ;判断进位位,如果进位位为1,证明没键按下
-
- PUSH ACC ;A中存放的是键值的序号
- MOV R0,#KBUF ;显示器的位置左移
- MOV R1,#KBUF+1
- MOV R7,#7
- START2: MOV A,@R1
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R7,START2
- POP ACC
- MOV @R0,A
- ;功能键的按钮
- CJNE A,#0FH,START4 ;判断累加器的值是否是0F,如果不是跳转到START4
- START: MOV R0,#KBUF
- MOV R7,#8
- MOV A,#0
- START0: MOV @R0,A
- INC R0
- DJNZ R7,START0
- START4: LCALL DISP
- SJMP START1
- ;①判断有没有键按下
- KEY: MOV P1,#0FFH ;让显示器熄灭
- MOV P3,#0FFH ;通过P3口读入信息,提前送入1
- MOV P0,#00H
- MOV A,P3
- ANL A,#0FH ;只要低四位的数据
- CJNE A,#0FH,KEY1 ;判断是不是全1,若全1,证明没键按下,否则,证明有键按下,跳转到KTY1
- SJMP NOKEY
- ;②抖动问题
- KEY1: CALL DELAY ;延时,先消除抖动
- MOV A,P3
- ANL A,#0FH
- CJNE A,#0FH,KEY2 ;判断是不是全1,若全1,证明是抖动,没键按下,否则,是真正的有键按下
- SJMP NOKEY
- ;③确实哪一列的键被按下
- KEY2: MOV R6,#04H ;循环4次
- MOV R5,#0FEH ;存放的是每一列应该输入的值
- KEY3: MOV P0,R5 ;P0.0为0
- MOV A,P3 ;读取P3口
- ANL A,#0FH ;只要低四位
- CJNE A,#0FH,KEY4 ;判断是不是全1,若全1,证明此列没键按下,顺序执行,否则,在此列有键按下,转到KEY4
-
- MOV A,R5
- RL A ;循环左移一位
- MOV R5,A
- DJNZ R6,KEY3 ;判断4次循环是否结束,没结束,继续执行上述过程
- SJMP NOKEY ;四次都结束,且中间没有转到KEY4,证明没键按下
- ;④此列上有键按下,显示键值
- KEY4: SWAP A ;半字节交换,高4位有效
- MOV B,A ;B存储
- MOV A,R5 ;R5是列值
- ANL A,#0FH ;只要低四位
- ORL B,A ;组合值,去查表
- MOV DPTR,#TAB1
- MOV R7,#16 ;共16个键,循环16次
- MOV R5,#0 ;从第0个开始
- KEY5: MOV A,R5
- MOVC A,@A+DPTR ;读取值
- CJNE A,B,KEY7 ;判断是否和获得的组合值是否相等。相等,顺序执行,否则,转到KEY7
- ;⑤键是否抬起的问题
- KEY6: MOV A,P3 ;等着键抬起
- ANL A,#0FH ;只要低四位
- CJNE A,#0FH,KEY6 ;不是0FH,证明没抬起来
- MOV A,R5 ;A中存放的是键值的序号
- SJMP EXIT
- KEY7: INC R5 ;序号加1,继续循环
- DJNZ R7,KEY5
- NOKEY: SETB C ;进位位为1,证明没键按下
- EXIT: RET
- ;延时程序
- DELAY: MOV R5,#02H
- DL: MOV R6,#0FFH
- DL1: DJNZ R6,DL1
- DJNZ R5,DL
- RET
- ;显示程序
- DISP: MOV DPTR,#TAB
- MOV R0,#KBUF ;存放要显示的数据
- MOV R7,#8 ;共8个字节
- MOV R4,#1 ;存放字位
- DISP0: MOV A,@R0 ;通过R0得到要显示的值
- MOVC A,@A+DPTR ;查表得到字型码
- MOV P1,A ;送到P1口显示
- MOV A,R4
- MOV P0,A ;字位送到P0口
- RL A ;左移一位
- MOV R4,A ;又送到R4
- LCALL DELAY ;延时
- MOV P1,#0FFH ;关显示
- INC R0 ;R0加一
- DJNZ R7,DISP0 ;判断8位是否全部显示,若没有,则继续显示,否则返回
- RET
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,82H,0C6H,0A1H,86H,8EH ;共阳极字型码
- TAB1: DB 0EEH,0EDH,0EBH,0E7H,0DEH,0DDH,0DBH,0D7H,0BEH,0BDH,0BBH,0B7H,07EH,07DH,07BH,77H ;键值表
- END
复制代码
所有资料51hei提供下载:
实验连接图 源码.zip
(18.43 KB, 下载次数: 12)
|