论坛元老
 
- 积分
- 6662
- 金钱
- 6662
- 注册时间
- 2016-5-29
- 在线时间
- 910 小时
|
#include NY8A051B.h
;-------------->;工程文件名,
;-------------->;日期:
;-------------->;程序员:
;-------------->;变量定义
;-------------->ORG 0X10
;-------------->COPYA COPYS US100 MS10 STATE
COPYA EQU 0X10
COPYS EQU 0X11
US100 EQU 0X12
MS10 EQU 0X13
STATE EQU 0X14
;-------------->FLAG TIMER TIMERA I
FLAG EQU 0X15
TIMER EQU 0X16
TIMERA EQU 0X17
I EQU 0X18
;-------------->KEY LK KN
KEY EQU 0X19
LK EQU 0X1A
KN EQU 0X1B
;-------------->SLEEP_TIME
SLEEP_TIME EQU 0X1C
;--------------> WM PWMR PWMG PWMB PWMRR PWMGG PWMBB
PWM EQU 0X1D
PWMR EQU 0X1E
PWMG EQU 0X1F
PWMB EQU 0X20
PWMRR EQU 0X21
PWMGG EQU 0X22
PWMBB EQU 0X23
;宏定义,F S 两页的变量请不要定义标志位
#define C 0
#define Z 2
#define FC STATUS,C
#define FZ STATUS,Z
#define MIN_VAR_ADDR 0X10
#define MAX_VAR_ADDR 0X3F
#define SLEEP_EN FLAG,0
#define TICK FLAG,1
#define TMR0_INIT_VAL 162
#define TMR1_INIT_VAL 250
#define T0EN PCON1,0
#define T0IE INTE,0
#define T0IF INTF,0
#define WDTEN PCON,7;看门狗使能位
#define EXTIE PCON,6;外部中断,PB0引脚中断允许位
#define PORTBIE INTE,1 ORTB 电平变化中断使能位
#define T1IE INTE,3;T1 中断使能位
#define WDTIE INTE,6;看门狗 中断使能位
#define INTIE INTE,2;INT 中断使能位,软中断,一般不使用,中断向量 ORG 1
#define MAXV 100
#define LEDR PORTB,0
#define LEDG PORTB,1
#define LEDB PORTB,2
;button init val
#define PB_INIT_VAL 0X00
#define PBK 4
#define PB_INPUT 1 << PBK
#define GETKEY PORTB,PBK
#define WAKEUP_KEY 1 << PBK
ORG 0H; ---------- ORG 0H
LGOTO RESET; ---------- . RESET
ORG 8H; ---------- ORG 8H
;{
MOVAR COPYA; ---------- COPYA = A
SWAPR COPYA,1; ---------- SWAPR COPYA,1
MOVR STATUS,0; ---------- COPYS STATUS
MOVAR COPYS
BTRSS T0IF; ---------- IF T0IF ELSE .NEXT_ISR
LGOTO NEXT_ISR; ---------- .NEXT_ISR
BSR TICK; ---------- TICK 1
MOVIA TMR0_INIT_VAL; ---------- TMR0 TMR0_INIT_VAL
MOVAR TMR0
INCR PWM,1; ---------- PWM ++
MOVIA MAXV; ---------- IF PWM < MAXV
CMPAR PWM
BTRSC STATUS,C
CLRR PWM; ---------- PWM = 0
MOVR PWMR,0; ---------- LEDR = PWM < PWMR
CMPAR PWM
BTRSC STATUS,C
BCR LEDR
BTRSS STATUS,C
BSR LEDR
MOVR PWMG,0; ---------- LEDG = PWM < PWMG
CMPAR PWM
BTRSC STATUS,C
BCR LEDG
BTRSS STATUS,C
BSR LEDG
MOVR PWMB,0; ---------- LEDB = PWM < PWMB
CMPAR PWM
BTRSC STATUS,C
BCR LEDB
BTRSS STATUS,C
BSR LEDB
NEXT_ISR:
EXIT_ISR:
CLRR INTF; ---------- INTF = 0
MOVR COPYS,0; ---------- STATUS COPYS
MOVAR STATUS
SWAPR COPYA,0; ---------- SWAPR COPYA,0
RETIE; ---------- RETIE
;}
RESET:
LCALL CLR_RAM; ---------- CALL CLR_RAM
LCALL GPIO_INIT; ---------- CALL GPIO_INIT
LCALL TIMER0_INIT; ---------- CALL TIMER0_INIT
LCALL INIT; ---------- CALL INIT
BSR SLEEP_EN; ---------- SLEEP_EN = 1
ENI; ---------- ENI
MAIN:
;{
CLRWDT; ---------- CLRWDT
BTRSC TICK; ---------- IF TICK = 0 ELSE CALL PROCESS_TICK
LCALL PROCESS_TICK; ---------- LCALL PROCESS_TICK
LGOTO MAIN; ---------- JMP MAIN
;}
PROCESS_TICK:
BCR TICK; ---------- TICK = 0
DECRSZ US100,1; ---------- IF US100 -- ELSE RET
RET; ---------- RET
MOVIA 10; ---------- US100 10
MOVAR US100
LCALL MS1_EVN; ---------- CALL MS1_EVN
LCALL POWER_OFF; ---------- CALL POWER_OFF
DECRSZ MS10,1; ---------- IF MS10 -- ELSE RET
RET; ---------- RET
MOVIA 10; ---------- MS10 10
MOVAR MS10
RET; ---------- RET
;}
GPIO_INIT:
;{
MOVIA PB_INIT_VAL; ---------- PORTB PB_INIT_VAL
MOVAR PORTB
MOVIA PB_INPUT; ---------- IOSTB PB_INPUT
IOST IOSTB
CLRR BWUCON; ---------- BWUCON 0X00
CLRR BPHCON; ---------- BPHCON 0X00
RET; ---------- RET
;}
TIMER0_INIT:
;{
MOVIA TMR0_INIT_VAL; ---------- TMR0 TMR0_INIT_VAL
MOVAR TMR0
CLRA; ---------- T0MD 0X00
T0MD
BSR T0EN; ---------- T0EN 1
BSR T0IE; ---------- T0IE 1
RET; ---------- RET
;}
TIMER1_INIT:
;{
MOVIA TMR1_INIT_VAL; ---------- TMR1 TMR1_INIT_VAL
SFUN TMR1
MOVIA 0X83; ---------- T1CR1 0X83
SFUN T1CR1
CLRA; ---------- T1CR2 0X00
SFUN T1CR2
BSR T1IE; ---------- T1IE 1
RET; ---------- RET
;}
INIT:
;{
MOVIA 10; ---------- US100 10
MOVAR US100
MOVAR MS10; ---------- MS10 10
BSR WDTEN; ---------- WDTEN 1
RET; ---------- RET
;}
CLR_RAM:
;{
MOVIA MAX_VAR_ADDR; ---------- FSR MAX_VAR_ADDR
MOVAR FSR
CLR_RAM_CL:
CLRR INDF; ---------- INDF = 0
DECR FSR,1; ---------- FSR --
MOVIA MIN_VAR_ADDR; ---------- IF FSR < MIN_VAR_ADDR
CMPAR FSR
BTRSC STATUS,C
LGOTO CLR_RAM_CL; ---------- .CLR_RAM_CL
RET; ---------- RET
;}
PWM123:
PP1:
MOVR PWMRR,0; ---------- IF PWMR != PWMRR ELSE PP2
CMPAR PWMR
BTRSC STATUS,Z
LGOTO PP2; ---------- LGOTO PP2
MOVR PWMRR,0; ---------- IF PWMR < PWMRR
CMPAR PWMR
BTRSC STATUS,C
DECR PWMR,1; ---------- PWMR --
BTRSS STATUS,C; ---------- IF STATUS,C
INCR PWMR,1; ---------- PWMR ++
PP2:
MOVR PWMGG,0; ---------- IF PWMG != PWMGG ELSE PP3
CMPAR PWMG
BTRSC STATUS,Z
LGOTO PP3; ---------- LGOTO PP3
MOVR PWMGG,0; ---------- IF PWMG < PWMGG
CMPAR PWMG
BTRSC STATUS,C
DECR PWMG,1; ---------- PWMG --
BTRSS STATUS,C; ---------- IF STATUS,C
INCR PWMG,1; ---------- PWMG ++
PP3:
MOVR PWMBB,0; ---------- IF PWMB != PWMBB ELSE RET
CMPAR PWMB
BTRSC STATUS,Z
RET; ---------- RET
MOVR PWMBB,0; ---------- IF PWMB < PWMBB
CMPAR PWMB
BTRSC STATUS,C
DECR PWMB,1; ---------- PWMB --
BTRSS STATUS,C; ---------- IF STATUS,C
INCR PWMB,1; ---------- PWMB ++
RET; ---------- RET
SWEEP:
;{
CLRR KEY; ---------- KEY = 0
BTRSS GETKEY; ---------- IF GETKEY
BSR KEY,0; ---------- KEY | 1
MOVR LK,0; ---------- IF KEY = LK ELSE . NEQ
CMPAR KEY
BTRSS STATUS,Z
LGOTO NEQ; ---------- . NEQ
MOVIA 0XFF; ---------- IF KN < 0XFF ELSE RET
CMPAR KN
BTRSC STATUS,C
RET; ---------- RET
INCR KN,1; ---------- KN ++
MOVIA 4; ---------- IF KN = 4 ELSE .CHECK_KN_200
CMPAR KN
BTRSS STATUS,Z
LGOTO CHECK_KN_200; ---------- .CHECK_KN_200
DECRSZ KEY,0; ---------- IF KEY = 1 ELSE .CHECK_KEY2
LGOTO CHECK_KEY2; ---------- .CHECK_KEY2
BTRSC SLEEP_EN; ---------- IF SLEEP_EN = 0 ELSE .POWER_ON
LGOTO POWER_ON; ---------- .POWER_ON
INCR STATE,1; ---------- STATE ++
MOVIA 7; ---------- IF STATE < 7
CMPAR STATE
BTRSC STATUS,C
CLRR STATE; ---------- STATE = 0
LGOTO STATE_CHANGE; ---------- JMP STATE_CHANGE
RET; ---------- RET
CHECK_KEY2:
MOVIA 2; ---------- IF KEY = 2 ELSE RET
CMPAR KEY
BTRSS STATUS,Z
RET; ---------- RET
NOP; ---------- NOP
RET; ---------- RET
CHECK_KN_200:
MOVIA 200; ---------- IF KN = 200 ELSE RET
CMPAR KN
BTRSS STATUS,Z
RET; ---------- RET
DECRSZ KEY,0; ---------- IF KEY = 1 ELSE .LONG_KEY2
LGOTO LONG_KEY2; ---------- .LONG_KEY2
NOP; ---------- NOP
RET; ---------- RET
LONG_KEY2:
MOVIA 2; ---------- IF KEY = 2 ELSE RET
CMPAR KEY
BTRSS STATUS,Z
RET; ---------- RET
NOP; ---------- NOP
RET; ---------- RET
NEQ:
CLRR KN; ---------- KN = 0
MOVR KEY,0; ---------- LK KEY
MOVAR LK
RET; ---------- RET
;}
POWER_ON:
;{
BCR SLEEP_EN; ---------- SLEEP_EN = 0
LGOTO STATE_CHANGE; ---------- .STATE_CHANGE
RET; ---------- RET
;}
STATE_CHANGE:
;{
MOVIA MID(TABR); ---------- PWMR = TABR#STATE
SFUN TBHP
MOVIA LOW(TABR)
ADDAR STATE,0
TABLEA
NOP
MOVAR PWMR
SFUNR TBHD; ---------- PWMRR = TBHD
MOVAR PWMRR
MOVIA MID(TABG); ---------- PWMG = TABG#STATE
SFUN TBHP
MOVIA LOW(TABG)
ADDAR STATE,0
TABLEA
NOP
MOVAR PWMG
SFUNR TBHD; ---------- PWMGG = TBHD
MOVAR PWMGG
MOVIA MID(TABB); ---------- PWMB = TABB#STATE
SFUN TBHP
MOVIA LOW(TABB)
ADDAR STATE,0
TABLEA
NOP
MOVAR PWMB
SFUNR TBHD; ---------- PWMBB = TBHD
MOVAR PWMBB
RET; ---------- RET
;}
POWER_OFF_STATE:
CLRR PORTB; ---------- PORTB = 0X00
RET; ---------- RET
POWER_OFF:
;{
BTRSS SLEEP_EN; ---------- IF SLEEP_EN ELSE RET
RET; ---------- RET
INCRSZ SLEEP_TIME,1; ---------- IF SLEEP_TIME ++ ELSE RET
RET; ---------- RET
DISI; ---------- DISI
LCALL POWER_OFF_STATE; ---------- CALL POWER_OFF_STATE
MOVIA WAKEUP_KEY; ---------- BWUCON WAKEUP_KEY
MOVAR BWUCON
BSR PORTBIE; ---------- PORTBIE 1
MOVR PORTB,1; ---------- MOVR PORTB,1
BCR WDTEN; ---------- WDTEN = 0
CLRR INTF; ---------- INTF = 0
SLEEP; ---------- SLEEP
NOP; ---------- NOP
NOP; ---------- NOP
BCR PORTBIE; ---------- PORTBIE = 0
CLRR INTF; ---------- INTF = 0
MOVR PORTB,1; ---------- MOVR PORTB,1
CLRR BWUCON; ---------- BWUCON = 0
ENI; ---------- ENI
RET; ---------- RET
;}
;}
MS1_EVN:
;{
INCR TIMER,1; ---------- TIMER ++
MOVR TIMERA,0; ---------- I = TIMER ^ TIMERA
XORAR TIMER,0
MOVAR I
MOVR TIMER,0; ---------- I & TIMER
ANDAR I,1
MOVAR TIMERA; ---------- TIMERA = TIMER
BTRSC I,1; ---------- IF I.1 = 0
LCALL MS2_EVN; ---------- CALL MS2_EVN
BTRSC I,2; ---------- IF I.2 = 0
LCALL MS4_EVN; ---------- CALL MS4_EVN
BTRSS I,3; ---------- IF I.3 ELSE RET
RET; ---------- RET
LCALL SWEEP; ---------- CALL SWEEP
LCALL MS8_EVN; ---------- CALL MS8_EVN
RET; ---------- RET
;}
MS2_EVN:
RET; ---------- RET
MS4_EVN:
RET; ---------- RET
MS8_EVN:
RET; ---------- RET
ORG 1024 - 128; ---------- ORG 1024 - 128
TABR:
DW 0X0064,0X3F00,0X3F00,0X0064; ---------- DW 0X0064,0X3F00,0X3F00,0X0064
TABG:
DW 0X0032,0X0000,0X3200,0X0032; ---------- DW 0X0032,0X0000,0X3200,0X0032
TABB:
DW 0X3264,0X0064,0X3200,0X0032; ---------- DW 0X3264,0X0064,0X3200,0X0032
END
; 2018/5/27 星期日
|
|