计算总和
计算总和并存放在ADC_DH4T 和ADC_DL4(包括两个被清零的)CAL_AD_ADD:
LDI TMP4,00H;清0
LDA ADC_DL1,01H;取ADC_DL1值
ADDM ADC_DL2,01H;ADC_DL1、ADC_DL2相加
LDA ADC_DH1,01H;取ADC_DH1值
ADCM ADC_DH2,01H;ADC_DH1、ADC_DH2相加(带进位)
LDI TBR,00H;A=0
ADCM TMP4,00H;相加后不是0吗(CY=0时)??????
LDA ADC_DL2,01H
ADDM ADC_DL3,01H
LDA ADC_DH2,01H
ADCM ADC_DH3,01H
139
LDI TBR,00H
ADCM TMP4,00H
LDA ADC_DL3,01H
ADDM ADC_DL4,01H
LDA ADC_DH3,01H
ADCM ADC_DH4,01H
LDI TBR,00H
ADCM TMP4,00H
是 如何计算总和的 这个例子是将4组数据求和,TMP4是将4组数据求和后产生的最高位。
CY=0时,它等于0,这很正常,不知道你想问什么问题?
我的意思是说这四次取得数是如何实现相加的看不懂
每一级数据有高低2位,低位跟低位加(ADDM),然后把高位跟高位加再加上低位加的进位位(CY),即ADCM,做4次就加完了。
是啊,就是这样的,可是
LDI TBR,00H
ADCM TMP4,00H这两条指令在里面管什么用? ADCM指令是将M的值加上A再加上CY,而在实际操作中我们只要加上CY而不想加A,故在执行ADCM前先把A值清零。
总和除以2,得到平均值,存放在ADC_DH4T 和ADC_DL4
CAL_AD_DIV:
LDA ADC_DL4,01H
SHR
STA ADC_DL4,01H
LDA ADC_DH4,01H
SHR
STA ADC_DH4,01H
BNC $+3
LDI TBR,1000B
ORM ADC_DL4,01H
LDA TMP4,00H
SHR
BNC $+3
LDI TBR,1000B
ORM ADC_DH4,01H
;----------------------------
CAL_ADCDATA_END:
RTNI
;************************************************
为什么不判断低位的CY呢??? 为什么要判断低位的CY,判断它有什么用呢?
除以2后是要得到一个整数还是要精确到小数点后一位?
假如低位为0011的话,如果不管CY的话,经过SHR指令之后就变成0001了,那个小数就不要了,如果加上的话,就比除以2后的结果大了,那在实际应用中必须要舍去那个小数0.5??
当然是这样了,0011为3,除以2后,结果为1,余1。
对啊,那个余数如果不管CY的话,不就是没了吗?
是的,这个除2是结果取整。
你可以自己修改一下程序,把这个余数利用起来。
嗯,好的,我有机会试试
你的一个算法可以这样理解,4个8位数的加法。每两个8位数相加,结果都有可能产生进位而溢出。
第二个问题是除2运\算了。除2运\算采用的是右移运\算。我们将12数当作一个整体看。低4右移产生的其实就是12位数据的0位,而中间4右移产生的其实是4(相当于10除2等于8一样),高4位右移产生的是8(相当于100除2等于80一样).
对,如+=1。所以才有两个8位数相加的结果是12位数。最后的加0是为了记录进位标志。
所以每次的右移中低位的可以忽略,而中4和高4的是一定要保存结果的。
页:
[1]
2