📄 spwm.asm
字号:
SPEED EQU 30H
T5ms EQU 31H ;TIMER0' PERIOD
LED0 EQU 32H ;dISPLAY BUFFER
LED1 EQU 33H
LED2 EQU 34H
LED3 EQU 35H
LED_DIS EQU 36H
TEMP EQU 37H
KEY_TIME EQU 38H
KEY_PRE EQU 39H
KEY_VALUE EQU 3AH
PWMKONG EQU 3BH
PWMTEMP EQU 3CH
PWMSU0 EQU 3DH
PWMSU1 EQU 3EH
PWMSU2 EQU 3FH
PWMSU3 EQU 40H
P1CON EQU 09BH ;設定SFR內P1CON的位址
SPWMC EQU 0A3H ;設定SFR內SPWMC的位址
SPWMD0 EQU 0A4H ;設定SFR內SPWMD0的位址
SPWMD1 EQU 0A5H ;設定SFR內SPWMD1的位址
SPWMD2 EQU 0A6H ;設定SFR內SPWMD2的位址
SPWMD3 EQU 0A7H ;設定SFR內SPWMD3的位址
T5msFLAG BIT 10H
KEY_FLAG BIT 12H
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIMER0
ORG 0100H
MAIN: LCALL INITSYSTEM
LOOP: JNB P3.2,TONGXUN
LCALL DISPLAY
JNB T5msFLAG,LOOP
CLR T5msFLAG
MOV A, T5ms
MOV B,#03H
DIV AB
MOV TEMP,B
MOV A,TEMP
CJNE A,#00,TASK1
TASK0: LCALL DISPLAY
AJMP BACK
TASK1: CJNE A,#01,TASK2
LCALL KEYIN
LCALL KEY_DISPOSE
AJMP BACK
TASK2:
LCALL PWM
BACK:
AJMP LOOP
SJMP $
TIMER0:PUSH ACC
PUSH B
MOV TH0,#0c5H;延时子程序3
MOV TL0,#68H
SETB T5msFLAG
INC T5ms
MOV A,T5ms
MOV B,#03H
DIV AB
MOV T5ms,B
JNB KEY_FLAG, T0_BACK
INC KEY_TIME
T0_BACK:POP B
POP ACC
RETI
TONGXUN:
MOV SBUF,#55H
MOV R7,#10H
DL1:MOV R6,#0F8H
DJNZ R6,$
COMINT:JNB TI,RXDINT
CLR TI
RET
RXDINT:CLR RI
JB F0,SEND
MOV A,SBUF
CJNE A,#55H,NEXT
SETB F0
SJMP SENDD
SEND:MOV A,SBUF
CJNE A,#0FH,ERROR
SENDD:MOV A,@R0
MOV C,PSW.0
MOV TB8,C
MOV SBUF,A
INC R0
DJNZ R1,NEXT
CLR ES
MOV P1,#00H
NEXT:RET
ERROR:DEC R0
INC R1
SJMP SENDD
DISPLAY:
PUSH ACC
PUSH B
INC LED_DIS
MOV A,LED_DIS
MOV B,#04H
DIV AB
MOV LED_DIS,B
MOV A, LED_DIS
CLED0:CJNE A,#00H,CLED1
MOV TEMP, LED0
MOV A,TEMP
MOV DPTR,#WORDTAB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
CLR P2.2
CLR P2.1
SETB P2.0
AJMP XIAN
CLED1: CJNE A,#01H,CLED2
MOV TEMP, LED1
MOV A,TEMP
MOV DPTR,#WORDTAB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
CLR P2.2
CLR P2.0
SETB P2.1
AJMP XIAN
CLED2: CJNE A,#02H,CLED3
MOV TEMP, LED2
MOV A,TEMP
MOV DPTR,#WORDTAB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
CLR P2.1
CLR P2.0
SETB P2.2
AJMP XIAN
CLED3:MOV TEMP, LED3
MOV A,TEMP
MOV DPTR,#WORDTAB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
CLR P2.2
CLR P2.1
SETB P2.3
XIAN: POP B
POP ACC
RET
WORDTAB: DB 3FH,06H,5BH,4FH ;"0","1","2","3"
DB 66H,6DH,7DH,07H ;"4","5","6","7"
DB 7FH,6FH ;8,9,a,b,c,d,e,f
KEYIN: PUSH ACC
PUSH B
JNB P2.4,KEY_DOWN
JNB P2.5,KEY_DOWN
JNB P2.6,KEY_DOWN
JNB P2.7,KEY_DOWN
AJMP KEY_BACK
KEY_DOWN:
inc key_time
MOV A,KEY_TIME
CJNE A,#04H,KEY_BACK
MOV KEY_TIME,#00H
JNB P2.4,KEY_DOWN1
JNB P2.5,KEY_DOWN2
JNB P2.6,KEY_DOWN3
JNB P2.7,KEY_DOWN4
AJMP KEY_BACK
KEY_DOWN1:
MOV A,#01H
AJMP PAN
KEY_DOWN2:
MOV A,#02H
AJMP PAN
KEY_DOWN3:
MOV A,#03H
AJMP PAN
KEY_DOWN4:
MOV A,#04H
PAN:
CJNE A,#01H,KEY1
KEY0: MOV KEY_VALUE,#00H
AJMP KEY_BACK
KEY1: CJNE A,#02H,KEY2
MOV KEY_VALUE,#01H
AJMP KEY_BACK
KEY2: CJNE A,#03H,KEY3
MOV KEY_VALUE,#02H
AJMP KEY_BACK
KEY3: MOV KEY_VALUE,#03H
AJMP KEY_BACK
KEY_BACK:POP B
POP ACC
RET
KEY_DISPOSE:
PUSH ACC
PUSH B
MOV A,KEY_VALUE
START_KEY:
CJNE A,#00H,KEY_D1
KEY_D0:INC SPEED
ajmp fenjie
KEY_D1:CJNE A,#01H,KEY_D2 ;INCRESE SPEED
DEC SPEED
ajmp fenjie
KEY_D2:CJNE A,#02H,KEY_D3 ;INCRESE SPEED +10
MOV A,SPEED
ADD A,#0AH
mov speed,a
ajmp fenjie
KEY_D3:CJNE A,#03H,KEY_DBACK ; DECRESE SPEED -10
MOV A,SPEED
SUBB A,#0AH
mov speed,a
fenjie:MOV A,SPEED ;百位
mov b,#64h
div ab
mov led3,a
mov temp,b
mov a,temp
mov b,#10
div ab
mov led2,a
mov temp,b
mov a,temp
MOV LED1,A
CPL P1.0
CPL P1.1
MOV KEY_VALUE,#0FFH
KEY_DBACK:POP B
POP ACC
RET
PWM: PUSH ACC
PUSH B
LOOP1:INC PWMTEMP
MOV A,PWMTEMP
MOV B,#04H
DIV AB
MOV PWMTEMP,B
MOV A,PWMTEMP
PWM0:CJNE A,#00H,PWM1
MOV A,PWMSU0
MOV DPTR,#SINTAB
MOVC A,@A+DPTR
MOV SPWMD0,A
INC PWMSU0
AJMP PWMBACK
PWM1:CJNE A,#01H,PWM2
MOV A,PWMSU1
MOV DPTR,#SINTAB
MOVC A,@A+DPTR
MOV SPWMD1,A
INC PWMSU1
AJMP PWMBACK
PWM2:CJNE A,#02H,PWM3
MOV A,PWMSU2
MOV DPTR,#SINTAB
MOVC A,@A+DPTR
MOV SPWMD2,A
INC PWMSU2
AJMP PWMBACK
PWM3:
MOV A,PWMSU3
MOV DPTR,#SINTAB
MOVC A,@A+DPTR
MOV SPWMD3,A
INC PWMSU3
PWMBACK:
POP B
POP ACC
RET
SINTAB:DB 7DH,80H,83H,86H,89H,8CH,8FH,92H,95H,98H,
DB 9BH,9EH,0A1H,0A4H,0A7H,0AAH,0ADH,0B0H,0B2H,0B5H,0B8H,
DB 0BBH,0BDH,0C0H,0C2H,0C5H,0C7H,0CAH,0CCH,0CFH,0D1H,0D3H,
DB 0D5H,0D7H,0DAH,0DCH,0DEH,0E0H,0E1H,0E3H,0E5H,0E7H,0E8H,
DB 0EAH,0EBH,0EDH,0EEH,0EFH,0F0H,0F2H,0F3H,0F4H,0F5H,0F6H,
DB 0F7H,0F7H,0F8H,0F8H,0F9H,0F9H,0F9H,0FAH,0FAH,0FAH,0FAH,
DB 0FAH,0FAH,0F9H,0F9H,0F9H,0F8H,0F8H,0F7H,0F6H,0F5H,0F5H,
DB 0F4H,0F3H,0F2H,0F0H,0EFH,0EEH,0EDH,0EBH,0EAH,0E8H,0E7H,
DB 0E5H,0E3H,0E1H,0E0H,0DEH,0DCH,0DAH,0D7H,0D5H,0D3H,0D1H,
DB 0CFH,0CCH,0CAH,0C7H,0C5H,0C2H,0C0H,0BDH,0BBH,0B8H,0B5H,
DB 0B2H,0B0H,0ADH,0AAH,0A7H,0A4H,0A1H,9EH,9BH,98H,95H,
DB 92H,8FH,8CH,89H,86H,83H,80H,7DH
DB 7DH,80H,83H,86H,89H,8CH,8FH,92H,95H,98H,
DB 9BH,9EH,0A1H,0A4H,0A7H,0AAH,0ADH,0B0H,0B2H,0B5H,0B8H,
DB 0BBH,0BDH,0C0H,0C2H,0C5H,0C7H,0CAH,0CCH,0CFH,0D1H,0D3H,
DB 0D5H,0D7H,0DAH,0DCH,0DEH,0E0H,0E1H,0E3H,0E5H,0E7H,0E8H,
DB 0EAH,0EBH,0EDH,0EEH,0EFH,0F0H,0F2H,0F3H,0F4H,0F5H,0F6H,
DB 0F7H,0F7H,0F8H,0F8H,0F9H,0F9H,0F9H,0FAH,0FAH,0FAH,0FAH,
DB 0FAH,0FAH,0F9H,0F9H,0F9H,0F8H,0F8H,0F7H,0F6H,0F5H,0F5H,
DB 0F4H,0F3H,0F2H,0F0H,0EFH,0EEH,0EDH,0EBH,0EAH,0E8H,0E7H,
DB 0E5H,0E3H,0E1H,0E0H,0DEH,0DCH,0DAH,0D7H,0D5H,0D3H,0D1H,
DB 0CFH,0CCH,0CAH,0C7H,0C5H,0C2H,0C0H,0BDH,0BBH,0B8H,0B5H,
DB 0B2H,0B0H,0ADH,0AAH,0A7H,0A4H,0A1H,9EH,9BH,98H,95H,
DB 92H,8FH,8CH,89H,86H,83H,80H,7DH
INITSYSTEM:
MOV SPEED,#96H ;存速度的初值
MOV TMOD,#01H ;初始化定时器
MOV TH0,#0c5H
MOV TL0,#68H
MOV T5ms,#00H ; 初始化各变量初值
CLR T5msFLAG
CLR KEY_FLAG
MOV LED_DIS,#00H
MOV KEY_VALUE,#0FFH
MOV KEY_TIME,#00H
MOV KEY_PRE,#00H
MOV PWMTEMP,#00H
MOV P1CON,#78H ;設定P1.3-p1.6為SPWM輸出
MOV SPWMC,#03H ;設定SPWM的頻率 (Divider=16)
MOV SPWMD0,#083H ;設定輸出波形
MOV SPWMD1,#023H
MOV SPWMD2,#083H
MOV SPWMD3,#023H
MOV PWMSU0,#00H ;設定相位
MOV PWMSU1,#3FH
MOV PWMSU2,#7FH
MOV PWMSU3,#0C0H
SETB EA ; 计数开始,允许中断
SETB ET0
SETB TR0
clr p1
MOV LED0,#00H ; 初始化各管子初值
MOV LED1,#00H
MOV LED2,#05H
MOV LED3,#01H
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -