Professional Documents
Culture Documents
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:
Code:
.ORG 0
RCALL USART_INIT
RCALL UART_TRANS
MOV R20,R21
LDI ZH,HIGH(TAB<<1)
LDI ZL,LOW(TAB<<1)
CPI R21,$00
BREQ LOOP
RCALL UART_TRANS
RJMP L1
RJMP LOOP
USART_INIT:
LDI R16,0x00
STS UBRR0H,R16
STS UBRR0L,R16
RET
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
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
.ORG 0
CLR DATA_REC
CLR DATA_SPI_TRANS
CLR DATA_SPI_REC
START:
RCALL SPI_TRANSMIT
RJMP START
SPI_TRANSMIT:
PUSH R18
WAIT_MASTER_TRANSMIT:
IN R18, SPSR0
RJMP WAIT_MASTER_TRANSMIT ;
IN DATA_SPI_REC, SPDR0
POP R18
RET
USART_INIT:
CLR R16
LDI R16, 51
RET
USART_RECEIVE:
PUSH R17
WAIT_USART_RECEIVE:
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
LDI R16,(1 << SPE0) | (1 << MSTR0) | (1 << SPR00) ; spi enable, master,fosc/16, mode 0
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
;----------------SPI-----------------
.EQU DD_SS = 4
.EQU DD_MOSI = 5
.EQU DD_MISO = 6
.EQU DD_SCK = 7
;-------------EEPROM-----------------
;INIT
CLR DATA_RX
CLR DATA_TX
CLR DATA_SPI_TX
LDI COUNT, 0
SER R16
RCALL EEPROM_READ
BRNE MAIN
CLR COUNT
MAIN:
RCALL UART0_RX
INC COUNT
RCALL EEPROM_DEL
RCALL EEPROM_WRITE
RJMP MAIN
CLR R16
LDI R16, (1 << DD_MOSI) | (1 << DD_SCK) | (1 << DD_SS) ;MOSI, SCK, SS ->OUTPUT
CLR R16
POP R16
RET
SPI_MASTER_TRANSMIT:
PUSH R20
WAIT_TRANSMIT:
IN R20, SPSR0
RJMP WAIT_TRANSMIT
IN DATA_SPI_RX, SPDR0
POP R20
RET
EEPROM_WRITE:
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
;SEND ADDRESS TO EEPROM
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
CHECK_IN_PROCESS:
RCALL SPI_MASTER_TRANSMIT
RJMP CHECK_IN_PROCESS
RET
EEPROM_DEL:
RCALL SPI_MASTER_TRANSMIT
LDI DATA_SPI_TX, PE
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RJMP CHECK_IN_PROCESS_DEL
RET
EEPROM_READ:
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RCALL SPI_MASTER_TRANSMIT
RET
UART0_INIT:
PUSH R16
LDI R16, (1 << TXEN0) | (1 << RXEN0) ;ENABLE TRANSMITTER, RECEIVER
POP R16
RET
PUSH R17
UART0_TX_WAIT:
RJMP UART0_TX_WAIT
POP R17
RET
UART0_RX:
PUSH R18
UART0_RX_WAIT:
RJMP UART0_RX_WAIT
POP R18
RET
Hình ảnh:
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