📄 main.asm
字号:
;*******************************************************************************
;程序名称:用PWM方波调节LED的亮度
;硬件接法:P1.1控制LED,低电平点亮
; K3和K4分别接在P3.4、P3.5,按下时为低电平
;运行效果:按K3可调暗LED,按K4可调亮LED
;*******************************************************************************
;*******************************************************************************
;宏定义:BHS(Branch if High or Same)
;功能:单字节无符号数比较,如果大于或等于则跳转
;参数:
; x,y:要比较的两个数
; Label:跳转目标
;*******************************************************************************
BHS MACRO x, y, Label
MOV A, x
CLR C
SUBB A, y
JNC Label
ENDM
;*******************************************************************************
;宏定义:BHI(Branch if High)
;功能:单字节无符号数比较,如果大于则跳转
;参数:
; x,y:要比较的两个数
; Label:跳转目标
;*******************************************************************************
BHI MACRO x, y, Label
MOV A, x
SETB C
SUBB A, y
JNC Label
ENDM
;*******************************************************************************
;宏定义:BLO(Branch if Low)
;功能:单字节无符号数比较,如果小于则跳转
;参数:
; x,y:要比较的两个数
; Label:跳转目标
;*******************************************************************************
BLO MACRO x, y, Label
MOV A, x
CLR C
SUBB A, y
JC Label
ENDM
;*******************************************************************************
;定义I/O接口
;*******************************************************************************
PWM BIT P1.1 ;PWM输出(接LED)
K3 BIT P3.4 ;按键1,使PWM方波占空比增加(LED变暗)
K4 BIT P3.5 ;按键2,使PWM方波占空比减少(LED变亮)
;*******************************************************************************
;定义PWM最大级数
;*******************************************************************************
PWM_MAX EQU 8
;*******************************************************************************
;定义全局变量
;*******************************************************************************
PwmValue DATA 0x30 ;PWM级数,分为0~PWM_MAX-1级
T1INTSVC_t DATA 0x31 ;T1中断服务函数用到的静态变量
;*******************************************************************************
;复位入口
;*******************************************************************************
ORG 0x0000
LJMP PreMain
;*******************************************************************************
;定时器T1中断入口
;*******************************************************************************
ORG 0x001B
LJMP T1INTSVC
;*******************************************************************************
;进入主程序之前的初始化
;*******************************************************************************
PreMain:
MOV SP, #0x31
MOV T1INTSVC_t, #0
LJMP main
;*******************************************************************************
;函数:unsigned char KeyScan()
;功能:键盘扫描
;返回:扫描到的键值
;*******************************************************************************
; 返回值 = ACC
KeyScan:
CLR A
JB K3, KeyScan_00
MOV A, #'+'
KeyScan_00:
JB K4, KeyScan_10
MOV A, #'-'
KeyScan_10:
RET
;*******************************************************************************
;函数:void T1INTSVC() interrupt 3
;功能:定时器T1的中断服务函数
;*******************************************************************************
T1INTSVC:
PUSH ACC
PUSH PSW
CLR TR1
MOV TH1, #0xFF
MOV TL1, #0x00
SETB TR1
INC T1INTSVC_t
BLO T1INTSVC_t, #PWM_MAX, T1INTSVC_endif1
MOV T1INTSVC_t, #0
T1INTSVC_endif1:
BHI T1INTSVC_t, PwmValue, T1INTSVC_else2
SETB PWM
SJMP T1INTSVC_endif2
T1INTSVC_else2:
CLR PWM
T1INTSVC_endif2:
POP PSW
POP ACC
RETI
;*******************************************************************************
;函数:Delay()
;功能:延时0.01~2.56s
;参数:
; t>0时,延时(t*0.01)s
; t=0时,延时2.56s
;说明:
; 晶振频率为11.0592MHz
;*******************************************************************************
; void Delay(unsigned char t)
; t = R7
Delay:
MOV TH0, #0DCH
MOV TL0, #00H
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
DJNZ R7, Delay
RET
;*******************************************************************************
;函数:SysInit()
;功能:系统初始化
;*******************************************************************************
SysInit:
ANL TMOD, #0xF0
ORL TMOD, #0x01 ;将T0设置成16位定时器
ANL TMOD, #0x0F
ORL TMOD, #0X10 ;将T1设置成16为定时器
MOV PwmValue, #(PWM_MAX/2) ;设置PWM初值
SETB PWM
MOV TH1, #0xFF
MOV TL1, #0x00
SETB TR1
SETB ET1
SETB EA
RET
;*******************************************************************************
;函数:void main()
;功能:主函数
;*******************************************************************************
main:
LCALL SysInit ;系统初始化
main_Loop1:
MOV R7, #5
LCALL Delay ;延时50ms(按键消抖动)
LCALL KeyScan ;扫描键盘
JNZ main_case1 ;如果有键按下,退出循环
SJMP main_Loop1 ;按键扫描的循环
main_case1:
CJNE A, #'+', main_case2
BHS PwmValue, #(PWM_MAX-1), main_Loop2
INC PwmValue
SJMP main_Loop2
main_case2:
CJNE A, #'-', main_Loop2
MOV A, PwmValue
JZ main_Loop2
DEC PwmValue
main_Loop2:
MOV R7, #5
LCALL Delay ;延时50ms
LCALL KeyScan ;按键扫描
JZ main_Loop1 ;如果按键抬起,退出循环
SJMP main_Loop2
;*******************************************************************************
;程序结束
;*******************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -