******************************************************************/
/* 实验目的:1.掌握键盘扫描的原理以及十/十六进制的转换
* 2.了解单片机输入和输出的过程,以及如何对数据进行采集的
* 实验内容:键盘上对应有16个按键,从0到F,按下相应的键会在数码管上显示相应的数字,
* 其中K0到K15是采用4*4的方式连接的
*/
******************************************************************
0 1 2 3 ---P20
4 5 6 7 ---P21
8 9 A B ---P22
C D E F ---P23
| | | |
P24 P25 P26 P27
******************************************************************
ORG 0000h
LJMP MAIN
ORG 0030h
MAIN:
MOV DPTR,#TAB 将表头放入DPTR
LCALL KEY 调用键盘扫描程序
MOVC A,@A+DPTR 查表后将键值送入ACC
MOV P0,A将Acc值送入P0口
CLR P1.3开显示
LJMP MAIN返回调用子程序反复循环显示
KEY: LCALL KS 调用检测按键子程序
JNZ K1 有键按下继续
LCALL DELAY2 无键按下调用延时去抖动程序
AJMP KEY 返回继续检测有无按键按下
K1: LCALL DELAY2
LCALL DELAY2 有键按下继续延时去抖动
LCALL KS 再一次调用检测按键程序
JNZ K2 确认有按下进行下一步
AJMP KEY 无键按下返回继续检测
K2: MOV R2,#0EFH将扫描值送入 R2暂存
MOV R4,#00H将第一列的列值00H送入R4暂存,R4用于存放列值。
K3: MOV P2,R2 将R2的值送入P2口
L6: JB P2.0,L1 P2.0等于1跳转到L1
MOV A,#00H 将第一行的行值00H送入ACC
AJMP LK跳转到键值处理程序
L1: JB P2.1,L2 P2.1等于1跳转到L2
MOV A,#04H 将第二行的行值送入ACC
AJMP LK跳转到键值理程序进行键值处理
L2: JB P2.2,L3 P1.2等于1跳转到L3
MOV A,#08H 将第三行的行值送入ACC
AJMP LK跳转到键值处理程序
L3: JB P2.3,NEXTP2.3等于1跳转到NEXT处
MOV A,#0cH 将第四行的行值送入ACC
LK: ADD A,R4行值与列值相加后的键值送入A
PUSH ACC 将A中的值送入堆栈暂存
K4: LCALL DELAY2 调用延时去抖动程序
LCALL KS 调用按键检测程序
JNZ K4 按键没有松开继续返回检测
POP ACC将堆栈的值送入ACC
RET
NEXT:
INC R4 将列值加一
MOV A,R2将R2的值送入A
JNB ACC.7,KEY 扫描完成跳至KEY处进行下一回合的扫描
RL A扫描未完成将A中的值右移一位进行下一列的扫描
MOV R2,A将ACC的值送入R2暂存
AJMP K3 跳转到K3继续
KS: MOV P2,#0FH 将P2口高四位置0低四位值1
MOV A,P2 读P2口
XRL A,#0FH 将A中的值与A中的值相异或
RET子程序返回
DELAY2: 40ms延时去抖动子程序8*FA*2=40ms
MOV R5,#08H
L7: MOV R6,#0FAH
L8: DJNZ R6,L8
DJNZ R5,L7
RET
TAB:
DB0C0H0
DB0F9H1
DB0A4H2
DB0B0H3
DB099H4
DB092H5
DB082H6
DB0F8H7
DB080H8
DB090H9
DB088HA
DB083Hb
DB0C6HC
DB0A1Hd
DB086HE
DB08EHF
END
assume cs:csegcseg segment 代码段
start:
mov ax, 0x1234H 赋值
call fun1 调用fun1
mov ah,4ch 返回 *** 作系统
int 21h
参数在ax中
fun1 procedure 子程序(函数/过程)
mov cl, 4
mov bx, 0
mov bl, al 利用bx完成低4位取反
shl bx, cl bl高4位到bh低4位,bl低4位补0
not bl bl取反
shr bx, cl bh低4位与bl高4位,再次合成bl
mov al, bl 完成al低4位取反
or ah, 0f0h ah高4位置1
ret 返回
fun1 endp
cseg ends
end start
#include<stdio.h>int fun(int *a,int n,int x) { int i,j
for ( i=0i<ni++ ) if ( a[i]>x ) break
for ( j=0j<n-ij++ ) a[n-j]=a[n-j-1]
a[i]=xn++
return n
}
void main() { int a[8]={12,16,17,30,45,58,78},x,i,nn=7
for ( i=0i<ni++ ) printf("%d ",a[i])printf("\n")
scanf("%d",&x)n=fun(a,n,x)
for ( i=0i<ni++ ) printf("%d ",a[i])printf("\n")
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)