?? main.asm
字號:
//step motor driver //
//A0--黃線,A1--茶線,A2--綠線,A3--青線,A4完成開關(guān)次數(shù)后的指示燈//
//功能:實(shí)現(xiàn)步進(jìn)電機(jī)以90度角正反旋轉(zhuǎn),開關(guān)9999次后亮LED燈//
//共陰極四位8段數(shù)碼管//
//內(nèi)部計(jì)算顯示,0~9999的顯示//
//A8~A15控制數(shù)值,B8~B15控制位選//
//code by ohf//
.DEFINE P_IOA_Data 0x7000;
.DEFINE P_IOA_Dir 0x7002;
.DEFINE P_IOA_Attrib 0x7003;
.DEFINE P_IOB_Data 0x7005;
.DEFINE P_IOB_Dir 0x7007;
.DEFINE P_IOB_Attrib 0x7008;
.DEFINE P_Watchdog_Clear 0x7012;
.RAM //變量單元地址段預(yù)定義
.var COUNTER_1; //定義延時(shí)外循環(huán)計(jì)數(shù)器1
.var COUNTER_2; //定義延時(shí)內(nèi)循環(huán)計(jì)數(shù)器2
.var COUNTER_3; //顯示時(shí)間延時(shí)參數(shù)
.var COUNTER1; //定義延時(shí)外循環(huán)計(jì)數(shù)器1
.var COUNTER2; //定義延時(shí)外循環(huán)計(jì)數(shù)器2
.var angle; //旋轉(zhuǎn)角度
.Var display_number; //顯示的數(shù)值,即開關(guān)的次數(shù)
.var qian_ADDRESS; //千位地址變量
.var bai_ADDRESS; //百位地址變量
.var shi_ADDRESS; //十位地址變量
.var ge_ADDRESS; //個(gè)位地址變量
.DATA
LED_ADDRESS: .DW 0xB700,0x0600,0x7300,0x5700,0xC600,0xD500,0xF500,0x0700,0xF700,0xD700; //'0''1''2''3''4''5''6''7''8''9'的代碼,接A口
LED_dig: .DW 0x0100,0x0200,0x0400,0x0800; //'個(gè)位','十位','百位','千位'代碼,接B口
step_code: .DW 0x0001,0x0003,0x0002,0x0006,0x0004,0x000C,0x0008,0x0009 //每步的代碼,CCW
step_code1: .DW 0x0009,0x0008,0x000c,0x0004,0x0006,0x0002,0x0003,0x0001 //每步的代碼,CW
.CODE //主程序單元地址段預(yù)定義
.PUBLIC _main; //定義主程序
_main:
call io_int; //IO口初始化,A與B口都為低電平輸出口
R2=0;
[display_number]=R2; //開關(guān)次數(shù)初始為零
Loop_main:
R2=0x0096; //設(shè)置旋轉(zhuǎn)角90度
call step_rotor_CCW; //CCW轉(zhuǎn)動(dòng)90度
R2=0x0096; //設(shè)置旋轉(zhuǎn)角90度
call step_rotor_CW; //CW轉(zhuǎn)動(dòng)90度
R2=[display_number]; //開關(guān)次數(shù)顯示數(shù)值加一
R2+=1;
[display_number]=R2;
call kaiguan_disp; //顯示開關(guān)次數(shù)
R2=[display_number];
cmp R2,9999;
JAE Loop_stop; //大于或等于9999,則停止運(yùn)行
JMP Loop_main; //小于9999,繼續(xù)循環(huán)開關(guān)
Loop_stop:
call kaiguan_disp; //顯示開關(guān)次數(shù)
jmp Loop_stop; //停止開關(guān),循環(huán)顯示次數(shù)
kaiguan_disp:.proc //開關(guān)次數(shù)顯示
R1=0x002F; //延時(shí)參數(shù)
[COUNTER_3]=R1;
display_loop_1:
call display; //數(shù)值顯示
R1=[COUNTER_3]
R1-=0x0001;
[COUNTER_3]=R1;
JNZ display_loop_1;
RETF; //子程序返回
.endp
io_int: .proc //程序初始化
R1=0xFFFF; //設(shè)定IOA0口為帶數(shù)據(jù)緩存器的輸出口
[P_IOA_Dir]=R1;
[P_IOA_Attrib]=R1;
[P_IOB_Dir]=R1;
[P_IOB_Attrib]=R1;
R1=0x0000;
[P_IOA_Data]=R1; //IOA0初始化 低電平輸出
[P_IOB_Data]=R1; //IOA0初始化 低電平輸出
RETF; //子程序返回
.endp
step_rotor_CCW: .proc //CCW轉(zhuǎn)向子程序
main_loop:
[angle]=R2; //旋轉(zhuǎn)角度
BP=step_code; //送CCW步進(jìn)代碼
ccw_loop:
R1=[BP];
[P_IOA_Data]=R1; //步進(jìn)代碼送輸出口
CALL DELAY; //調(diào)用延時(shí)子程序0.01秒
BP=BP+1; //下一步代碼
cmp R1,0x0009; //判斷是否完成一周
jne ccw_loop; //沒完成跳轉(zhuǎn)下一步
R2=[angle]
R2-=1;
cmp R2,0x0000; //判斷是否完成旋轉(zhuǎn)角度
jne main_loop; //未完成旋轉(zhuǎn)角度則繼續(xù)執(zhí)行
R1=0x0000;
[P_IOA_Data]=R1; //電機(jī)停止轉(zhuǎn)動(dòng)1秒
CALL DELAY1; //調(diào)用延時(shí)子程序1秒
CALL DELAY1; //調(diào)用延時(shí)子程序1秒
RETF; //子程序返回
.endp
step_rotor_CW: .proc //CCW轉(zhuǎn)向子程序
main_loop1:
[angle]=R2;
BP=step_code1; //送步進(jìn)代碼首地址
cw_loop:
R1=[BP];
[P_IOA_Data]=R1; //步進(jìn)代碼送輸出口
CALL DELAY; //調(diào)用延時(shí)子程序0.01秒
BP=BP+1; //下一步代碼
cmp R1,0x0001; //判斷是否完成一周
jne cw_loop; //沒完成跳轉(zhuǎn)下一步
R2=[angle]
R2-=1;
cmp R2,0x0000; //判斷是否完成旋轉(zhuǎn)角度
jne main_loop1; //未已完成繼續(xù)循環(huán)
R1=0x0000;
[P_IOA_Data]=R1; //電機(jī)停止轉(zhuǎn)動(dòng)1秒
RETF; //子程序返回
.endp
display: .PROC; //顯示子程序定義
//BCD轉(zhuǎn)換//
R1=0x0001;
[P_Watchdog_Clear]=R1; //清狗
R2=0; //地址清零,
[qian_ADDRESS]=R2; //千位
[bai_ADDRESS]=R2; //百位
[shi_ADDRESS]=R2; //十位
[ge_ADDRESS]=R2; //個(gè)位
R1=[display_number];
cmp R1,1000; //與1000比較
jb L_baiwei; //小于1000轉(zhuǎn)跳
L_qianwei:
R1-=1000; //若大于或等于則減1000
R2=[qian_ADDRESS]; //千位變量值加一
R2+=1;
[qian_ADDRESS]=R2;
cmp R1,1000; //與1000比較
JAE L_qianwei; //若大于或等于1000則跳轉(zhuǎn)L_qianwei
L_baiwei:
cmp R1,100; //與100比較
jb L_shiwei; //小于100轉(zhuǎn)跳L_shiwei
R1-=100; //若大于或等于100則減100
R2=[bai_ADDRESS]; //百位變量值加一
R2+=1;
[bai_ADDRESS]=R2;
cmp R1,100; //與100比較
JAE L_baiwei; //若大于或等于100則跳轉(zhuǎn)L_baiwei
L_shiwei:
cmp R1,10; //與10比較
jb L_gewei; //小于10轉(zhuǎn)跳L_gewei
R1-=10; //若大于或等于10則減10
R2=[shi_ADDRESS]; //十位變量值加一
R2+=1;
[shi_ADDRESS]=R2;
cmp R1,10; //與10比較
JAE L_shiwei; //若大于或等于10則跳轉(zhuǎn)L_shiwei
L_gewei:
[ge_ADDRESS]=R1;
//顯示//
R4=0x0800;
[P_IOB_Data]=R4; //千位位選
BP=LED_ADDRESS;
BP+=[qian_ADDRESS];
R4=[BP];
[P_IOA_Data]=R4; //千位數(shù)數(shù)選
call L_DELAY; //延時(shí)
R4=0x0400;
[P_IOB_Data]=R4; //百位位選
BP=LED_ADDRESS;
BP+=[bai_ADDRESS];
R4=[BP];
[P_IOA_Data]=R4; //百位數(shù)選
call L_DELAY; //延時(shí)
R4=0x0200;
[P_IOB_Data]=R4; //十位位選
BP=LED_ADDRESS;
BP+=[shi_ADDRESS];
R4=[BP];
[P_IOA_Data]=R4; //十位數(shù)選
call L_DELAY; //延時(shí)
R4=0x0100;
[P_IOB_Data]=R4; //個(gè)位位選
BP=LED_ADDRESS;
BP+=[ge_ADDRESS];
R4=[BP];
[P_IOA_Data]=R4; //十位數(shù)選
call L_DELAY; //延時(shí)
RETF; //子程序返回
.endp //延時(shí)子程序結(jié)束定義
DELAY: .proc //延時(shí)子程序起始定義 延時(shí)0.01秒
R2=0x01EF; //定義外循環(huán)計(jì)數(shù)器初值
[COUNTER1]=R2;
loop1: //循環(huán)
R2=[COUNTER1];
R2-=0x0001; //循環(huán)計(jì)數(shù)器減1
[COUNTER1]=R2;
JNZ loop1; //計(jì)數(shù)值不為零跳轉(zhuǎn)LOOP1 溢出則執(zhí)行下一條指令
R3=0x0001;
[P_Watchdog_Clear]=R3; //清狗
RETF; //子程序返回
.endp
DELAY1: .proc //延時(shí)子程序起始定義 延時(shí)2秒
R2=0xffff; //定義外循環(huán)計(jì)數(shù)器初值
[COUNTER2]=R2;
loop2: //循環(huán)
R2=[COUNTER2];
R2-=0x0001; //循環(huán)計(jì)數(shù)器減1
[COUNTER2]=R2;
JNZ loop2; //計(jì)數(shù)值不為零跳轉(zhuǎn)LOOP1 溢出則執(zhí)行下一條指令
R3=0x0001;
[P_Watchdog_Clear]=R3; //清狗
RETF; //子程序返回
.endp
L_DELAY: .proc //延時(shí)子程序起始定義 延時(shí)10豪秒
R2=0x0001; //定義外循環(huán)計(jì)數(shù)器初值
[COUNTER_1]=R2;
loop_1: //外循環(huán)
R2=0xFD6A; //定義內(nèi)循環(huán)計(jì)數(shù)器初值
[COUNTER_2]=R2;
loop_2: //內(nèi)循環(huán) 內(nèi)循環(huán)結(jié)束延時(shí)0.01秒
R2=0x0001;
[P_Watchdog_Clear]=R2; //清狗
R2=[COUNTER_2];
R2+=0x0001; //內(nèi)循環(huán)計(jì)數(shù)器加1
[COUNTER_2]=R2;
JNZ loop_2; //計(jì)數(shù)值不為零跳轉(zhuǎn)loop_2 溢出則執(zhí)行下一條指令
R2=[COUNTER_1];
R2-=0x0001; //外循環(huán)計(jì)數(shù)器減1
[COUNTER_1]=R2;
JNZ loop_1; //計(jì)數(shù)值不為零跳轉(zhuǎn)loop_1 溢出則執(zhí)行下一條指令
RETF; //子程序返回
.endp //延時(shí)子程序結(jié)束定義
.end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -