c语言怎么编写子程序!

c语言怎么编写子程序!,第1张

程序参考网上的资源,在此谢谢这些无私奉献的朋友!!!

******************************************************************/

/* 实验目的: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:cseg

cseg 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")

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8101891.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存