中山大学单片机实验.docx
《中山大学单片机实验.docx》由会员分享,可在线阅读,更多相关《中山大学单片机实验.docx(13页珍藏版)》请在冰豆网上搜索。
![中山大学单片机实验.docx](https://file1.bdocx.com/fileroot1/2023-1/21/da9761bc-f7c7-4167-9d1c-a582ece062c0/da9761bc-f7c7-4167-9d1c-a582ece062c01.gif)
中山大学单片机实验
实验六键盘显示接口实验
一、实验目的
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、当按下第七个键盘的时候,数码管停止更新,熄灭。
四、结论
此程序虽然能完成任务,但是数码管的亮度随着显示字符的变多而减弱,这是因为程序设计者在设计程序时不了解实验箱的内部结构,不知道单个数码管显示亮度过高会烧坏数码管。
(注:
本资料素材和资料部分来自网络,仅供参考。
请预览后才下载,期待您的好评与关注!
)