You are on page 1of 28

TRƯỜNG ĐẠI HỌC BÁCH KHOA

ĐẠI HỌC QUỐC GIA TP.HCM


KHOA ĐIỆN – ĐIỆN TỬ
--oOo—

PRELAB THÍ NGHIỆM


VI XỬ LÝ
GVHD: NGUYỄN TUẤN HÙNG

Nhóm: 03

Lớp: L11
Sinh Viên Thực Hiện Mã Số Sinh Viên
Hà Phước Việt Quốc 2212832
Nguyễn Trần Quang Nhật 2212400
Bùi Nhất Duy 2010178
.include "m324padef.inc"
; Replace with your application code
call USART_Init
start:
call USART_ReceiveChar
call USART_SendChar
rjmp start
;init UART 0
;CPU clock is 8Mhz
USART_Init:
; Set baud rate to 9600 bps with 8 MHz clock
ldi r16, 51
sts UBRR0L, r16
;set double speed
ldi r16, (0 << U2X0)
sts UCSR0A, r16
; Set frame format: 8 data bits, no parity, 1 stop bit
ldi r16, (1 << UCSZ01) | (1 << UCSZ00)
sts UCSR0C, r16
; Enable transmitter and receiver
ldi r16, (1 << RXEN0) | (1 << TXEN0)
sts UCSR0B, r16
ret
;send out 1 byte in r16
USART_SendChar:
push r17
; Wait for the transmitter to be ready
USART_SendChar_Wait:
lds r17, UCSR0A
sbrs r17, UDRE0 ;check USART Data Register Empty bit
rjmp USART_SendChar_Wait
sts UDR0, r16 ;send out
pop r17
ret
;receive 1 byte in r16
USART_ReceiveChar:
push r17
; Wait for the transmitter to be ready
USART_ReceiveChar_Wait:
lds r17, UCSR0A
sbrs r17, RXC0 ;check USART Receive Complete bit
rjmp USART_ReceiveChar_Wait
lds r16, UDR0 ;get data
pop r17
ret

Hình ảnh:

Đề bài phụ: Khi gửi A thì thông tin gửi về là A_Nhom_3

Code:
.ORG 0

RCALL USART_INIT

LOOP: RCALL UART_RECEIVE

RCALL UART_TRANS

MOV R20,R21

LDI ZH,HIGH(TAB<<1)

LDI ZL,LOW(TAB<<1)

L1: LPM R21,Z+

CPI R21,$00

BREQ LOOP

RCALL UART_TRANS

RJMP L1

RJMP LOOP

USART_INIT:

LDI R16,(1<<TXEN0)|(1<<RXEN0) ;Enable Transmitter

STS UCSR0B, R16

LDI R16,(1<<UCSZ01)|(1<<UCSZ00) ;8-bit data

STS UCSR0C, R16 ;no parity, 1 stop bit

LDI R16,0x00

STS UBRR0H,R16

LDI R16,51 ;baud rate = 9600 and Fosc = 8 MHz

STS UBRR0L,R16

RET

;DATA SEND IN R21

UART_TRANS:

LDS R17,UCSR0A

SBRS R17,UDRE0

RJMP UART_TRANS

STS UDR0,R21

RET
;RECEIVED DATA IN R21

UART_RECEIVE:

LDS R17,UCSR0A

SBRS R17,RXC0

RJMP UART_RECEIVE

LDS R21,UDR0

RET

TAB: .DB " - NHOM 3",$00

.DEF REG_FLAG=R19 ;REG_FLAG ch?a các c? báo


