Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
Запускайте пошаговую симуляцию и смотрите что делает та или иная прога.
Причем проги сопоставлены реальным "железкам". т.е. реально работающая система.
[img]http://pid.by.ru/img/10_min.png[/img][/url]
; ************************************************************
; LDC panel demo / software part
;
; This example include a basic LDC driving library for
; 4 bits interface. Modify it if necessary according
; to your needs. www.pid.by.ru
;
; ************************************************************
.include "..\include\8515def.inc"
.EQU OE = 0b001000 ; bit 3 Port D
.EQU RS = 0b0001004 ; bit 2 Port D
.DEF TEMP = R16 ; temporary working register
.DEF PARAM = R17 ; Parameter transfer register
.DEF DELAY = R10 ;
.DEF DELAY1 = R11 ; To generate long delays
.DEF DELAY2 = R12 ;
.CSEG
; *************************************
;
; Reset and interrupt vectors
;
.ORG 0x00
START:
rjmp RESET ; Reset vector
reti
reti
reti
reti
reti
reti
reti
reti
rjmp UART_RX ; Handle received character
reti
reti
reti
reti
reti
; ****************************************
;
; Device initialization
;
.ORG 0x10
RESET:
ldi TEMP, 0xDF ; Init stack pointer
out 0x3D, TEMP ;
ldi TEMP, 0x17 ; 00010111, setting bits for OC1, PB2 and PB4, PB0
out DDRB, TEMP ; set Port B direction as above
ldi TEMP, 0x28 ; 00101000, PB5 pullup, PB4 lo, PB3 pullup, PB2 lo, OC1 low,
out PORTB, TEMP
out PORTB, TEMP ; set Port B
ldi TEMP, 0xFC ; All outputs except bits 0,1 (UART)
out DDRD, TEMP ;
rcall LCD_SETUP; ; Initialize LCD and send
rcall LCD_HELLO; ; a welcome message
ldi TEMP, 12 ; Set UART 4800 bauds for 1 MHz
out UBRR, TEMP ;
ldi TEMP, 0xF8 ; Activate all interrupts and TX/RCV
out UCR, TEMP ; and go !
sei
FOREVER: ; Endless loop. RX interrupt
nop ; will do the job
nop ;
rjmp FOREVER; ;
UART_RX: ; Read UART chararter and
in PARAM, UDR ; send it to the LCD
rcall LCD_DATA ;
reti
; ===========================
; LCD Driving Library example
; ===========================
;
;***********************************
;
; Display setup for 4 bits interface
;
LCD_SETUP:
ldi TEMP, 10 ; Wait about 20msec after powerup
SET1: ; LCD is a quite slow,
rcall WAIT_2M ; mind delays !
dec TEMP ;
brne SET1 ;
ldi TEMP, 0b00101000 ; Set 4 bit interface (but we are
out PORTD, TEMP ; still in 8 bits!)
nop
nop ; Data write cycle must be > 1 ms
cbi PORTD, 3 ; OE low to clock in data
rcall WAIT_2M ;
; *** !! From now on, interface is 4 bits !! ***
ldi PARAM, 0b00101000 ; Send again to catch the bit N
rcall LCD_CMD ; Display is 2 lines, so N = 1
ldi PARAM, 0b00001000 ; Display off, cursor off, and blink off
rcall LCD_CMD
ldi PARAM, 0b00000001 ; Display clear
rcall LCD_CMD
rcall WAIT_2M ; Wait 2 sec after clear
ldi PARAM, 0b00000110 ; Increment RAM, dont shift display
rcall LCD_CMD
ldi PARAM, 0b00001110 ; Display on, cursor on / blink off
rcall LCD_CMD
ret
; **************************
;
; 2.3 ms delay with 1 MHz clock.
;
WAIT_2M:
push TEMP
ldi TEMP, 3
mov DELAY1, TEMP
W2_1:
clr DELAY2
dec DELAY2 ; Start at 0xFF
W2_2:
dec DELAY2
brne W2_2
dec DELAY1
brne W2_1
pop TEMP
ret
;****************************************************
;
; Display a welcome message. Mesage comes at the end
; and must be NULL ended
;
LCD_HELLO:
ldi ZH, HIGH(2*TXT)
ldi ZL, LOW(2*TXT)
L3A:
lpm ; From prog mem into R0
mov PARAM, R0
tst PARAM
brne L3B
rjmp L4
L3B:
cpi PARAM, 0x0D ; Look for CR in message (new line)
brne L3C
ldi PARAM, 0xC0 ; Cursor to position 0x40, start of 2nd line
rcall LCD_CMD ; Sends command
rjmp L3D
L3C:
rcall LCD_DATA
L3D:
adiw ZL, 1 ; Increment pointer. This neat instruction does
rjmp L3A ; w16 bit addition to pointer ZHI:ZLO.
L4:
ret ; Done
TXT:
.DB "Type in TTY cell (tx) ",0x0D ; Must contain an even
.DB ">",0x00 ; number of bytes per line
;********************************************************
;
; Sends a control function to the display (comes in PARAM)
;
LCD_CMD:
push PARAM
mov TEMP, PARAM
andi PARAM, 0xF0 ; Mask off lower 4 bits
sbr PARAM, 8 ; OE bit high (bit 3)
out PORTD, PARAM ; Send upper 4 bits to display
nop ; Brief delay to give reasonable OE
nop ; pulse width
cbi PORTD,3 ; OE goes low to clock in data
mov PARAM, TEMP ; Data back
swap PARAM ; Lower 4 bits
andi PARAM, 0xF0
sbr PARAM, 8 ; OE high (bit 3, port D)
out PORTD, PARAM ; Write lower 4 bits to LCD
nop
nop
cbi PORTD,3 ; OE clock low
ldi PARAM, 100 ; 50 usec approx
DEL0:
dec PARAM
brne DEL0
pop PARAM
ret
;*******************************************************
;
; Sends an ASCII character to the display (comes in PARAM)
;
LCD_DATA:
push PARAM
push TEMP
mov TEMP, PARAM
andi PARAM, 0xF0 ; Mask off lower 4 bits
sbr PARAM, OE ; OE bit high
sbr PARAM, RS ; Data/command bit high
out PORTD, PARAM ; Write upper 4 bits to display
nop ; Brief delay
nop
cbi PORTD, 3 ; OE low to clock data
swap TEMP ; Lower 4 bits
andi TEMP, 0xF0 ; Masked off
sbr TEMP, OE ; OE high
sbr TEMP, RS
out PORTD, TEMP ; Lower 4 bits to LCD
nop
nop
cbi PORTD, 3 ; OE low to clock data
ldi TEMP, 100
mov DELAY, TEMP ; 50 usec
DEL1:
dec DELAY
brne DEL1
pop TEMP
pop PARAM
ret
;**********************************************************
;
; Moves the LCD display cursor to address specified in PARAM
;
LCD_CURSOR:
ori PARAM, 0x80 ; MSB specifies address command
rcall LCD_CMD
ret
====
Исходники имеют построчные комментарии.