TDxxxV1.0
图4-4 并行多分支结构流程
C可以用switch…Case来实现:
switch(step) { case 0:
//侍机状态下第一次按时钟键
//按第二次设置时钟的分钟位 //按第三次时钟设置完毕
ks81();break;
case ONE_PRESS_CLOCK_KEY_C: ks82();break;
case TWO_PRESS_CLOCK_KEY_C : ks83();break;
case BESPOKE_ING_C : ks84();break;
case SELECT_TIME_C :
查询预约的时间
运行的时间
//设置好预约后再按下时钟键可以
//按时钟键之前已经设置过烹调程序表
示想预约,置预约标志bespoke_f=1
if(job_mode1== DEFROST_MODE_C) break; else ks85();break; case START_ING_C: //在开始过程中按时钟键可以查询当前正在
if(job_mode1 == DEFROST_MODE_C) ks86();break;
}
汇编的实现如下:
预约
mov a,step b0bts1 fz
;=0侍机状态按时钟键设置小时
jmp ks82
cmprs a,ONE_PRESS_CLOCK_KEY_C
jmp ks83
cmprs a,TWO_PRESS_CLOCK_KEY_C jmp ks84 ;完成时钟设置 cmprs a,BESPOKE_ING_C ;预约状态下查询时间 jmp ks85
cmprs a,SELECT_TIME_C
;选择过功能后再按时钟键表示要
jmp ks86 key81: key82: key83: key84:
jmp jmp jmp jmp
key89 key89 key89 key89
26
TDxxxV1.0
key85: key86: key89:
jmp jmp ret
key89 key89
4.3循环结构
N P为真? Y A
图4-5 While型循环
While型循环的C语言实现:
tempbuf = 0;
while(tempbuf==15){++tempbuf;}
While型循环的汇编实现:
Loop:
Clr y B0mov a,y Cmprs a,#15 Jmp $+2 Jmp decms
loop90 y loop
;delay //delay
jmp
loop90:
RET
27
TDxxxV1.0
A Y P为真? N
图4-6 Do…while 循环
Do…while 循环的C实现:
unsigned int * pyz = (unsigned int *)0x7f; do{ *pyz = 0x00;
--i; }while(i);
Do…while 循环的汇编实现:
ClrRAM:
clr Y b0mov Z,#0x7f
;Select bank 0 ;Set @YZ address from 7fh
ClrRAM10:
clr @YZ
;Clear @YZ content ;z = z - 1 , skip next if z=0 ;Clear address 0x00
decms Z jmp ClrRAM10 clr @YZ mov a,#00H
28
TDxxxV1.0
五、函数
函数在C当中占有相当重要的地位,它是组成程序的元素。函数的定义、函数的调用构成C程序的主要结构。而以单片机为对象的编程又与通用C 的编程略有不同,主要表现在全局变量与函数参数的选择上以及参数类型的选择上。
5.1 函数定义
函数是完成一定的功能的模块,函数的出现使代码可以得以复用,可以大大减少产生的代码量,这是使用函数最为充分的理由。但是,从另一方面来看,函数基本都涉及参数的传递,若是处理不好就很容易产生参数传递的冗余代码,还有就是调用函数就一定涉及到入栈和出栈的处理,这些都占用CPU的资源,影响程序的实时性,若函数调用过于频繁,势必影响程序的执行效率。所以函数定义之前要考虑函数的划分,函数功能既不能覆盖过大,也不能覆盖过小,使函数的划分太细。
SN8 C 函数声明方式:
返回值类型 函数名(形参1数据类型,形参2数据类型,??);
函数定义方式:
返回值类型 函数名(参数列表) {
函数体; }
无返回值,无参数函数定义:
Void 函数名(void){}
Note: 对于无返回值的函数,都要声明是void,以免系统为其预留空间!
在C当中,函数都应该先声明,后调用,标准C的写法一般是先在程序的开头声明要用到
的函数,然后在程序中编写完整的函数,我们先来看看C的函数。
如:
unsigned int bcd(unsigned int); . .
clock_min = bcd(clock_min);
29
TDxxxV1.0
. . .
unsigned int bcd(unsigned int input) { unsigned int result_buf; }
result_buf = input & 0x0f; if(result_buf > 0x0a) { result_buf = input + 6; } else {
result_buf = input;
}
return(result_buf);
上面的函数完成一个固定的功能,能提供给程序中任意一个地方来调用并完成所需的功能,在C中都是通过给予不同的参数来得到需要的计算结果,这样就可以节省代码量,使程序得到复用。
其实汇编一样可以写成函数形式,这样就可以起到和C一样的效果,我们来看看汇编是怎么来完成的。
如:
调用点的汇编代码:
mov
a,clock_min
b0mov y,a call bcd mov
clock_min,a
功能函数代码:
bcd: b0mov a,y
30
;调整前的数放在Y
and cmprs nop b0bts0
a,#0fh a,#0ah fc
jmp $+3 b0mov a,y ret
b0mov a,y add a,#6h ret
;调整后的数放在a