.DEF COUNT=R20 ;bi?n ??m
.DEF NUM_MAX=R21 ;bi?n ??t giá tr? MAX
.DEF NUM_MIN=R22 ;bi?n ??t giá tr? MIN
.DEF POS_CRS=R23 ;bi?n ??t v? trí con tr? hi?n th?
.EQU LCD=PORTA ;PORTA hi?n th?
.EQU LCD_DR=DDRA
.EQU CONT=PORTD ;PORTD ?i?u khi?n
.EQU CONT_DR=DDRD ;
.EQU CONT_IN=PIND ;
.EQU SW_FLG=0
.EQU RS=0 ;bit RS
.EQU RW=1 ;bit RW
.EQU E=2 ;bit E
.EQU SCL=0 ;ký hi?u chân SCL
.EQU SDA=1 ;ký hi?u chân SDA
.EQU SW1=0 ;ký hi?u chân SW1
.EQU SW2=1 ;ký hi?u chân SW2
.EQU STO=7 ;bit cho phép OSC RTC
.EQU VBATEN=3 ;bit cho phép ngu?n d? phòng
.EQU NULL=$00 ;mã k?t thúc chu?i ký t?
.EQU CTL_BYTE=0B11011110 ;byte ?i?u khi?n truy xu?t
.EQU RTC_BUF=0X200
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN: LDI R16,HIGH(RAMEND) ;??a stack lên vùng ?/c cao
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0XFF
OUT LCD_DR,R16
LDI R16,0X00
OUT LCD,R16
CBI CONT_DR,SW1 ;chân SW1 input
SBI CONT,SW1 ;?i?n tr? kéo lên chân SW1
CBI CONT_DR,SW2 ;chân SW2 input
SBI CONT,SW2 ;?i?n tr? kéo lên chân SW2
LDI R16,250 ;delay 25ms
RCALL DELAY_US ;ctc delay 100?sxR16
LDI R16,250 ;delay 25ms
RCALL DELAY_US ;ctc delay 100?sxR16
CBI LCD,RS ;RS=0 ghi l?nh
LDI R17,$30 ;mã l?nh=$30 l?n 1,RS=RW=E=0
RCALL OUT_LCD4 ;ctc ghi ra LCD
LDI R16,42 ;delay 4.2ms
RCALL DELAY_US
CBI LCD,RS
LDI R17,$30 ;mã l?nh=$30 l?n 2
RCALL OUT_LCD4
LDI R16,2 ;delay 200?s
RCALL DELAY_US
CBI LCD,RS
LDI R17,$30 ;mã l?nh=$30 l?n 3
RCALL OUT_LCD4
LDI R16,1 ;delay 100?s
RCALL DELAY_US
CBI LCD,RS
LDI R17,$20 ;mã l?nh=$20
RCALL OUT_LCD4
LDI R18,$28 ;Function set 2 dòng font 5x8,mode 4 bit
LDI R19,$01 ;Clear display
LDI R20,$0C ;display on,con tr? off
LDI R21,$06 ;Entry mode set d?ch ph?i con tr?,DDRAM t?ng
1 ?/c
;khi nh?p ký t?,màn hình không d?ch
RCALL INIT_LCD4 ;ctc kh?i ??ng LCD 4 bit
RCALL TWI_INIT
START:
LDI REG_FLAG,0 ;xóa các c? báo
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
CBI LCD,RS ;RS=0 ghi l?nh
LDI R17,$01 ;xóa màn hình
RCALL OUT_LCD
LDI R16,20 ;ch? 2ms sau l?nh Clear display
RCALL DELAY_US
LDI R17,$80 ;con tr? b?t ??u ? ??u dòng 1
RCALL CURS_POS ;xu?t l?nh ra LCD
LDI ZH,HIGH(MSG1<<1);Z tr? ??a ch? ??u b?ng MSG1 trong Flash ROM
LDI ZL,LOW(MSG1<<1)
RCALL MSG_DISP ;ghi MSG1 ra LCD
LDI R17,$C0 ;con tr? b?t ??u ? ??u dòng 2
RCALL CURS_POS ;xu?t l?nh ra LCD
LDI ZH,HIGH(MSG2<<1);Z tr? ??u b?ng tra MSG2
LDI ZL,LOW(MSG2<<1)
RCALL MSG_DISP ;ghi MSG2 ra LCD
;---------------------------------------------------------
;??t bit SQWEN=1,RS2:0=000 cho dao ??ng 1Hz
;xu?t ra chân MFP
;---------------------------------------------------------
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X07 ;??a ch? thanh ghi Control
RCALL TWI_WRITE
LDI R17,0B01000000 ;MFP xu?t xung 1Hz
RCALL TWI_WRITE
RCALL TWI_STOP
;--------------------------------------------------------
;??c các thanh ghi 0x00-0x06 RTC
;---------------------------------------------------------
START1:
LDI XH,HIGH(RTC_BUF);X tr? ??u buffer RTC
LDI XL,LOW(RTC_BUF)
LDI COUNT,7
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X00 ;??a ch? thanh ghi 0x00
RCALL TWI_WRITE
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X01);truy xu?t ??c RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+R
RTC_RD:
RCALL TWI_READ
ST X+,R17
DEC COUNT
BRNE RTC_RD
RCALL TWI_NAK
RCALL TWI_STOP
;------------------------------------------------------------------
;Hi?n th? th? gi?:phút:giây
;------------------------------------------------------------------
START2:
LDI R17,$0C ;xóa con tr?
CBI LCD,RS
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
RCALL OUT_LCD
LDI XH,HIGH(RTC_BUF+3);X tr? buffer RTC th?
LDI XL,LOW(RTC_BUF+3)
LDI R17,$84 ;con tr? b?t ??u ? dòng 1 v? trí th?
RCALL CURS_POS ;xu?t l?nh ra LCD
LD R17,X ;l?y data th?
ANDI R17,0X07
LDI R18,0X30 ;chuy?n sang mã ASCII
ADD R17,R18
SBI LCD,RS
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? ra LCD
LDI R17,0X20 ;mã d?u tr?ng
SBI LCD,RS
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? ra LCD
LDI COUNT,3
LDI R17,$86 ;con tr? b?t ??u ? dòng 1 v? trí gi?
RCALL CURS_POS ;xu?t l?nh ra LCD

