📄 main.asm
字号:
//*****************************************************************************/
// 描述: 实现正弦波、三角波、锯齿波三种波形输出,
// 用3个按键实现不同波形的输出。
//*****************************************************************************/
.INCLUDE hardware.inc;
.INCLUDE key.inc;
.DEFINE p_system_clock 0x7013;
.DEFINE P_WatchDog_Clear 0x7012;
.RAM
.VAR I_Key;
.iram
.var R_SUM=0x0001,s=0;
//=========================================================================/
//正弦数据表
//=========================================================================/
.data
TBsin:
.dw 0x8000,0xb5fb,0xb8f8,0x8000,0x4c47, 0x4680;///
.CODE
//=============================================================================
// 函数: main()
// 描述:主函数
//=============================================================================
.PUBLIC _main;
_main:
r2=0x0088;
[p_system_clock]=r2; //设置工作频率
R2=0x0000;
[P_DAC_Ctrl]=R2;
CALL L_User_Init_IO; //初始化IO口
CALL F_Key_Scan_Initial; //键盘初始化
L_MainLoop:
CALL F_Key_Scan_ServiceLoop; //扫描键盘
CALL F_Key_DebounceCnt_Down; //按键去抖
R4=0x0001; //清看门狗
[P_Watchdog_Clear]=R4;
CALL F_SP_GetCh; //取键值
CMP R1, 0x0008;
JE L_MainLoop;
R2=0x0000
[I_Key] = R1; //保存键值
cmp R1, 0x0001;
je L_Wave1; //键1按下,输出锯齿波
R1=[I_Key];
cmp R1, 0x0002;
je L_Wave2; //键2按下,输出三角波
R1=[I_Key];
cmp R1, 0x0004;
je L_sina; //键3按下,输出正弦波
R4=0x0001; //清看门狗
[P_Watchdog_Clear]=R4;
JMP L_MainLoop;
L_User_Init_IO:
R1 = 0x0000; //设A口为带下拉电阻的输入
[P_IOA_Dir] = R1;
[P_IOA_Attrib] = R1;
[P_IOA_Data] = R1;
RETF;
//==========================================================================
//锯齿波
//==========================================================================
L_Wave1:
R3=0x0040 //D/A转换为10位,即B15~B6
[P_DAC1]=R2;
[P_DAC2]=R2;
CALL L_Delay //调用延时
R2+=R3
R1 = [P_IOA_Data]
cmp R1, 0x0001
jbe L_Wave1
jmp L_MainLoop; //有其它键按下,则返回键盘扫描子程序
L_Delay: //延时
R1=0
L_DelayLoop:
R4 = 0x0001;
[P_WatchDog_Clear] = R4;
R1+=2048
JNZ L_DelayLoop
RETF
//==========================================================================
//三角波
//==========================================================================
L_Wave2:
R3=0x0100 //D/A转换为10位,即B15~B6 改变它的频率
[P_DAC1]=R2;
[P_DAC2]=R2;
CALL L_Delay //调用延时
R2+=R3;
cmp R2, 0xff00; //判断是否达到峰值, 还可以改变他的幅值
je L_Sub;
R1 = [P_IOA_Data]
R1|= 0x0002
cmp R1, 0x0002
je L_Wave2
GOTO L_MainLoop //有其它键按下,则返回键盘扫描子程序
L_Sub:
[P_DAC1]=R2;
[P_DAC2]=R2;
CALL L_Delay
R2-=R3;
cmp R2, 0x0000; //判断是否为零
jne L_Sub;
jmp L_Wave2;
//==========================================================================
//正弦波
//==========================================================================
L_sina:
//r2=0x8000;
//[P_DAC1]=r2
// [P_DAC2]=r2
bp=TBsin;
r4 = 0x0000;
//[P_DAC1]=r2
//[P_DAC2]=r2
//r3=0
//[R_SUM]=r3
//r2=0x4000
//[P_DAC1]=r2
//[P_DAC2]=r2
L_wait:
//r2=0x0001
//[P_DAC1]=r2
//[P_DAC2]=r2
r3=bp+[s]; //取相应地址
r2=[r3];
r4=r4+1;
[s]=r4; //地址中数据送r2
//r3=[R_SUM]
//r3=r3+[s]
//r3=r3+1 //地址指针加1
//[R_SUM]=[R_SUM]+1;
[P_DAC1]=r2
//[P_DAC2]=r2
//r4=50
cmp r4,5
jb L_wait
R4 = 0x0001;
[P_WatchDog_Clear] = R4; //清看门狗
//sr&=0xffdf
R1 = [P_IOA_Data]
R1|= 0x0004
cmp R1, 0x0004
je L_next
goto L_MainLoop //有其它键按下,则返回键盘扫描子程序
L_next:
r2=0x0040
[P_DAC1]=r2
[P_DAC2]=r2
goto L_sina
//*****************************************************************************/
// main.asm 结束
//*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -