中山大学单片机实验文档格式.docx
《中山大学单片机实验文档格式.docx》由会员分享,可在线阅读,更多相关《中山大学单片机实验文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
42H中放显示的字符码,初值为0FFH
STA1:
MOVDPTR,#PCTL;
设置控制字,ABC口工作于方式0
MOVA,#82H;
AC口输出而B口用于输入
MOVX@DPTR,A
LINE:
MOVDPTR,#PC0;
将字符码从C口输出显示
MOVA,42H
CPLA
MOVDPTR,#PA;
从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
MOVA,40H
刚才读入的行线值取出从B口送出
从A口读入列线值
MOV41H,A;
列线值为存入41H中
JZSTA1;
表示没有键按下
MOVDPTR,#TABLE;
TABLE表首地址送DPTR
MOVR7,#18H;
R7中置计数值16
MOVR6,#00H;
R6中放偏移量初值
TT:
MOVXA,@DPTR;
从表上取键码前半字节,行线值与实
CJNEA,40H,NN1;
际输入的行线值相等吗?
不等转NN1
INCDPTR;
相等,指针指向后半字节,即列线值
列线值与列线值
CJNEA,41H,NN2;
不相等吗?
不等转NN2
MOVDPTR,#CHAR;
相等,CHAR表基址和R6中的依偏移量
MOVA,R6;
取出相应的字条码
MOVCA,@A+DPTR
MOV42H,A;
字符码存于42H
BBB:
;
重置控制字,让AC为输出,B为输入
MOVDPTR,#PCTL
MOVA,#82H
AAA:
MOVA,42H;
将字符码从C口送到二极管显示
MOVDPTR,#PC0
MOVDPTR,#PA;
判断按下的键是否释放
CLRA
MOVDPTR,#PB
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:
DJNZR3,DEL;
判断地是否结束
CLRC;
清C
MOVA,R2
CLRA
MOVR2,A;
剩余五位均不显示
MOVA,R0
DJNZR5,DS2;
若没有显示到足够的码,则继续扫描
MOVR2,#20H;
重新赋给R2显示的位码
DJNZR4,DS2;
扫描60次完毕
MOVR4,#60H
SJMPDS1;
整个程序循环执行
JMPNONUM;
显示程序完,准备退出显示程序
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
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个数据是否相等
相等说明就是第R4个数据,将其赋给A
MOV@R0,A;
把A的值赋给@R0,即第几个数
MOVB,R0;
B赋值为当前存储到的地址
LJMPMAIN;
扫描结束
MOVR2,#20
MOVR3,#126
DJNZR3,DEL3
DJNZR2,DEL2
DJNZR1,DEL1
MOVR1,#10
DATA1:
DB0EEH,0EDH,0EBH,0DEH,0DDH,0DBH,0BEH,0BDH,0BBH
JM:
MOVP3,0FFH
JMPJM
END
三、现象及分析
1、每按相应的键,则在数码管上显示相应的字符
四、结论
1、因为实验箱的数码管并不有串接相应的限流电阻,所以要求我们不能用静态显示,否则将烧坏数码管。
内容三:
输入的数动态显示
一、接线方法:
二、代码分析:
PORTEQU0CFA0H
ORG4000H
MOV30H,#01H
MOV31H,#01H
MOV32H,#01H
MOV33H,#01H
MOV34H,#01H
MOV35H,#01H
MOVB,#30H
MOVB,36H;
把B赋予要显示的最后个数据的地址
JZNONUM;
若还没有键输入,则不显示
R0赋予要显示的最后一个数据地址
RRCA
MOVR2,A;
右移位码
DECR0
CJNEA,#30H,DS2;
重新赋给R0要显示的最后一个数的地址
******************************************************************显示模块结束
******************************************************************扫描模块
CJNEA,30H,CHECK
CJNEA,#0F7H,SCAN
CJNEA,30H,SEARCH
CJNEA,B,LOOP;
INCR0;
R0加1,至下一地地址
CJNEA,#37H,MAIN1;
若读到第六个数,结束
JMPJM
MAIN1:
三、实验现象及分析
1、没有键被按下时没有显示,当有键按下时,在数码管的最右边显示所按下键对应的数
2、再按键则原先的数值左移,刚被按下的键所对应的数显示在数码管的最右边
3、当按下第七个键盘的时候,数码管停止更新,熄灭。
此程序虽然能完成任务,但是数码管的亮度随着显示字符的变多而减弱,这是因为程序设计者在设计程序时不了解实验箱的内部结构,不知道单个数码管显示亮度过高会烧坏数码管。
(注:
本资料素材和资料部分来自网络,仅供参考。
请预览后才下载,期待您的好评与关注!
)