DISP_NXT1:
LD R17,-X ;l?y data
CPI COUNT,1 ;data=sec
BRNE D_NXT ;khác,hi?n th? ti?p
CBR R17,(1<<STO) ;xóa bit ST
D_NXT:
RCALL NUM_DISP
DEC COUNT
BREQ QUIT1
LDI R17,':'
SBI LCD,RS
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? ra LCD
RJMP DISP_NXT1
;----------------------------------------------------
;Hi?n th? ngày/tháng/n?m
;----------------------------------------------------
QUIT1:
LDI XH,HIGH(RTC_BUF+4);X tr? buffer RTC ngày
LDI XL,LOW(RTC_BUF+4)
LDI COUNT,3
LDI R17,$C6 ;con tr? b?t ??u ? dòng 2 v? trí ngày
RCALL CURS_POS ;xu?t l?nh ra LCD
DISP_NXT2:
LD R17,X+
RCALL NUM_DISP
DEC COUNT
BREQ SW_CHK
LDI R17,'/'
SBI LCD,RS
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? ra LCD
RJMP DISP_NXT2
;------------------------------------------------------------------
;??t l?i RTC
;------------------------------------------------------------------
SW_CHK:
RCALL GET_SW ;??c SW ch? SW nh?n
SBRS REG_FLAG,SW_FLG
RJMP START1
CPI R17,1
BRNE SW_CHK
LDI R17,$0E ;hi?n th? con tr?
CBI LCD,RS
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
RCALL OUT_LCD ;xu?t l?nh ra LCD
RTC_SET:
CPI COUNT,0 ;cài ??t th??
BRNE HR_CHK ;khác,ki?m tra gi?
LDI XH,HIGH(RTC_BUF+3);X tr? buffer RTC th?
LDI XL,LOW(RTC_BUF+3)
LDI NUM_MAX,7
LDI NUM_MIN,1
LDI POS_CRS,$84 ;??t con tr? v? trí th?
RCALL SET_NUM ;??t và hi?n th? th?
LD R17,X
SBR R17,(1<<VBATEN) ;cho phép ngu?n backup
ST X,R17
RJMP RTC_SET
HR_CHK:
CPI COUNT,1 ;cài ??t gi??
BRNE MI_CHK ;khác,ki?m tra phút
LDI XH,HIGH(RTC_BUF+2);X tr? buffer RTC gi?
LDI XL,LOW(RTC_BUF+2)
LDI NUM_MAX,0X23
LDI NUM_MIN,0
LDI POS_CRS,$86 ;??t con tr? v? trí gi?
RCALL SET_NUM
RJMP RTC_SET
MI_CHK:
CPI COUNT,2 ;cài ??t phút?
BRNE SEC_CHK ;khác,ki?m tra giây
LDI XH,HIGH(RTC_BUF+1);X tr? buffer RTC phút
LDI XL,LOW(RTC_BUF+1)
LDI NUM_MAX,0X59
LDI NUM_MIN,0
LDI POS_CRS,$89 ;??t con tr? v? trí phút
RCALL SET_NUM
RJMP RTC_SET
SEC_CHK:
CPI COUNT,3 ;cài ??t giây?
BRNE DAT_CHK ;ki?m tra ngày
LDI XH,HIGH(RTC_BUF);X tr? buffer RTC giây
LDI XL,LOW(RTC_BUF)
LDI NUM_MAX,0X59
LDI NUM_MIN,0
LDI POS_CRS,$8C ;??t con tr? v? trí giây
RCALL SET_NUM
LD R17,X
SBR R17,(1<<STO) ;??t bit STO=1 cho phép OSC
ST X,R17
RJMP RTC_SET
DAT_CHK:
CPI COUNT,4 ;cài ??t ngày?
BRNE MO_CHK ;khác,ki?m tra tháng
LDI XH,HIGH(RTC_BUF+4);X tr? buffer RTC ngày
LDI XL,LOW(RTC_BUF+4)
LDI NUM_MAX,0X31
LDI NUM_MIN,1
LDI POS_CRS,$C6 ;con tr? v? trí ngày
RCALL SET_NUM
RJMP RTC_SET
MO_CHK:
CPI COUNT,5 ;cài ??t tháng?
BRNE YEA_CHK ;khác,ki?m tra n?m
LDI XH,HIGH(RTC_BUF+5);X tr? buffer RTC tháng
LDI XL,LOW(RTC_BUF+5)
LDI NUM_MAX,0X12
LDI NUM_MIN,1
LDI POS_CRS,$C9 ;con tr? v? trí tháng
RCALL SET_NUM
YEA_CHK:
CPI COUNT,6 ;cài ??t n?m?
BRNE EXIT_CHK ;khác,thoát
LDI XH,HIGH(RTC_BUF+6);X tr? buffer RTC n?m
LDI XL,LOW(RTC_BUF+6)
LDI NUM_MAX,0X99
LDI NUM_MIN,1
LDI POS_CRS,$CC ;con tr? v? trí n?m
RCALL SET_NUM
RJMP RTC_SET
;-----------------------------------------------------
;L?u các giá tr? cài ??t vào RTCC
;-----------------------------------------------------
EXIT_CHK:
LDI COUNT,7 ;l?u vào RTCC
LDI XH,HIGH(RTC_BUF);X tr? buffer RTC
LDI XL,LOW(RTC_BUF)
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X00 ;??a ch? thanh ghi giây
RCALL TWI_WRITE ;ghi ??a ch? TCCR
WR_RTC:
LD R17,X+
RCALL TWI_WRITE ;ghi TCCR
DEC COUNT
BRNE WR_RTC
RCALL TWI_STOP
RJMP START1
;------------------------------------------------------
;GET_SW ??c tr?ng thái SW1,SW2 có ch?ng rung
;Tr? v? mã SW1=1 ho?c mã SW2=2 và c? SW_FLG=1 n?u có SW nh?n
;Tr? v? c? SW_FLG=0 n?u không có SW nh?n
;S? d?ng R16,R17,c? SW_FLG thu?c thanh ghi FLAG_REG
;--------------------------------------------------------------------------
GET_SW:
CBR REG_FLAG,(1<<SW_FLG);xóa c? báo nh?n SW
BACK0:
LDI R16,50 ;ki?m tra SW nh?n 50 l?n liên t?c
WAIT0:
IN R17,CONT_IN
ANDI R17,(1<<SW1)|(1<<SW2);che bit SW1,SW2
CPI R17,(1<<SW1)|(1<<SW2);ki?m tra SW nh?n?
BREQ EXIT_SW ;không nh?n thoát
DEC R16 ;có nh?n ti?p t?c
BRNE WAIT0 ;
PUSH R17 ;c?t mã SW
BACK1:
LDI R16,50 ;ki?m tra sw nh? 50 l?n liên t?c
WAIT1:
IN R17,CONT_IN
ANDI R17,(1<<SW1)|(1<<SW2)
CPI R17,(1<<SW1)|(1<<SW2)
BRNE BACK1 ;ch? nh? SW
DEC R16
BRNE WAIT1
POP R17 ;ph?c h?i mã SW
CPI R17,(1<<SW2) ;SW1=0 nh?n,SW2=1 không nh?n
BRNE SW2_CODE ;không ph?i ki?m tra mã SW2
LDI R17,1 ;gán giá tr? mã SW1
RJMP SET_FLG ;báo c? nh?n SW
SW2_CODE:
CPI R17,(1<<SW1) ;SW2=0 nh?n,SW1=1 không nh?n
BRNE EXIT_SW ;không ph?i thoát
LDI R17,2 ;gán giá tr? mã SW2
SET_FLG:
SBR REG_FLAG,(1<<SW_FLG);??t c? báo nh?n SW
EXIT_SW:
RET
;----------------------------------------------------------------
;SET_NUM cài ??t các giá tr? th?i gian ch?n qua bi?n COUNT
;Nh?n/nh? SW1 thoát
;Nh?n/nh? SW2 cài ??t giá tr?
;S? d?ng R17,R18,ctc CURS_POS,GET_SW
;----------------------------------------------------------------
SET_NUM:
MOV R17,POS_CRS ;??t v? trí con tr? ?úng v? trí cài ??t
RCALL CURS_POS
SW_CHK1:
RCALL GET_SW ;??c SW
SBRS REG_FLAG,SW_FLG;có SW nh?n
RJMP SW_CHK1 ;ch? nh?n SW
CPI R17,1 ;SW1 nh?n?
BREQ EXIT_NUM ;?úng,thoát
CPI R17,2 ;SW2 nh?n?
BRNE SW_CHK1 ;khác,??c l?i SW
LD R17,X ;n?p giá tr? cài ??t
CPI COUNT,3 ;cài ??t giây?
BRNE DAY_CHK ;khác,ki?m tra ngày
CBR R17,(1<<STO) ;?úng,xóa bit ST
RJMP PRESET ;ti?n hành ??t
DAY_CHK:
CPI COUNT,0 ;cài ??t ngày?
BRNE PRESET ;khác,ti?n hành ??t
ANDI R17,0X07 ;l?c l?y data ngày
PRESET:
INC R17 ;t?ng giá tr? thêm 1
MOV R18,R17 ;c?t giá tr? ??t
ANDI R17,$0F ;che l?y 4 bit th?p
CPI R17,$0A ;giá tr?<10
BRCS NON_CR ;?úng,không tràn
LDI R17,$06 ;hi?u ?ính BCD
ADD R18,R17
NON_CR:
MOV R17,R18 ;tr? s? BCD ??t v? R17
CP R17,NUM_MAX ;so sánh gi?i h?n MAX
BRCS DISP ;nh? h?n,hi?n th?
BREQ DISP ;b?ng,hi?n th?
MOV R17,NUM_MIN ;l?n h?n,tr? v? gi?i h?n MIN
DISP: ST X,R17 ;c?t s? BCD ??t vào buffer
RCALL NUM_DISP ;hi?n th? s? BCD ??t
RJMP SET_NUM ;ti?p t?c ??t
EXIT_NUM:
INC COUNT ;t?ng bi?n ??m v? trí cài ??t
RET
;---------------------------------------------------------------
NUM_DISP:
PUSH R17 ;c?t data
SWAP R17 ;hoán v? 4 bitth?p/cao
ANDI R17,0X0F ;che l?y s? BCD cao
ORI R17,0X30 ;chuy?n sang mã ASCII
SBI LCD,RS
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? giá tr?
POP R17 ;ph?c h?i data
ANDI R17,0X0F ;che l?y s? BCD th?p
ORI R17,0X30 ;chuy?n sang mã ASCII
SBI LCD,RS
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? giá tr?
RET
;-----------------------------------------------------------------
;MSG_DISP hi?n th? chu?i ký t? k?t thúc b?ng mã NULL ??t trong Flash ROM
;Input: Z ch?a ??a ch? ??u chu?i ký t?
;Output: hi?n th? chu?i ký t? ra LCD t?i v? trí con tr? hi?n hành
;S? d?ng R16,R17,ctc DELAY_US,OUT_LCD
;------------------------------------------------------------------
MSG_DISP:
LPM R17,Z+ ;l?y mã ASCII ký t? t? Flash ROM
CPI R17,NULL ;ki?m tra ký t? k?t thúc
BREQ EXIT_MSG ;ký t? NULL thoát
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
SBI LCD,RS ;RS=1 ghi data hi?n th? LCD
RCALL OUT_LCD ;ghi mã ASCII ký t? ra LCD
RJMP MSG_DISP ;ti?p t?c hi?n th? ký t?
EXIT_MSG:
RET
;----------------------------------------------------------
;CURS_POS ??t con tr? t?i v? trí có ??a ch? trong R17
;Input: R17=$80 -$8F dòng 1,$C0-$CF dòng 2
; R17= ??a ch? v? trí con tr?
;S? d?ng R16,ctc DELAY_US,OUT_LCD
;----------------------------------------------------------
CURS_POS:
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
CBI LCD,RS ;RS=0 ghi l?nh
RCALL OUT_LCD
RET
;-----------------------------------------------------------------
;INIT_LCD4 kh?i ??ng LCD ghi 4 byte mã l?nh theo giao ti?p 4 bit
;Function set:R18=$28 2 dòng font 5x8 giao ti?p 4 bit
;Clear display:R19=$01 xóa màn hình
;Display on/off LCDrol:R20=$0C màn hình on,con tr? off
;Entry mode set:R21=$06 d?ch ph?i con tr? ,?/c DDRAM t?ng 1 khi ghi data
;RS=bit0=0,RW=bit1=0
;----------------------------------------------------------------
INIT_LCD4:
CBI LCD,RS ;RS=0: ghi l?nh
MOV R17,R18 ;R18=Function set
RCALL OUT_LCD ;ghi 1 byte data ra LCD
MOV R17,R19 ;R19=Clear display
RCALL OUT_LCD
LDI R16,20 ;ch? 2ms sau l?nh Clear display
RCALL DELAY_US
MOV R17,R20 ;R20=Display LCDrol on/off
RCALL OUT_LCD
MOV R17,R21 ;R21=Entry mode set
RCALL OUT_LCD
RET
;--------------------------------------------------
;OUT_LCD4 ghi mã l?nh/data ra LCD
;Input: R17 ch?a mã l?nh/data 4 bit cao
;--------------------------------------------------
OUT_LCD4:
OUT LCD,R17
SBI LCD,E
CBI LCD,E
RET
;------------------------------------------------------
;OUT_LCD ghi 1 byte mã l?nh/data ra LCD
;chia làm 2 l?n ghi 4bit
;Input: R17 ch?a mã l?nh/data,R16
;bit RS=0/1:l?nh/data,bit RW=0:ghi
;S? d?ng ctc OUT_LCD4
;------------------------------------------------------
OUT_LCD:
LDI R16,1 ;ch? 100us
RCALL DELAY_US
IN R16,LCD ;??c PORT LCD
ANDI R16,(1<<RS) ;l?c bit RS
PUSH R16 ;c?t R16
PUSH R17 ;c?t R17
ANDI R17,$F0 ;l?y 4 bit cao
OR R17,R16 ;ghép bit RS
RCALL OUT_LCD4 ;ghi ra LCD
LDI R16,1 ;ch? 100us
RCALL DELAY_US
POP R17 ;ph?c h?i R17
POP R16 ;ph?c h?i R16
SWAP R17 ;??o 4 bit
ANDI R17,$F0 ;l?y 4 bit th?p chuy?n thành cao
OR R17,R16 ;ghép bit RS
RCALL OUT_LCD4 ;ghi ra LCD
RET
;-------------------------------------------------------
;DELAY_US t?o th?i gian tr? =R16x100?s(Fosc=8Mhz)
;Input:R16 h? s? nhân th?i gian tr? 1 ??n 255
;-------------------------------------------------------
DELAY_US:
MOV R15,R16 ;1MC n?p data cho R15
LDI R16,200 ;1MC s? d?ng R16
L1: MOV R14,R16 ;1MC n?p data cho R14
L2: DEC R14 ;1MC
NOP ;1MC
BRNE L2 ;2/1MC
DEC R15 ;1MC
BRNE L1 ;2/1MC
RET ;4MC
;---------------------------------------------------------
;TWI_INIT kh?i ??ng c?ng TWI
;??t t?c ?? tuy?n=100Khz
;---------------------------------------------------------
TWI_INIT:
LDI R17,8 ;t?c ?? truy?n SCL=100Khz
STS TWBR,R17
LDI R17,1
STS TWSR,R17 ;h? s? ??t tr??c=4
LDI R17,(1<<TWEN) ;cho phép TWI
STS TWCR,R17
RET
;----------------------------------------------------------
TWI_START:
LDI r17,(1<<TWEN)|(1<<TWSTA)|(1<<TWINT);cho phép TWI,START,xóa TWINT
STS TWCR,R17
WAIT_STA:
LDS R17,TWCR ;??c c? TWINT
SBRS R17,TWINT ;ch? c? TWINT=1 báo truy?n xong
RJMP WAIT_STA
RET
;----------------------------------------------------------
TWI_WRITE:
STS TWDR,R17 ;ghi data
LDI R17,(1<<TWEN)|(1<<TWINT);cho phép TWI,xóa TWINT
STS TWCR,R17
WAIT_WR:
LDS R17,TWCR ;ch? c? TWINT=1 báo truy?n xong
SBRS R17,TWINT
RJMP WAIT_WR
RET
;----------------------------------------------------------
TWI_READ:
LDI R17,(1<<TWEN)|(1<<TWINT)|(1<<TWEA);cho phép TWI,xóa TWINT,tr? ACK
STS TWCR,R17
WAIT_RD:
LDS R17,TWCR ;ch? c? TWINT=1 báo truy?n xong
SBRS R17,TWINT
RJMP WAIT_RD
LDS R17,TWDR ;??c data thu ???c
RET
;--------------------------------------------------
TWI_NAK:
LDI R17,(1<<TWEN)|(1<<TWINT);cho phép TWI,xóa TWINT,tr? NAK
STS TWCR,R17
WAIT_NAK:
LDS R17,TWCR ;ch? c? TWINT=1 báo truy?n xong
SBRS R17,TWINT
RJMP WAIT_NAK
RET
;----------------------------------------------------------
TWI_STOP:
LDI R17,(1<<TWEN)|(1<<TWSTO)|(1<<TWINT);cho phép TWI,xóa TWINT,STOP
STS TWCR,R17
RET
;---------------------------------------------------------
.ORG 0X200
MSG1: .DB "THU",$00
MSG2: .DB "NGAY ",$00

