中山大学单片机实验.docx

上传人:b****5 文档编号:7197645 上传时间:2023-01-21 格式:DOCX 页数:13 大小:19.81KB
下载 相关 举报
中山大学单片机实验.docx_第1页
第1页 / 共13页
中山大学单片机实验.docx_第2页
第2页 / 共13页
中山大学单片机实验.docx_第3页
第3页 / 共13页
中山大学单片机实验.docx_第4页
第4页 / 共13页
中山大学单片机实验.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

中山大学单片机实验.docx

《中山大学单片机实验.docx》由会员分享,可在线阅读,更多相关《中山大学单片机实验.docx(13页珍藏版)》请在冰豆网上搜索。

中山大学单片机实验.docx

中山大学单片机实验

实验六键盘显示接口实验

一、实验目的

1、掌握8255A编程原理

2、了解键盘电路的工作原理(键盘电路见附图)

3、掌握键盘接口电路的编程方法

4、掌握LED数码管动态显示的编程方法

二、实验说明

1、识别键的闭合,通常采用行扫描法和行反转法

行扫描法是使键盘上某一行先为低电平,而其余行接高电平,然后读取列值,如所读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。

本实验采用的是行反转法

2、程序设计时,要学会灵活地对8255A的各端口进行方式设置

3、程序设计时,可将各键对应的键值(行线值,列线值)放在一个表中,将要显示的0~F字符放在另一个表中,通过查表来确定按下的哪一个键并正确显示出来

三、实验内容

内容一:

利用8255A做矩阵键盘

一、利用实验箱上的8255A可编程并行接口芯片和矩阵键盘,编写程序,做到在键盘每按一个数字键(0~F),用发光二极管将该代码显示出来。

二、连线方法:

将键盘RL10~RL17接8255A的PB0~PB7;KA10~KA12接8255A的PA0~PA2;PC0~PC7接发光二极管的L1~L8;8255A芯片的片选信号8255CS接CS0。

三、代码

;8255键盘实验

PAEQU0CFA0H

PBEQUPA+1

PC0EQUPB+1

PCTLEQUPC0+1

ORG4000H

LJMPSTART

ORG4100H

START:

MOV42H,#0FFH;42H中放显示的字符码,初值为0FFH

STA1:

MOVDPTR,#PCTL;设置控制字,ABC口工作于方式0

MOVA,#82H;AC口输出而B口用于输入

MOVX@DPTR,A

LINE:

MOVDPTR,#PC0;将字符码从C口输出显示

MOVA,42H

CPLA

MOVX@DPTR,A

MOVDPTR,#PA;从A口输出全零到键盘的列线

MOVX@DPTR,A

MOVDPTR,#PB;从B口读入键盘行线值

MOVXA,@DPTR

MOV40H,A;行线值存于40H中

CPLA;取反后如为全零

JZLINE;表示没有键闭合,继续扫描

MOVR7,#10H;有键按下,延时10MS去抖动

DL0:

MOVR6,#0FFH

DL1:

DJNZR6,DL1

DJNZR7,DL0

MOVDPRT,#PCTL;重置控制字,让A为输入,BC为输出

MOVA,#90H

MOVX@DPTR,A

MOVA,40H

MOVDPTR,#PB;刚才读入的行线值取出从B口送出

MOVX@DPTR,A

MOVDPTR,#PA;从A口读入列线值

MOVXA,@DPTR

MOV41H,A;列线值为存入41H中

CPLA;取反后如为全零

JZSTA1;表示没有键按下

MOVDPTR,#TABLE;TABLE表首地址送DPTR

MOVR7,#18H;R7中置计数值16

MOVR6,#00H;R6中放偏移量初值

TT:

MOVXA,@DPTR;从表上取键码前半字节,行线值与实

CJNEA,40H,NN1;际输入的行线值相等吗?

不等转NN1

INCDPTR;相等,指针指向后半字节,即列线值

MOVXA,@DPTR;列线值与列线值

CJNEA,41H,NN2;不相等吗?

不等转NN2

MOVDPTR,#CHAR;相等,CHAR表基址和R6中的依偏移量

MOVA,R6;取出相应的字条码

MOVCA,@A+DPTR

MOV42H,A;字符码存于42H

BBB:

;重置控制字,让AC为输出,B为输入

MOVDPTR,#PCTL

MOVA,#82H

MOVX@DPTR,A

AAA:

MOVA,42H;将字符码从C口送到二极管显示

MOVDPTR,#PC0

CPLA

MOVX@DPTR,A

MOVDPTR,#PA;判断按下的键是否释放

CLRA

MOVX@DPTR,A

MOVDPTR,#PB

MOVXA,@DPTR

CPLA

JNZAAA;没有释放转AAA

MOVR5,#02;已释则延时0.2秒,减少总线负担

