实验一键盘输入实验参考程序:;4*4矩阵键盘读取程序,利用P0口,列线左起P0.0-P0.3;行线上起P0.4-P0.7,行线默认接高电平,;P3.7作为键盘被读取的提示灯; 0 1 2 3; 4 5 6 7; 8 9 A B; C D E F;不考虑有两个或以上按键同时按下的情况,;每次扫描到一个有按下则结束本次扫描SETB P3.7 ;确认关闭键盘响应指示灯MAIN: MOV R0,#0EFH ;用于给键盘行列线确定的电平MOV R1,#0H ;循环次数,R1=0对应第一行,=1为第二行,以此类推SMAIN: MOV P0,R0 ;改变行线的状态,列线全处于高电平NOPNOPMOV A,P0JB ACC.0,L1 ;判断某行的第一列是否按下,按下则P0.0为低电平MOV R2,#0H ; 将某行的列码保存至R2,显示程序会根据此值和R1的值计算具体为何按键按下ACALL DISPSJMP MAIN ; 每次扫描到一个有按下则结束本次所有扫描L1: JB ACC.1,L2 ;判断某行的第二列是否按下,按下则P0.1为低电平MOV R2,#01HACALL DISPSJMP MAINL2: JB ACC.2,L3 ;判断某行的第三列是否按下,按下则P0.2为低电平MOV R2,#02HACALL DISPSJMP MAINL3: JB ACC.3,SKIP ;判断某行的第四列是否按下,按下则P0.3为低电平MOV R2,#03HACALL DISPSJMP MAIN ;SKIP: INC R1 ;R1加1,共计4行,MOV A,R0RL A ;左移R0内的值,以并扫描下一行MOV R0,ACJNE R1,#04H,SMAIN ;若四行扫描完毕,则跳转至程序最初,相关参数为初始值NO: MOV P2,#0FFH ;程序能执行到此说明四行扫描完毕并且一个按键都没按下,关闭数码管和指示灯SETB P3.7SJMP MAINDISP: CLR P3.7 ;点亮键盘响应指示灯MOV A,R1RL ARL A ;R1对应行,具体的按键计算为R1*2+R2ADD A,R2ADD A,#3H ;下列指令与表格见有3字节的距离MOVC A,@A+PCMOV P2,A ;十六进制的高位用数码管L1显示RET ;共阳数码管0-F的显示码DIS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB 80H,90H,88H,83H,0C6H,0A1H,86H,8EHDELAY: m ov r7,#255;延时del1: mov r6,#255;del2: djnz r6,del2djnz r7,del1retEND实验二显示实验动态显示,2个数码管,公共端为P0.6、P0.7,段控制接至P2口ORG 00HDISPORT EQU P2ONESP BIT P0.7 ;公共控制端TENSP BIT P0.6MOV DISPORT,#00HSTART: MOV R0,#0HMOV R1,#0H ;初始化:关闭显示,设置个位、十位均为0,分别存放于R0,R1 MAIN: ;ACALL DELAYACALL DELAY ;调用延时程序,延时程序内部实现动态显示的刷新过程INC R0 ;个位加1CJNE R0,#10D,MAIN ;判断个位加1后是否=10,若不等说明<=8,继续循环MOV R0,#00D ;个位加1后=10,说明要像十位进1,并且清零个位INC R1CJNE R1,#10D,MAIN ;判断十位是否=10,若不等说明<=8,继续循环SJMP START ;若十位加1后=10,说明已到99,跳至程序开头DELAY: MOV DPTR,#TAB ;延时程序的开头首先根据RO、R1里面的值找到其对应的显示码MOV A,R0MOVC A,@A+DPTRMOV R2,A ;个位显示码查到后存放至R2MOV A,R1MOVC A,@A+DPTRMOV R3,A ;十位显示码查到后存放至R3MOV R6,#255D ;延时约900msMOV R7,#255DDELAY1: MOV DISPORT,R2 ;送个位显示码至端口,共阴数码管SETB ONESPCLR TENSP ;打开个位公共端,关闭十位数码管的公共端DJNZ R7,DELAY1 ;延时约1.5msMOV R7,#255D ;为保证个位十位显示时间相当,此值为190左右更合适;有意识在十位显示循环内部添加NOP,延长时间,观察个十位亮度DELAY2: CJNE R1,#0D,MID ;判断十位是否为0MOV DISPORT,#00D;为0,则关闭十位数码管显示CLR TENSPCLR ONESPSJMP MID1MID: MOV DISPORT,R3 ;不为0,则显示对应的值SETB TENSPCLR ONESPNOPNOPNOPNOPNOPNOPNOPNOPNOPMID1: DJNZ R7,DELAY2DJNZ R6,DELAY1RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH JMP STARTENDDIV ABMOV 40H,AMOV A,BMOV B,#05DDIV ABMOV 41H,Amov dptr,#table ;显示mov a, 40hmovc a,@a+dptrmov p0,aclr p0.7mov dptr,#tablemov a, 41hmovc a,@a+dptrmov p2,asjmp midSW: CPL CLOCKRETI ;中端程序翻转CLOCK引脚,形成时钟信号TABLE: D B 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H ;显示码表,小数点不亮DELAY: M OV R7, #5D1: MOV R6, #5D2: MOV R5, #5D3: DJNZ R5,D3DJNZ R6,D2DJNZ R7,D1RETEND实验四串行通信上位机采用网上下载的串口调试软件,本设计中使用的软件界面如下。
ORG 00HSJMP MAINORG 23HLJMP COMPRO ;串行中断入口ORG 40HMAIN:MOV TMOD,#20H ;定时器T1工作模式2,初值224DMOV TL1,#0F3HMOV TH1,#0F3HMOV SCON,#50H ;串口工作模式1,波特率2.4k,无奇偶校验CLR RICLR TISETB TR1SETB EASETB ES ;打开串行口中断WAIT: JB P3.3,$ ;S3没按下为高电平,等待ACALL DELAYJB P3.3,$MOV A,#20HMOV SBUF,A ;发送空格MOV DPTR,#TDATA ;将要发送的数据表格地址给DPTR XY: MOV A,#00HMOVC A,@A+DPTRCJNE A,#00FFH,XY ;判断有没发完SJMP W AITTDATA: DB 'Changzhou ','Institute ','of Technology!',0AH,0FFH;要发送的信息,0AH换行的ASCII码,0FFH为设定的信息结束标志delay: mov r7,#255 ;延时del1: mov r6,#255 ;NOPNOPNOPdel2: djnz r6,del2djnz r7,del1retCOMPRO: JNB TI,RECV ;串行通信中断处理程序;判断是接受中断还是发送中断的标志,从而进行对应的处理CLR TI ;发送中断处理,首先清标志位MOV A,#00HMOVC A,@A+DPTRCJNE A,#00FFH,TXDA;判断是否为信息结束标志,否则发送SJMP RETURN;是结束标志退出中断TXDA: MOV SBUF,AINC DPTR;发送后,数据指针加1,指向要发送的下一字节数据SJMP RETURNRECV: CLR RI ;接受中断处理MOV A,SBUFMOV R5,AANL A,#0FH ;取低4位显示ADD A,#13 ;加上本条指令与显示码表格首地址间的间隔MOVC A,@A+PCMOV P2,A ;十六进制的低位用数码管L2显示MOV A,R5SWAP AANL A,#0FHADD A,#4HMOVC A,@A+PCMOV P0,A ;;十六进制的高位用数码管L1显示SJMP RETURNDIS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH;共阳数码管0-F的显示码RETURN: NOPRETIEND。