?? pwm.asm
字號:
PWMH DATA 30H ;高電平脈沖的個數(shù)
PWM DATA 31H ;PWM周期
COUNTER DATA 32H
TEMP DATA 33H
ORG 8000H
AJMP MAIN
ORG 800BH
AJMP INTT0
ORG 8100H
MAIN:
MOV SP,#60H ;給堆棧指針賦初值
MOV PWMH,#02H ;
MOV COUNTER,#01H
MOV PWM,#15H
MOV TMOD,#02H ;定時器0在模式2下工作
MOV TL0,#38H ;定時器每200us產(chǎn)生一次溢出
MOV TH0,#38H ;自動重裝的值
SETB ET0 ;使能定時器0中斷
SETB EA ;使能總中斷
SETB TR0 ;開始計時
KSCAN:
JNB P1.1,K1CHECK ;掃描KEY1,
JNB P1.2,K2CHECK ;掃描KEY2,如果按下KEY2,跳轉(zhuǎn)到KEY2處理程序
SJMP KSCAN
K1CHECK:
JB P1.1,K1HANDLE ;去抖動,如果按下KEY1,跳轉(zhuǎn)到KEY1處理程序
SJMP K1CHECK
K1HANDLE:
MOV A,PWMH
CJNE A,PWM,K1H0 ;判斷是否到達上邊界
SJMP KSCAN ;是,則不進行任何操作
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 KSCAN
K2CHECK:
JB P1.2,K2HANDLE ;去抖動,如果按下KEY2,跳轉(zhuǎn)到KEY2處理程序
SJMP K2CHECK
K2HANDLE:
MOV A,PWMH
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 ;現(xiàn)場保護
PUSH ACC
INC COUNTER ;計數(shù)值加1
MOV A,COUNTER
CJNE A,PWMH,INTT01 ;如果等于高電平脈沖數(shù)
CLR P1.0 ;P1.0變?yōu)榈碗娖?INTT01: CJNE A,PWM,INTT02 ;如果等于周期數(shù)
MOV COUNTER,#01H ;計數(shù)器復(fù)位
SETB P1.0 ;P1.0為高電平
INTT02: POP ACC ;出棧
POP PSW
RETI
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -