;name: upsd-blinking-led.asm ; ;description: simple programm for uPSD test board to drive blinking green LED ;(c) by Thomas Hoehn, November 2006 .module upsd-led .title led-test .radix x ;default radix hex ;SFR Registers WDKEY == 0xAE ;Watchdog Key Register IE == 0xA8 ;Interrupt Enable Register IEA == 0xA7 ;Interrupt Enable All Register TMOD == 0x89 ;Timer mode register TCON == 0x88 ;Timer control register TL0 == 0x8A ;Timer0 low byte TH0 == 0x8C ;Timer0 high byte ;Port definitions P4SFS == 0x94 ;Port 4 SFS P4SFR == 0xC0 ;Port 4 IO SFR LED_PORT_SFS == P4SFS ;Status LED Port SFS LED_PORT_SFR == P4SFR ;Status LED Port SFR ;IE and IEA register interrrupt enable bit masks IE_EA == 0x80 ;Enable all interrupts IE_ET0 == 0x02 ;Enable Timer 0 interrupt IE_ET1 == 0x08 ;Enable Timer 1 interrupt IE_ET2 == 0x20 ;Enable Timer 2 interrupt IE_EX0 == 0x01 ;Enable external interrupt Int0 IE_EX1 == 0x04 ;Enable external interrupt Int1 IE_ES == 0x10 ;Enable USART interrupt IEA_ES2 == 0x10 ;Enable USART2 interrupt IEA_EI2C == 0x02 ;Enable I2C interrupt IEA_EUSB == 0x01 ;Enable USB interrupt IEA_EDDC == 0x80 ;Enable DDC interrupt ;Timer0 bit masks TCON_TR0 == 0x10 ;Timer0 run control bit TCON_TR1 == 0x40 ;Timer1 run control bit ;status LED's OK_LED = 0x01 ;bit mask for green LED on Port 4.0 ERR_LED = 0x02 ;bit mask for red LED on Port 4.1 OK_LED_BIT = 0 ;bit (register) 0 status for green LED ;Timer0 prescaler (divisor), Timer0 freq. = clock/(12*65536) TIMER0_DIV = 26 ;program area code1, absolute address .area CODE (ABS,CSEG) .org 0x000 ;start at 0x00 after reset, before interrupt table reset:: sjmp start ;jump to programm code after interrupt table, global label ;interrupt table compromises 0x03-0x52 ;interrupt table beginn timer0_intr: ;define Timer0 interrupt routine .org 0x00B ajmp timer0 ;interrupt table end .org 0x053 ;programm code for LED control start: mov WDKEY,#0x55 ;disable watchdog timer in WDKEY SFR mov IE,#(IE_EA|IE_ET0) ;disable all interrupts except Timer0 ;turn green LED blinking to test uPSD is functional mov TMOD,#0x01 ;set Timer0 to 16bit Timer function mov TL0,#0x0 ;reset Timer0 value to 0 mov TH0,#0x0 mov r0,#TIMER0_DIV ;Init Timer0 prescaler (divisor) orl TCON,#TCON_TR0 ;set Timer0 run control bit (turn Timer0 on) ;reset status LED's (green on, red off) mov LED_PORT_SFS,#0x00 ;disable DDC function, activate GPIO for LED Port (Port 4) mov LED_PORT_SFR,#0x00 ;reset LED Port (Port 4) stop: sjmp stop ;stop with looping ;-) ;switch (green) OK LED on green_led_on: orl LED_PORT_SFR,#OK_LED ;switch on green OK LED (Port 4.0) ret ;switch (green) OK LED off green_led_off: anl LED_PORT_SFR,#(0xFF&~OK_LED) ;switch on green OK LED (Port 4.0) ret ;Timer0 interrupt routine timer0: djnz r0,1$ mov r0,#TIMER0_DIV jb OK_LED_BIT,2$ setb OK_LED_BIT acall green_led_on 1$: reti 2$: clr OK_LED_BIT acall green_led_off reti