Hình ảnh:
Nguồn Code:
.EQU SS = 4

.EQU MOSI = 5

.EQU MISO = 6

.EQU SCK = 7

.EQU SPI_PORT = PORTB

.EQU SPI_PORT_DDR = DDRB


.DEF DATA_SPI_TRANS = R16

.DEF DATA_SPI_REC = R17

.DEF DATA_REC = R18

.DEF DATA_TRANS = R19

.ORG 0

LDI R16, HIGH(RAMEND)

STS SPH, R16

LDI R16, LOW(RAMEND)

STS SPL, R16

CLR DATA_REC

CLR DATA_SPI_TRANS

CLR DATA_SPI_REC

RCALL USART_INIT ; init uart

RCALL SPI_INIT ; init SPI

START:

RCALL USART_RECEIVE ; receive data from uart, save to R18

MOV DATA_SPI_TRANS, DATA_REC

CBI SPI_PORT, SS ; start sending data to slave

RCALL SPI_TRANSMIT

SBI SPI_PORT, SS ; stop sending data to slave

RJMP START

SPI_TRANSMIT:

PUSH R18

OUT SPDR0, DATA_SPI_TRANS ; Out data to MOSI pin

WAIT_MASTER_TRANSMIT:

IN R18, SPSR0

SBRS R18, SPIF0 ; Wait for transmission done