DEL1:

movR4,#200

DEL2:

MOVR3,#126

DEL3:

DJNZR3,DEL3

DJNZR4,DEL2

DJNZR5,DEL1

JMPSTART;转START

NN1:

INCDPTR;指针指向后半字节即列线值

NN2:

INCDPTR;指针指向下一键码前半字节即行线值

INCR6;CHAR表偏移量加一

DJNZR7,TT;计数值减一,不为零则转TT继续查找

JMPBBB

TABLE:

;TABLE为键值表,每个键位占

DW0FE06H,0FD06H,0FB06H,0F706H;两个字节,第一个字节为行

DW0BF06H,07F06H,0FE05H,0FD05H;线值,第二个为列线值

DW0EF05H,0DF05H,0BF05H,07F05H

DW0FB03H,0F703H,0EF03H,0DF03H

CHAR:

;字符码表

DB00H,01H,02H,03H,04H,05H,06H,07,08H,09H

DB0AH,0BH,0CH,0DH,0EH,0FH,10H,11H,12H,13H

DB14H,15H,16H,17H

END

内容二:

自编程序

一、设计一个3X3的矩阵键盘,行和列都与用单片机P1口直接相连,用扫描法编写程序读取键盘信息,并在最左边数码管上直接显示出来。

二、边线方法

显示连线:

数码管的段LEDA-LEDDp与LS273的00-07相连,LED1-LED6与P3.0-P3。

5相连,CS273接CS0。

键盘连接:

列线为KA10-KA12,对应的P1.4-P1.6;行线为:

RL10-RL12,对应的P1.0-P1.2。

三、代码分析

PORTEQU0CFA0H

ORG4000H

MOVB,#31H

MOVR0,#30H

MAIN:

;****************************************************************************显示函数开始

PUSHACC

PUSHPSW

ANLPSW,#0C7H

ORLPSW,#10H

DISPLAY:

;调用显示函数

MOVA,B

CLRC

SUBBA,#30H

JZNONUM

NOP

DS1:

MOVR0,B;R0赋予要显示段码的地址

MOVR4,#60H;扫描需要显示60次

MOVR2,#01H;位码的初值

MOVR5,#06H;即使只显示一位,也要扫描六位,防止数码管烧坏

DS2:

MOVA,@R0;A里面暂存RAM里的数据

ACALLTABLE;取段码

MOVDPTR,#PORT;送段码的入口地址

MOVX@DPTR,A;送段码

MOVA,R2;读位码

CPLA;取反

MOVP3,A;送位码

MOVR3,#0FFH;适当延时

DEL:

NOP

DJNZR3,DEL;判断地是否结束

CLRC;清C

MOVA,R2

CLRA

MOVR2,A;剩余五位均不显示

MOVA,R0

DJNZR5,DS2;若没有显示到足够的码,则继续扫描

MOVR2,#20H;重新赋给R2显示的位码

DJNZR4,DS2;扫描60次完毕

MOVR4,#60H

;SJMPDS1;整个程序循环执行

JMPNONUM;显示程序完,准备退出显示程序

TABLE:

INCA;算上RET一个字节

MOVCA,@A+PC

RET

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

NONUM:

POPPSW

POPACC

;*******************************************************************************显示函数结束

;*******************************************************************************扫描函数

MOV30H,#0FEH;设定扫描的初值

SCAN:

MOVP1,30H

MOVA,P1

CJNEA,30H,CHECK

MOVA,30H

RLA

MOV30H,A

CJNEA,#0F7H,SCAN

JMPMAIN

CHECK:

ACALLDEL1

MOVP1,30H

MOVA,P1

CJNEA,30H,SEARCH

JMPSCAN

;MOVR0,30H;选取数值存储的地址首位

SEARCH:

MOV30H,A;把A的值暂时存入30H中

MOVDPTR,#DATA1

MOVR4,#00H

LOOP:

MOVA,R4;读取第R4个数据

MOVCA,@A+DPTR;把R4个数据存入A

INCR4;R4加1

MOVB,30H;重新读出30H中的数据

CJNEA,B,LOOP;比较30H与R4个数据是否相等

MOVA,R4;相等说明就是第R4个数据,将其赋给A

MOV@R0,A;把A的值赋给@R0,即第几个数

MOVB,R0;B赋值为当前存储到的地址

MOVA,B

LJMPMAIN;扫描结束

DEL1:

MOVR2,#20

DEL2:

MOVR3,#126

DEL3:

DJNZR3,DEL3

DJNZR2,DEL2

DJNZR1,DEL1

MOVR1,#10

RET

DATA1:

DB0EEH,0EDH,0EBH,0DEH,0DDH,0DBH,0BEH,0BDH,0BBH

JM:

MOVP3,0FFH

JMPJM

END

三、现象及分析

1、每按相应的键,则在数码管上显示相应的字符

四、结论

1、因为实验箱的数码管并不有串接相应的限流电阻,所以要求我们不能用静态显示,否则将烧坏数码管。

内容三:

输入的数动态显示

一、接线方法:

显示连线:

数码管的段LEDA-LEDDp与LS273的00-07相连,LED1-LED6与P3.0-P3。

5相连,CS273接CS0。

键盘连接:

列线为KA10-KA12,对应的P1.4-P1.6;行线为:

RL10-RL12,对应的P1.0-P1.2。

二、代码分析:

PORTEQU0CFA0H

ORG4000H

MOV30H,#01H

MOV31H,#01H

MOV32H,#01H

MOV33H,#01H

MOV34H,#01H

MOV35H,#01H

MOVB,#30H

MOVR0,#30H

MAIN:

;****************************************************************************显示函数开始

PUSHACC

PUSHPSW

ANLPSW,#0C7H

ORLPSW,#10H

DISPLAY:

;调用显示函数

;MOVB,36H;把B赋予要显示的最后个数据的地址

MOVA,B

CLRC

SUBBA,#30H

JZNONUM;若还没有键输入,则不显示

NOP

DS1:

MOVR0,B;R0赋予要显示的最后一个数据地址

MOVR4,#60H;扫描需要显示60次

MOVR2,#20H;位码的初值

DS2:

MOVA,@R0;A里面暂存RAM里的数据

ACALLTABLE;取段码

MOVDPTR,#PORT;送段码的入口地址

MOVX@DPTR,A;送段码

MOVA,R2;读位码

CPLA;取反

MOVP3,A;送位码

MOVR3,#0FFH;适当延时

DEL:

NOP

DJNZR3,DEL;判断地是否结束

CLRC;清C

MOVA,R2

RRCA

MOVR2,A;右移位码

DECR0

MOVA,R0

CJNEA,#30H,DS2;若没有显示到足够的码,则继续扫描

MOVR0,B;重新赋给R0要显示的最后一个数的地址

MOVR2,#20H;重新赋给R2显示的位码

DJNZR4,DS2;扫描60次完毕

MOVR4,#60H

;SJMPDS1;整个程序循环执行

JMPNONUM;显示程序完,准备退出显示程序

TABLE:

INCA;算上RET一个字节

MOVCA,@A+PC

RET

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

NONUM:

POPPSW

POPACC

;******************************************************************显示模块结束

;******************************************************************扫描模块

MOV30H,#0FEH;设定扫描的初值

SCAN:

MOVP1,30H

MOVA,P1

CJNEA,30H,CHECK

MOVA,30H

RLA

MOV30H,A

CJNEA,#0F7H,SCAN

JMPMAIN

CHECK:

ACALLDEL1

MOVP1,30H

MOVA,P1

CJNEA,30H,SEARCH

JMPSCAN

;MOVR0,30H;选取数值存储的地址首位

SEARCH:

MOV30H,A;把A的值暂时存入30H中

MOVDPTR,#DATA1

MOVR4,#00H

LOOP:

MOVA,R4;读取第R4个数据

MOVCA,@A+DPTR;把R4个数据存入A

INCR4;R4加1

MOVB,30H;重新读出30H中的数据

CJNEA,B,LOOP;比较30H与R4个数据是否相等

MOVA,R4;相等说明就是第R4个数据,将其赋给A

INCR0;R0加1,至下一地地址

MOV@R0,A;把A的值赋给@R0,即第几个数

MOVB,R0;B赋值为当前存储到的地址

MOVA,B

CJNEA,#37H,MAIN1;若读到第六个数,结束

JMPJM

MAIN1:

JMPMAIN

DEL1:

MOVR2,#20

DEL2:

MOVR3,#126

DEL3:

DJNZR3,DEL3

DJNZR2,DEL2

DJNZR1,DEL1

MOVR1,#10

RET

DATA1:

DB0EEH,0EDH,0EBH,0DEH,0DDH,0DBH,0BEH,0BDH,0BBH

JM:

MOVP3,0FFH

JMPJM

END

三、实验现象及分析

1、没有键被按下时没有显示,当有键按下时,在数码管的最右边显示所按下键对应的数

2、再按键则原先的数值左移,刚被按下的键所对应的数显示在数码管的最右边

3、当按下第七个键盘的时候,数码管停止更新,熄灭。

四、结论

此程序虽然能完成任务,但是数码管的亮度随着显示字符的变多而减弱,这是因为程序设计者在设计程序时不了解实验箱的内部结构,不知道单个数码管显示亮度过高会烧坏数码管。

(注:

本资料素材和资料部分来自网络,仅供参考。

请预览后才下载,期待您的好评与关注!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1