单片机键盘与显示的汇编程序

TIM EQU -2000
DISP DATA 30H ; 30-34H
DIS DATA 35H
KEY DATA 36H
CLK BIT P0.0
DAT BIT P0.1
STR BIT P0.2
S4 BIT P2.7
S3 BIT P2.6
S2 BIT P2.5
S1 BIT P2.4
K1 BIT P2.3
K2 BIT P2.2
K3 BIT P2.1
K4 BIT P2.0
ORG 0000H
LJMP MAIN
ORG 000BH ;T0中断程序入口
LJMP TIM0
MAIN: MOV SP,#60H ;堆栈和弹栈地址
MOV IE,#82H ;开中断
MOV TMOD,#11H ;设置T0和T1为定时方式,而且都为模式0
MOV TH0,#HIGH(TIM);给T0赋TIM高两位的值“20”
MOV TL0,#LOW(TIM) ;给T0赋TIM低两位的值“00”,该初值的作用是设定扫描速度的快慢
SETB TR0 ;启动T0定时器
MOV DISP+0,#0 ;数码管的初始值及它们对应的存储地址
MOV DISP+1,#0
MOV DISP+2,#0
MOV DISP+3,#0
MOV KEY,#0
DELAY: MOV A,KEY
JZ DELAY ;累加器A为零,则在此处循环,定时检查中断程序中是否有从键盘数据的操作,如果没有,则A的值继续为零,在此处等待,如果有输入数据,A中的值将会变化,则顺序执行下一条语句,将A中的数变成十进制数
MOV B,#10 ;十六进制转换十进制
DIV AB
MOV DISP+2,A
MOV DISP+3,B
LCALL DLYTIM
LJMP DELAY ;如果一直没有按下其他的键,则数码管将一直显示原来的数
TIM0: PUSH ACC ;中断前对之前的数据及运行状态进行堆栈保护
PUSH PSW
MOV TH0,#HIGH(TIM) ; 此处的初值是定时中断,即中断的频率
MOV TL0,#LOW(TIM)
MOV A,DIS ;把DIS对应的地址35H赋给A
LCALL GETDIS
MOV A,DIS ;第二次把DIS内容即 对应的地址35H赋给A
ADD A,#DISP ;30H 加 35H 赋给A,A变为65H
MOV R1,A ;R1地址为65H
MOV A,@R1 ;将65H中的内容(其实为零)赋给A
LCALL GETSEG ;检测行的低电平,目的是能将1到16的十六进制数读入
KEY0P: JB K1,KEY1P ;如果 K1 对应的第一行第一列为高电平,即没有键按下去,则跳到KEY1P查询K2是否有键被按下 ;如果K1为低电平则顺序往下执行
MOV A,DIS ;K1为低电平,则把DIS的内容,即对应的地址35H赋给A
ADD A,#1 ;A的内容与立即数1相加,35H+1=36H,36H 是KEY的地址
MOV KEY,A ;A的内容改变了不为零了,
KEY1P: JB K2,KEY2P ;第一次循环:检测,第一列的第二行电平的高低, 第二次循环:检测,第二列的第二行电平的高低
MOV A,DIS
ADD A,#5 ;K1有四个键,预留四个地址,所以此处加立即数“5”
MOV KEY,A
KEY2P: JB K3,KEY3P
MOV A,DIS
ADD A,#9
MOV KEY,A
KEY3P: JB K4,KEYP
MOV A,DIS
ADD A,#13
MOV KEY,A
KEYP: INC DIS
MOV A,DIS
CJNE A,#4,TIME
MOV DIS,#0
TIME: POP PSW
POP ACC
RETI ;中断返回
DLYTIM: MOV R6,#200 ;????
DLYR7: MOV R7,#200
DJNZ R7,$
DJNZ R6,DLYR7
RET ;返回 DELAY
GETSEG: MOV R1,A ;把A的内容(第一次为零)赋给R1(65H)
LCALL DISPLAY
RET
GETDIS: MOV DPTR,#NUMTAB
MOVC A,@A+DPTR ;将10H、20H、40H、80H存入A(此时

地址为35H)
CPL A ;分别对10H、20H、40H、80H求反
MOV P2,A ;循环第一次10H:K1置低电平,第二次20H:K2置低电平, 第三次40H:K3置低电平, 第四次80H:K4置低电平(即先将键盘的列置低电平)
RET
DISPLAY:MOV A,R1 ;又把R1对应的地址65H 赋给A
MOV DPTR,#TABLE ;将1到16的十六进制数读入DPTR中
MOVC A,@A+DPTR
CPL A ;行检测键盘是否有哪一个摁键按下(摁下则为低电平,此时与列对应的也是低电平则表示输入那一位数),该数将在数码管中显示
MOV R2,#8 ;
CLR CLK ;对4094(8位移位存储总线寄存器)的 CLK 清零 ,等待对下一位进行移位
DLP: RRC A ;将A中逐位送给C
MOV DAT,C ;C位1,DAT为1,4094进行一次移位,将检测到的数移到数码管中显示
CLR CLK ;来一个脉冲移一位
SETB CLK ;
DJNZ R2,DLP ;把8位二进制移完为止
SETB STR ;???
CLR STR ;???
RET ;返回到 GETSEG
TABLE: DB 0F5H,05H,0E3H,67H,17H,76H,0F6H,25H
DB 0F7H,77H,0B7H,0D6H,0F0H,0C7H,0F2H,0B2H
NUMTAB: DB 10H,20H,40H,80H
END

相关文档
最新文档