RJMP WAIT_MASTER_TRANSMIT ;

IN DATA_SPI_REC, SPDR0

POP R18

RET

USART_INIT:

CLR R16

LDI R16, (1 << RXEN0) ; enable receive

STS UCSR0B, R16


LDI R16, (1 << UCSZ00) | (1 << UCSZ01) ; 8 bit data

STS UCSR0C, R16

LDI R16, 0x00

STS UBRR0H, R16

LDI R16, 51

STS UBRR0L, R16 ; baud rate = 9600, N = 51

RET

USART_RECEIVE:

PUSH R17

WAIT_USART_RECEIVE:

LDS R17, UCSR0A ; read status register

SBRS R17, RXC0 ; check if UDRE0 = 1 (the reg is empty)

RJMP WAIT_USART_RECEIVE ; wait until the register is empty

LDS DATA_REC, UDR0 ; get and return data received from buffer

POP R17

RET

SPI_INIT:

CLR R16

LDI R16, (1 << SS) | (1 << MOSI) | (1 << SCK) ; mosi, sck, ss -> out

OUT SPI_PORT_DDR, R16

SBI SPI_PORT, MISO ; enable pull-up resistor

LDI R16,(1 << SPE0) | (1 << MSTR0) | (1 << SPR00) ; spi enable, master,fosc/16, mode 0

