CMS汇编比较unsigned int类型的两个数大小
在项目中需要用到CMS汇编。实现时钟的按键调节。按+键要以10min加,按减键以1min减,范围是00:00-04:00。编写一个子程序来实现,达到这类型的功能通用。
如果要用C来表示如下:
uchar Var_min; //需要显示的min
uchar Var_hour; //需要显示的hour
void Maink_add_pro(uchar Var_add_value,
uchar Var_max_min,
uchar Var_max_hour,
uchar Var_mini_min,
uchar Var_mini_hour) //需注意Var_add_value不能超过60
{
if((Var_min+Var_add_value)>=60)
{
Var_min=Var_min+Var_add_value-60;
Var_hour++;
}
else
{
Var_min=Var_min+Var_add_value;
}
if(((Var_hour<<8)+Var_min)>(( Var_max_hour<<8)+Var_max_min))
{
Var_hour=Var_mini_hour;
Var_min=Var_mini_min;
}
}
void Maink_dec_pro(uchar Var_dec_value,
uchar Var_max_min,
uchar Var_max_hour,
uchar Var_mini_min,
uchar Var_mini_hour) //需注意Var_dec_value不能超过60
{
if(Var_min>=Var_dec_value)
{
Var_min-=Var_dec_value;
}
else
{
if(Var_hour>0)
{
Var_hour--;
Var_min=Var_min+60-Var_dec_value;
}
else
{
Var_hour=Var_max_hour;
Var_min=Var_max_min;
return;
}
}
if(((Var_hour<<8)+Var_min)<((Var_mini_hour<<8)+Var_mini_min))
{
Var_hour=Var_max_hour;
Var_min=Var_max_min;
}
}
改用CMS汇编如下:
VAR1 EQU ?
VAR2 EQU ?
VAR3 EQU ?
VAR4 EQU ?
VAR5 EQU ?
VAR6 EQU ?
VAR7 EQU ?
#define VAR_MIN VAR1
#define VAR_HOUR VAR2
#define VAR_MAX_MIN VAR3
#define VAR_MAX_HOUR VAR4
#define VAR_MINI_MIN VAR5
#define VAR_MINI_HOUR VAR6
#define VAR_ADD_NUM VAR7
#define VAR_DEC_NUM VAR7
MAINK_PRO1:
LD A,VAR_ADD_NUM
ADDR VAR_MIN
LDIA .60
SUBA VAR_MIN
SNZB FLAGS,C
JP MAINK_PRO1_ADD_1
LD VAR_MIN ,A
INCR VAR_HOUR
MAINK_PRO1_ADD_1:
LDIA VAR_MAX_HOUR
SUBA VAR_HOUR
SNZB FLAGS,C
JP MAINK_BAK ;;<max_hour
SNZB FLAGS,Z
JP MAINK_PRO1_ADD_2 ;;>max_hour
LDIA VAR_MAX_MIN ;;==max_hour
SUBA VAR_MIN
SNZB FLAGS,C
JP MAINK_BAK ;;<max_min
SNZB FLAGS,Z
JP MAINK_PRO1_ADD_2 ;;>max_min
JP MAINK_BAK ;;==max_min
MAINK_PRO1_ADD_2:
LD A,VAR_MINI_MIN
LD VAR_MIN,A
LD A,VAR_MINI_HOUR
LD VAR_HOUR,A
JP MAINK_BAK
MAINK_PRO2:
LD A,VAR_DEC_NUM
SUBA VAR_MIN
SNZB FLAGS,C
JP MAINK_PRO2_1 ;;VAR_MIN<VAR_DEC_NUM
LD VAR_MIN,A
JP MAINK_PRO2_3
MAINK_PRO2_1:
LD A,VAR_HOUR
SZB FLAGS,Z
JP MAINK_PRO2_2 ;;VAR_MIN<VAR_DEC_NUM,&&VAR_HOUR==0
DECR VAR_HOUR ;;VAR_MIN<VAR_DEC_NUM, VAR_HOUR!=0
LDIA .60
ADDR VAR_MIN
LD A,VAR_DEC_NUM
SUBA VAR_MIN
LD VAR_MIN,A ;;VAR_HOUR-=1
JP MAINK_PRO2_3 ;;60+VAR_MIN-VAR_DEC_NUM
MAINK_PRO2_2:
LD A,VAR_MAX_MIN
LD VAR_MIN,A
LD A,VAR_MAX_HOUR
LD VAR_HOUR,A
JP MAINK_BAK
MAINK_PRO2_3: ;;减去VAR_DEC_NUM后与最小值比较大小
LD A,VAR_MINI_HOUR
SUBA VAR_HOUR
SNZB FLAGS,C
JP MAINK_PRO2_2 ;; VAR_HOUR<VAR_MINI_HOUR 则赋值最大
SNZB FLAGS,Z
JP MAINK_BAK ;; VAR_HOUR>VAR_MINI_HOUR 则不处理
LD A,VAR_MINI_MIN ;; VAR_HOUR==VAR_MINI_HOUR VAR_MIN>=VAR_MINI_MIN 不处理
SUBA VAR_MIN ;; VAR_HOUR==VAR_MINI_HOUR VAR_MIN<VAR_MINI_MIN 赋值最大
SZB FLAGS,C
JP MAINK_BAK
JP MAINK_PRO2_2
MAINK_BAK:
RET