行调用。主要程序内容如下:
MAIN: CLR P2.5 CLR P3.7
;清A/D启动信号和地址锁存信号
;清A/D输出允许控制端
TE:LCALL KEY ; 调用键盘扫描子程序 LCALL ADC MOV 80H,A LCALL LED
LJMP TE
开始
初始化 ; 调用A/D转换子程序
;将A/D转换结果存于80H
;调用显示子程序
N 按键扫描,判断有无键按下
Y A/D转换 LED显示 主程序流程图
5.2 键盘扫描子程序设计
采用行扫描法。首先判别有无键按下,由单片机I/O口向建攀输出全扫描字,然后读入列线状态来判断。判断键盘中哪一个键被按下是通=通过将行线逐行置低电平后,检查列输
入状态实现的。如果全为1,则所按下的键不在此行;如果不全为1,则所按下的键必在此行,而且是在与零电平列线相交的交点上的那个键。
KEY: ;键盘扫描子程序 LCALL KS ;判断有无键按下 JZ KND LCALL T10MS LCALL KS JZ KND
MOV R2,#0FEH MOV R4,#00H LK1:
MOV P3,R2 MOV A,P3 JB ACC.3,ONE MOV A,#00H LJMP KP ONE:
JB ACC.2,NEXT MOV A,#02H KP:
ADD A,R4 PUSH ACC
LK:LCALL KS JNZ LK POP ACC MOV R3,A KND:RET
NEXT:INC R4 MOV A,R2 JNB ACC.1,KND RL A MOV R2,A AJMP LK1
KS:MOV P3,#0FCH MOV A,P3 CPL A
ANL A,#0CH RET
;无键按下,退出扫描 ;有键按下,延时去抖动 ;首行扫描子送R2 ;首行号#00H送入R4 ;首行扫描字送P3口 ;0列无键按下,转1列 ;0列有键按下,该列首号#00H送A ;转求键号 ;1列无键按下,转下行 ;1列有键按下,该列首号#02H送A ;求键号 ;键号进栈保护 ;等待键释放 ;未释放,等待 ;键释放,,键号送A ;键号送入R3保存 ;行号加1 ;判断两行扫描完了吗 ;扫描完成,退出 ;未扫描完,扫描字左移一位 ;扫描字入R2 ;转扫下一行 ;全扫描字送P3口 ;读入P3口状态 ;取正逻辑,高电平表示有键按下
T10MS:MOV R7,#10H TS1:MOV R6,#0FFH TS2:DJNZ R6,TS2 DJNZ R7,TS1 RET
;延时10ms子程序
5.3 A/D转换子序设计
ADC: ;A/D转换程序 MOV A,R3 ;键号送A
JB ACC.0,IN4 ;若A最低位为1,选择通道4,否则为通道3 CLR P3.6 ;通道3 SETB P3.5 SETB P3.4
SETB P2.5 ;启动A/D转换 NOP NOP CLR P2.5 NOP NOP
HERE:JNB P2.4,HERE ;判断转换完成否 SETB P3.7 ;转换完成,送出数据 NOP NOP
MOV A,P1 ;将转换数据送入A CLR P3.7 RET IN4: ;通道4 SETB P3.6 CLR P3.5 CLR P3.4 SETB P2.5 NOP NOP CLR P2.5 NOP NOP
AJMP HERE
5.3 中值滤波子程序的设计
FILT1:
MOV A,40H ;40H<41H吗? CLR C
SUBB A,41H JC FILT1
MOV A,40H ;40H>41H时,交换40H和41H XCH A,41H MOV 41H,A FILT2:
MOV A,41H ;41H<42H吗? CLR C
SUBB A,42H
JC FILE3 ;41H<42H时,排序结束
MOV A,42H ;41H>42H时,交换41H和42H XCH A,41H
XCH A,42H ;41H>40H吗? CLR C
SUBB A,41H
JNC FILT3 ;41H>40H时,排序结束
MOV A,40H ;41H<40H时,以40H为中值 MOV 41H,A FILT3:
RET ;中值在41H中
5.4 LED显示子程序的设计
LED:MOV A,80H ;LED显示子程序 MOV B,#05H MUL AB
MOV 31H,B ;乘5取高八位,送入LED第二位显示 MOV B,#0AH
MUL AB
MOV 32H,B ;余数乘10取高八位送入LED第三位显示
XIANSHI:
MOV DPTR,#TAB MOV A,R3