OUT SPCR0, R16

LDI R16,$00

STS SPSR0,R16

RET

Hình ảnh:
Mã acsii của số 4 là 0x34
Hướng dẫn kết nối:
+ Nối barled vào thanh ghi dịch
+clr vào 5v, clk vào sck, dsi vào mosi, ss vào latch
.ORG 0

;USE UART0, Baudrate 9600, 8 bit data, no parity, 1 stop

;USE SPI, MASTER TRANSMIT

.DEF DATA_TX = R16

.DEF DATA_RX = R25

.DEF DATA_SPI_TX = R18

.DEF DATA_SPI_RX = R19

.DEF COUNT = R21

;----------------SPI-----------------

.EQU DD_SS = 4

.EQU DD_MOSI = 5

.EQU DD_MISO = 6

.EQU DD_SCK = 7

.EQU DDR_SPI = DDRB

.EQU PORT_SPI = PORTB

;-------------EEPROM-----------------

.EQU WREN = $06 ;SET THE WRITE ENABLE LATCH

.EQU WRDI = $04 ;RESET THE WRITE ENABLE LATCH

.EQU RDSR = $05 ;READ STATUS REGISTER

.EQU WRSR = $01 ;WRITE STATUS REGISTER

.EQU READ = $03 ;READ DATA FROM MEMORY

