📄 e2.asm
字号:
PWMH DATA 30H //高电平脉冲的个数
PWM DATA 31H //PWM周期
COUNTER DATA 32H
TEMP DATA 33H
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INTT0
ORG 0100H
MAIN: MOV SP,#60H //给堆栈指针赋初值
MOV PWMH,#02H
MOV COUNTER,#01H
MOV PWM,#15H
MOV TMOD,#02H //定时器0在模式2下工作
MOV TL0,#38H //定时器每200us产生一次溢出
MOV TH0,#38H //自动重装的值
SETB ET0 //使能在定时器0中断
SETB EA //使能总中断
SETB TR0 //开始计时
KSCAN: JNB P1.1,K1CHECK //扫描KEY1
JNB P1.2,K2CHECK //扫描KEY2,如果按下KEY2就跳转到KEY2处理
SJMP KSCAN
K1CHECK:
JB P1.1,K1HANDLE //去抖动,按下KEY1后跳至KEY1处理
SJMP K1HANDLE
K1HANDLE:
MOV A,PWMH
CJNE A,PWM,K1H0 //判断是否到达上边界
SJMP KSAN //是则不进行任何操作
K1H0: MOV A,PWMH
INC A
CJNE A,PWM,K1H1 //如果在加1后到达最大值
CLR TR0 //定时器停止
SETB P1.0 //P1.0为高电平
SJMP K1H2
K1H1: CJNE A,#02H,K1H2 //如果加1后到达下边界
SETB TR0 //重开定时器
K1H2: INC PWMH //增加占空比
SJMP KSAN
K2CHECK:
JB P1.2,K2HANDLE ////去抖动,按下KEY2后跳至KEY2处理
SJMP K1HANDLE
K2HANDLE:
MOV A,PWMPH
CJNE A,#01H,K2H0 //判断是否到达下边界
SJMP KSCAN //是则不进行任何操作
K2H0: MOV A,PWMH
MOV TEMP,PWM
DEC A
CJNE A,#01H,K2H1 //如果减1后到达下边界
CLR TR0 //定时器停止
CLR P1.0 //置P1.0低电平
SJMP K2H2
K2H1: DEC TEMP
CJNE A,TEMP,K2H2 //如果到达上边界
SETB TR0 //启动定时器
K2H2: DEC PWMH //降低占空比
SJMP KSCAN
INTT0: PUSH PSW //现场保护
PUSH ACC
INC COUNTER //计数值加1
MOV A,COUNTER
CJNE A,PWMH,INTT01 //如果等于高电平脉冲数
CLR P1.0 //低
INTT01: CJNE A,PWM,INTT02 //如果等于周期数
MOV COUNTER,#01H //计数器复位
SETB P1.0 //高
INTT02: POP ACC //出栈
POP PSW
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -