- •Портативное устройство хранения и отображения текстовой информации
- •Устройство и принцип работы
- •Микроконтроллер в утройстве
- •Описание выводов
- •Организация памяти
- •Хранение текста
- •Описание выводов
- •Управление памятью
- •Вывод текста
- •Подключение
- •Технические характеристики
- •Программа на компьютере Основная форма (frmMain)
- •Форма передачи (frmSend)
Технические характеристики
Питание: 4 батарейки типа “ААА”
Потребляемый ток: 12 мА
Микроконтроллер (нормальный/спящий) 5/0.8 мА
Память 5 мА
ЖКИ (без подсветки/с подсветкой) 2/25 мА
Операционная система для ПО: Windows95/98
Интерфейс связи с компьютером: RS232
Скорость передачи данных (в среднем) 2 Кбайт/с
Кодировка текста: Windows
Объём памяти: 64 Кбайт
Габаритные размеры (д/в/ш мм): 105 х 55 х 26
Список литературы
“8-bit AVR microcontroller with 2K byte of in-system programmable flash AT90S2313”, “2-wire serial EEPROM 512K AT24C512”, “Instruction set”, 1999-2002 г.г. Atmel
“The I2C-bus and how to use it”, 1995 г. Philips Semiconductors
“HD44780U”, 1998 г. Hitachi
“KS0066U”, 1999 г. Samsung
“БЭК” 8-е издание, 1999 г. Корнюхин
Программа в микроконтроллере
Основная программа CheatReader.asm
;Programm for CheatReader by Kiki
;Version 1.0, need parameters: 4MHz oscillator
.nolist
.include "2313DEF.asm"
.list
.def temp =r25
.def data =r24
.def data1 =r23
.def buttons =r17
.def curCHIP =r19
.def PACCL =r15
.def PACCH =r14
.def PACML =r13
.def PACMH =r12
;I n t e r r u p t h a n d l i n g
.cseg
rjmp RESET ;reset
.org 6
rjmp tmr0int
.org $B
;I n i t i a l i z a t i o n p a r t
RESET: clr buttons ;clearing variables
sbi ACSR,7 ;disable Analog Comparator
ldi temp,RAMEND ;preparing stack pointer
out SPL,temp
ldi temp,2
out TIMSK,temp
ldi temp,5
out TCCR0,temp
ser temp ;preparing ports
out DDRB,temp
ldi temp,0b1000001
out DDRD,temp
ldi temp,0b0111110
out PORTD,temp
clr del
clr del1
ldi del2,2 ;delay before LCD init
rcall delay
rcall PC204_init
clr YL ;Y for data in 24C512
clr YH
ldi curCHIP,0b10100000
rcall i2c_addrinit
ldi data,low(msg_greet*2)
ldi data1,high(msg_greet*2)
rcall msgout
clr del1
ldi del2,40
rcall delay
sei
;M a i n b o d y o f t h e p r o g r a m m
loop: rcall I2C_pgread
rcall PC204_scrprnt
butwait:clr del1 ;Button press waiting
ldi del2,4
rcall delay
rcall wtfbtn
;Buttons handling
cpi buttons,4 ;Button 3
brne nxtcmd1
tst YH
brne fstcmd
cpi YL,80
breq butwait
fstcmd: sbiw YH:YL,60
sbiw YH:YL,60
sbiw YH:YL,40
rcall i2c_addrinit
rjmp loop
nxtcmd1:cpi buttons,8 ;Button 4
brne nxtcmd3
rjmp loop
nxtcmd3:cpi buttons,1 ;Button 1
brne nxtcmd4
cpi YL,80
brne jmptbeg
tst YH
breq butwait
jmptbeg:clr YL
clr YH
rcall i2c_addrinit
rjmp loop
nxtcmd4:cpi buttons,3 ;Button 1+2
brne nxtcmd5 ;Data receive
clr del1
ldi del2,20
rcall delay
ldi data,low(msg_actload*2)
ldi data1,high(msg_actload*2)
rcall msgout
rcall UART_getch
mov PACMH,data
rcall UART_putch
rcall UART_getch
mov PACML,data
rcall UART_putch
ldi data,low(msg_load*2)
ldi data1,high(msg_load*2)
rcall msgout
clr YL
clr YH
clr PACCL
clr PACCH
pacrecv:mov data,PACCL
rcall UART_putch
rcall UART_packrcv
sbrs buttons,1
rjmp noabort
ldi data,1 ;1 means - "download abort"
rcall UART_putch
clr YL
clr YH
rcall I2C_addrinit
ldi data,low(msg_ldabort*2)
ldi data1,high(msg_ldabort*2)
rcall msgout
ldi del2,30
rcall delay
rcall PC204_clear
rjmp loop
noabort:rcall I2C_pgwrite
ldi temp,1
add PACCL,temp
clr temp
adc PACCH,temp
cp PACCH,PACMH
brlo pacrecv
cp PACCL,PACML
brlo pacrecv
ldi data,low(msg_loaddn*2)
ldi data1,high(msg_loaddn*2)
rcall msgout
clr del1
ldi del2,30
rcall delay
clr YL
clr YH
rcall I2C_addrinit
rcall PC204_clear
rjmp loop
nxtcmd5:rjmp butwait ;Other...
;P r o c e d u r e s
wtfbtn: tst buttons
breq wtfbtn
ret
tmr0int:in buttons,PIND
lsr buttons
lsr buttons
com buttons
andi buttons,$F
reti
;U n i t s i n c l u d i n g
.include "PC2004.asm" ; to control LCD PC2004
.include "I2C_24C512.asm" ; to control AT24C512
.include "UART.asm" ; for communicationing CheatReader with PC
.include "Delays.asm" ; delays
.include "DATA.asm" ; of text data
.exit
Модуль PC2004.asm
;parameters: data1:(x)(x)(x)(x)(x)(x)(x)(RS)-RS bit, data-DB0~DB7
.def symbcnt =r18
.equ E =6
.equ RS =1
.equ PC204l2p0 =$C0
.equ PC204l3p0 =$94
.equ PC204l4p0 =$d4
PC204_write:
cbi PORTD,RS ;RS = 0
sbi DDRD,RS
sbrc data1,0 ;setting him or not
sbi PORTD,RS
bst data1,0 ;storing him in T-bit
ldi del,8 ;init bit-counter
mov temp,data
clr data1
PC_swp:ror temp ;swapping highest with lowest bits in data
rol data1 ; according the scheme of CheatReader
dec del
brne PC_swp
out PORTB,data1 ;outputting
sbi PORTD,E
nop
cbi PORTD,E
clr data1 ;restoring RS-bit
bld data1,0
ret
PC204_init: ;display initialization
clr data1
ldi data,$38 ;8-bit interf, 2-line display
rcall PC204_write
rcall symb_del
ldi data,1 ;clearing
rcall PC204_write
ldi del1,8
ldi del2,1
rcall delay
ldi data,$C ;switching on, cursor is blinking
rcall PC204_write
rcall symb_del
ret
PC204_scrprnt:
cli
clr symbcnt ;full screen output
ldi ZL,$60
PC204_cyc:
inc symbcnt
ld data,Z+ ;loading indirect byte to data
tst data
brne PC204nz
ldi data,$CD
PC204nz:cpi data,10 ;Special chars converting
brne PC204o1
ldi data,$FE
rjmp PC204n
PC204o1:cpi data,13
brne PC204o2
ldi data,$FE
ldi temp,$20
st Z,temp
rjmp PC204n
PC204o2:cpi data,9 ;Tab symb 2 paragraph symb
brne PC204o3
ldi data,$FD
rjmp PC204n
PC204o3:cpi data,$5C ;"\" -> "/"
brne PC204o4
ldi data,$2F
rjmp PC204n
PC204o4:cpi data,$7E ;"~"
brne PC204o5
ldi data,$E9
rjmp PC204n
PC204o5:cpi data,$7B ;"{" -> "<<"
brne PC204o6
ldi data,$C8
rjmp PC204n
PC204o6:cpi data,$7D ;"}" -> ">>"
brne PC204o7
ldi data,$C9
rjmp PC204n
PC204o7:cpi data,$7C ;"|"
brne PC204t1
ldi data,$D1
rjmp PC204n
PC204t1:cpi data,$C0 ;$80 for CP866
brlo PC204n
;cpi data,$B0
;brsh PC204t2
push ZL
push ZH
ldi ZL,low(tab1*2)
ldi ZH,high(tab1*2)
subi data,$C0 ;$80 for CP866
add ZL,data
brcc PC204nc
inc ZH
PC204nc:lpm
pop ZH
pop ZL
mov data,r0
rjmp PC204n
PC204n: ldi data1,1 ;setting RS = 1
rcall PC204_write ;printing symbol
rcall symb_del ;waiting some
cpi symbcnt,20 ;jumping from line to line
brne PC204ntst1
ldi data,PC204l2p0
rcall PC204_goto
PC204ntst1:
cpi symbcnt,40
brne PC204ntst2
ldi data,PC204l3p0
rcall PC204_goto
PC204ntst2:
cpi symbcnt,60
brne PC204ntst3
ldi data,PC204l4p0
rcall PC204_goto
PC204ntst3:
cpi symbcnt,80
breq PC204dn
rjmp PC204_cyc
PC204dn:sei
ret
PC204_clear:
push data
push data1
clr data1
ldi data,1
rcall PC204_write
ldi del1,8
ldi del2,1
rcall delay
pop data1
pop data
ret
PC204_goto:
clr data1
rcall PC204_write
rcall symb_del
ret
msgout: rcall PC204_clear
ldi symbcnt,$60
msgloop:mov ZL,data
mov ZH,data1
lpm
adiw ZH:ZL,1
mov data,ZL
mov data1,ZH
mov ZL,symbcnt
st Z,r0
inc symbcnt
cpi symbcnt,$B0
brne msgloop
rcall PC204_scrprnt
ret
Модуль I2C_24C512.asm
.equ SCL = 0 ; SCL Pin number
.equ SDA = 1 ; SDA Pin number
I2C_start:
sbi DDRD,SDA
sbi PORTD,SDA ;making start condition...
sbi PORTD,SCL
cbi PORTD,SDA
cbi PORTD,SCL
ret
I2C_write:
sbi DDRD,SDA ;setting direction to "write"
ldi temp,8 ;initializing bit-counter
I2C_ntw:cbi PORTD,SDA
rol data ;rotating left through Carry
brcc I2C_ov ;if data bit is low skip next op
sbi PORTD,SDA ;writing current bit...
I2C_ov: sbi PORTD,SCL
nop
nop
nop
cbi PORTD,SCL
dec temp
brne I2C_ntw ;if 8 bits were tr-f-ed then get ack
rol data ;getting ACK
sbi PORTD,SDA ;setting SDA
cbi DDRD,SDA ;setting direction to read
sbi PORTD,SCL ;making strobe...
nop
nop
I2Cwait:sbic PIND,SDA ;if there is no ack then wait
rjmp I2Cwait
cbi PORTD,SCL
ret
I2C_read:
cbi DDRD,SDA ;setting direction of SDA pin to "read"
sbi PORTD,SDA
clr data ;clearing data buffer
ldi temp,8 ;initializing bit-counter
clc
I2C_ntr:rol data ;rotating left data buffer
nop
sbi PORTD,SCL ;making strobe
nop
sbic PIND,SDA ;reading SDA in carry
ori data,1 ;setting carry if SDA is high
nop
cbi PORTD,SCL
dec temp
brne I2C_ntr ;if 8 bits were tr-f-ed then get ack
;putting ACK
sbi DDRD,SDA ;setting direction of SDA pin to "write"
cbi PORTD,SDA ;sending "0" as acknowledge...
brtc I2Cack
sbi PORTD,SDA
I2Cack: sbi PORTD,SCL
nop
nop
cbi PORTD,SCL
ret
I2C_pgread:
rcall I2C_start
mov data,curCHIP
ori data,1
rcall I2C_write
ldi ZL,$60 ;setting begining RAM address to $60
clt
I2Crdloop:
rcall I2C_read
st Z+,data
cpi ZL,$AF
brne I2Crdloop
set
rcall I2C_read
st Z+,data
rcall I2C_stop
adiw YH:YL,60
adiw YH:YL,20
ret
I2C_pgwrite:
rcall I2C_start
mov data,curCHIP
rcall I2C_write
mov data,YH
rcall I2C_write
mov data,YL
rcall I2C_write
ldi ZL,$60 ;setting begining RAM address to $60
I2Cwrloop:
ld data,Z+
rcall I2C_write
cpi ZL,$A0
brne I2Cwrloop
rcall I2C_stop
adiw YH:YL,32
adiw YH:YL,32
ldi del1,100
ldi del2,1
rcall delay
ret
I2C_addrinit:
rcall I2C_start
mov data,curCHIP
rcall I2C_write
mov data,YH
rcall I2C_write
mov data,YL
rcall I2C_write
rcall I2C_stop
ret
I2C_stop:
sbi DDRD,SDA ;setting direction of SDA pin to "write"
cbi PORTD,SDA
sbi PORTD,SCL ;setting SCL high
sbi PORTD,SDA ;setting SDA high
cbi PORTD,SCL ;release SCL
ret
Модуль UART.asm
;parameters: data-receive/transmitt data byte
.equ RxD=5
.equ TxD=4
.equ HBIT=11 ;11
.equ BIT=21 ;21
UART_getch:
clt
brid UARTnoint1
set
cli
UARTnoint1:
ldi temp,8 ;8 data bit
clr data
sbi PORTD,RxD
cbi DDRD,RxD
UART_wt:sbic PIND,RxD ;Wait for start bit(0)
rjmp UART_wt
ldi del,HBIT ;half-bit delay
UART_d1:dec del
brne UART_d1
UART_gc:ldi del,BIT ;bit belay
UART_d2:dec del
brne UART_d2
clc ;clearing carry
sbic PIND,RxD ;if RX pin low then skip setting carry
sec ;
ror data ;rotating bit through carry into data
dec temp
brne UART_gc
nop
ldi del,HBIT ;half-bit delay
UART_d5:dec del
brne UART_d5
brtc UARTdsint1
sei
UARTdsint1:
ret
UART_putch:
clt
brid UARTnoint2
set
cli
UARTnoint2:
ldi temp,9 ;8 data + 1 start bit
sbi PORTD,TxD
sbi DDRD,TxD
clc
rjmp UARTstb
UART_pc:ror data ;rotating bit through carry into data
UARTstb:brcc UARTov1 ;watching to the carry and setting
sbi PORTD,TxD ; TxD-bit if carry is
UARTov1:brcs UARTov2
cbi PORTD,TxD ; and clearing TxD-bit if not
UARTov2:ldi del,BIT-1 ;bit belay
UART_d3:dec del
brne UART_d3
dec temp
brne UART_pc
ror data
sbi PORTD,TxD
ldi del,BIT ;stop bit belay
UART_d4:dec del
brne UART_d4
brtc UARTdsint2
sei
UARTdsint2:
ret
UART_packrcv:
ldi ZL,$60
UARTpgl:rcall UART_getch
st Z+,data
cpi ZL,$A0
brne UARTpgl
ret
Модуль Delays.asm
.def del =r22
.def del1 =r21
.def del2 =r20
symb_del:
ldi del,45
ldi del1,1
ldi del2,1
rcall delay
ret
delay: dec del ;3-byte delay
brne delay
dec del1
brne delay
dec del2
brne delay
ret
Модуль DATA.asm
.cseg
;Russian alphabet table: ABVGD...
; abvgd...
tab1: .db $41,$A0,$42,$A1,$E0,$45,$A3,$A4,$A5,$A6,$4B,$A7,$4D,$48,$4F,$A8,$50,$43,$54,$A9,$AA,$58,$E1,$AB,$AC,$E2,$AD,$AE,$62,$AF,$B0,$B1
.db $61,$B2,$B3,$B4,$E3,$65,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$6F,$BE,$70,$63,$BF,$79,$E4,$78,$E5,$C0,$C1,$E6,$C2,$C3,$C4,$C5,$C6,$C7,$CD,$B5
;Greetings message:
msg_greet:
.db "-=made by KikiWare=- 20 Greetings! 03 "
.db $42,$61,$63," ",$BE,$70,$B8,$B3,$65,$BF,$63,$BF,$B3,$79,$65,$BF," CheatReader v1.0 "
;"Downloading data..."
msg_load:
.db " Downloading data... Press 2 to abort "
;"Downloading is done."
msg_loaddn:
.db " Downloading is done. "
;"Download mode..."
msg_actload:
.db " Download mode is on.Waiting for begin... "
;"Downloading aborted..."
msg_ldabort:
.db " Downloading aborted! "