.EQU WRITE = $02 ;WRIE DATA TO MEMORY

.EQU PE = $42 ;PAGE ERASE

.EQU MEMADD3 =0X00 ; DIA CHI BO NHO BYTE 3

.EQU MEMADD21 =0X0100 ; DIA CHI BO NHO BYTE 21


.EQU WIP = 0

;INIT

LDI R16, HIGH(RAMEND)

OUT SPH, R16

LDI R16, LOW(RAMEND)

OUT SPL, R16 ; set up stack pointer

RCALL SPI0_MASTER_INIT ; init SPI

RCALL UART0_INIT ; init UART

CLR DATA_RX

CLR DATA_TX

CLR DATA_SPI_TX

LDI COUNT, 0

SBI PORT_SPI, DD_SS ; stop transmit

SER R16

OUT DDRA, R16 ; port A --> barled => output

RCALL EEPROM_READ

MOV COUNT, DATA_SPI_RX

CPI COUNT, $FF ; count = FF --> clear to 0

BRNE MAIN

CLR COUNT

MAIN:

RCALL UART0_RX

INC COUNT

RCALL EEPROM_DEL

RCALL EEPROM_WRITE

OUT PORTA, COUNT

RJMP MAIN

SPI0_MASTER_INIT: ; INIT SPI

PUSH R16 ;MISO -> INPUT

CLR R16

LDI R16, (1 << DD_MOSI) | (1 << DD_SCK) | (1 << DD_SS) ;MOSI, SCK, SS ->OUTPUT

OUT DDR_SPI, R16


;SBI PORT_SPI, DD_MISO

;MSB OF THE DATA IS TRANSMITTED FIRST

CLR R16

OUT SPCR0, R16

;ENABLE SPI, MASTER, SET CLOCK RATE Fosc/8, SPI MODE 0

LDI R16, (1 << SPE0) | (1 << MSTR0) | (1 << SPR00)

OUT SPCR0, R16

LDI R16, (1 << SPI2X0)

OUT SPSR0, R16

POP R16

RET

SPI_MASTER_TRANSMIT:

PUSH R20

;START TRANSMISSION OF DATA

OUT SPDR0, DATA_SPI_TX

;WAIT FOR TRANSMISSION COMPLETE

WAIT_TRANSMIT:

IN R20, SPSR0

SBRS R20, SPIF0

RJMP WAIT_TRANSMIT

IN DATA_SPI_RX, SPDR0

POP R20

RET

EEPROM_WRITE:

;ENABLE WIRTE DATA

LDI DATA_SPI_TX, WREN

CBI PORT_SPI, DD_SS

RCALL SPI_MASTER_TRANSMIT

SBI PORT_SPI, DD_SS

LDI DATA_SPI_TX, WRITE

CBI PORT_SPI, DD_SS

RCALL SPI_MASTER_TRANSMIT
;SEND ADDRESS TO EEPROM

LDI DATA_SPI_TX, MEMADD3

RCALL SPI_MASTER_TRANSMIT

LDI DATA_SPI_TX, HIGH(MEMADD21)

RCALL SPI_MASTER_TRANSMIT

LDI DATA_SPI_TX, LOW(MEMADD21)

RCALL SPI_MASTER_TRANSMIT

;WRITE DATA TO EEPROM

MOV DATA_SPI_TX, COUNT

RCALL SPI_MASTER_TRANSMIT

SBI PORT_SPI, DD_SS

CHECK_IN_PROCESS:

CBI PORT_SPI, DD_SS

LDI DATA_SPI_TX, RDSR

RCALL SPI_MASTER_TRANSMIT

SBRC DATA_SPI_RX, WIP

RJMP CHECK_IN_PROCESS

SBI PORT_SPI, DD_SS

RET

EEPROM_DEL:

;ENABLE WIRTE DATA

LDI DATA_SPI_TX, WREN

CBI PORT_SPI, DD_SS

RCALL SPI_MASTER_TRANSMIT

SBI PORT_SPI, DD_SS

LDI DATA_SPI_TX, PE

CBI PORT_SPI, DD_SS

RCALL SPI_MASTER_TRANSMIT

;SEND ADDRESS TO EEPROM

LDI DATA_SPI_TX, MEMADD3

RCALL SPI_MASTER_TRANSMIT

LDI DATA_SPI_TX, HIGH(MEMADD21)


RCALL SPI_MASTER_TRANSMIT

LDI DATA_SPI_TX, LOW(MEMADD21)

RCALL SPI_MASTER_TRANSMIT

;WRITE DATA TO EEPROM

MOV DATA_SPI_TX, COUNT

RCALL SPI_MASTER_TRANSMIT

SBI PORT_SPI, DD_SS

CHECK_IN_PROCESS_DEL:/-strong/-heart:>:o:-((:-hCBI PORT_SPI, DD_SS

LDI DATA_SPI_TX, RDSR

RCALL SPI_MASTER_TRANSMIT

SBRC DATA_SPI_RX, WIP

RJMP CHECK_IN_PROCESS_DEL

SBI PORT_SPI, DD_SS

RET

EEPROM_READ:

;SEND ADDRESS TO EEPROM

LDI DATA_SPI_TX, READ

CBI PORT_SPI, DD_SS

RCALL SPI_MASTER_TRANSMIT

LDI DATA_SPI_TX, MEMADD3

RCALL SPI_MASTER_TRANSMIT

LDI DATA_SPI_TX, HIGH(MEMADD21)

RCALL SPI_MASTER_TRANSMIT

LDI DATA_SPI_TX, LOW(MEMADD21)

RCALL SPI_MASTER_TRANSMIT ; LAY DIA CHI TRONG EEPROM

;READ DATA FROM EEPROM

LDI DATA_SPI_TX, $FF

RCALL SPI_MASTER_TRANSMIT

SBI PORT_SPI, DD_SS

RET

UART0_INIT:

PUSH R16
LDI R16, (1 << TXEN0) | (1 << RXEN0) ;ENABLE TRANSMITTER, RECEIVER

STS UCSR0B, R16

LDI R16, (1 << UCSZ00) | (1 << UCSZ01) ;8-BIT DATA

STS UCSR0C, R16 ;NO PARITY, 1 STOP BIT

LDI R16, $00

STS UBRR0H, R16

LDI R16, 51 ;BAUDRATE = 9600, FOSC = 8MHZ

STS UBRR0L, R16

POP R16

RET

UART0_TX: ; transmit data

PUSH R17

;WAIT TO FOR EMPTY TRANSMIT BUFFER

UART0_TX_WAIT:

LDS R17, UCSR0A

SBRS R17, UDRE0

RJMP UART0_TX_WAIT

;PUT DATA INTO BUFFER, SEND THE DATA

STS UDR0, DATA_TX

POP R17

RET

UART0_RX:

PUSH R18

;WAIT FOR DATA TO BE RECEIVED

UART0_RX_WAIT:

LDS R18, UCSR0A

SBRS R18, RXC0

RJMP UART0_RX_WAIT

;GET AND RETURN RECEIVED DATA FROM BUFFER

LDS DATA_RX, UDR0

POP R18

RET
Hình ảnh:

Hướng dẫn kết nối:


+Cắp ss vào cs, mosi vào di, miso vào do, sck vào clk
.ORG 0
.DEF DATA_REC = R18
.DEF DATA_TRANS = R19
.DEF COUNTER = R20
.EQU OUT_PORT_DDR = DDRB
.EQU OUT_PORT = PORTB
LDI R16, HIGH(RAMEND)
STS SPH, R16
LDI R16, LOW(RAMEND)
STS SPL, R16
CLR COUNTER
LDI R21, 01
LDI R22, 00 ; set eeprom address
SER R16
OUT OUT_PORT_DDR, R16 ; out port = output
RCALL USART_INIT ; init uart
AGAIN:
RCALL WRITE_TO_EEPROM ; store counter into eeprom
RCALL READ_FROM_EEPROM ; load counter from eeprom
OUT PORTB, COUNTER ; start counter from data in
eeprom
RCALL USART_RECEIVE
INC COUNTER
RJMP AGAIN
USART_INIT:
CLR R16
LDI R16, (1 << RXEN0) ; enable transmit
STS UCSR0B, R16
LDI R16, (1 << UCSZ00) | (1 << UCSZ01) ; 8 bit data
STS UCSR0C, R16
LDI R16, 0x00
STS UBRR0H, R16
LDI R16, 51
STS UBRR0L, R16 ; baud
rate = 9600, N = 51
RET
USART_RECEIVE:
PUSH R17
WAIT_USART_RECEIVE:
LDS R17, UCSR0A ; read status register
SBRS R17, RXC0 ; check if UDRE0 = 1 (the reg is empty)
RJMP WAIT_USART_RECEIVE ; wait until the register is empty
LDS DATA_REC, UDR0 ; get and return data received from buffer
POP R17
RET
WRITE_TO_EEPROM:
WAIT_ENABLE_WRITE:
SBIC EECR, EEPE ; wait EEPM = 0
RJMP WAIT_ENABLE_WRITE
OUT EEARH, R22 ; load address
OUT EEARL, R21 ; 0001
OUT EEDR, COUNTER ; store counter into eeprom (present value)
SBI EECR, EEMPE
SBI EECR, EEPE
RCALL DELAY_5MS
RET
READ_FROM_EEPROM:
WAIT_READ:
SBIC EECR, EEPE
RJMP WAIT_READ ; Wait EEPM = 0
; Load address for EEAR
OUT EEARH, R22
OUT EEARL, R21
SBI EECR, EERE
IN COUNTER, EEDR
RET
DELAY_5MS:
LDI R20, 5
LP2:
LDI R21, 250
LP1:
NOP
DEC R21
BRNE LP1
DEC R20
BRNE LP2
RET

Hình ảnh:
Hướng dẫn kết nối:
+Cắp barled vào port B
+Tx, Rx của usart vào Tx0,Rx0

You might also like