📄 lcd-zegarek-hh.mm.ss.txt
字号:
#include <msp430x44x.h>
; CPU registers used
#define RXTXI2C R4 ; I2C Receive/Transmit Register
#define ADDRI2C R5 ; I2C Address Register
#define DATAI2C R6 ; I2C Data Register
#define BITI2C R7 ; I2C Bit Counter Register
;
; Definitions for I2C bus
RTCADDR1 equ 11010000b ; Adres RTC wpisywania
RTCADDR2 equ 11010001b; Adres RTC czytania
RTCREG equ 07h
SCL equ 001h ; P2.0 controls SCL line (pull-up)
SDA equ 002h ; P2.1 controls SDA line (pull-up)
ORG 0F000h
RESET mov.w #300h,SP ; Initialize stack-pointer
SetupLCD mov.b #LCDON+LCD4MUX+LCDSG0_7,&LCDCTL ; LCD on, 4-Mux, select pins S0-S27
SetupBT mov.b #BT_fLCD_DIV32,&BTCTL ; freqLCD = ACLK/128
SetupIO mov.b #0FCh,&P5SEL ; COMx and Rxx selected
SetupADC12 mov.w #SHT0_2+ADC12ON,&ADC12CTL0 ; Sampling time, ADC12 on
mov.w #SHP,&ADC12CTL1 ; Use sampling timer
mov.w #01h,&ADC12IE ; Enable interrupt
bis.w #ENC,&ADC12CTL0 ;
bis.b #01h,&P6SEL ; P6.0 ADC option select
call #Init_Sys ; Initialize system
;;;;;;;;;; Testowanie uk砤du;;;;;;;;;;;;;
mov.b #RTCADDR1,RXTXI2C ; Load RTC WRITE Address
call #I2C_Start ; Generate Start Condition
call #I2C_TX
call #I2C_Stop ; Generate Stop Condition
;;;;;;;;;;Wpisywanie danych do RTC;;;;;;;;;;;;;;;;;;
mov.b #RTCADDR1,RXTXI2C ; Reload RTC WRITE Address
call #I2C_Start ; Repeat Start
call #I2C_TX
mov.b #RTCREG,RXTXI2C ; Load RTC reg Byte
call #I2C_TX
mov.b #00010000b,RXTXI2C
call #I2C_TX
call #I2C_Stop
JMP ZEGAR
;------------------------------------------------------------------------------
Init_Sys; Subroutine sets up Modules and Control Registers
;------------------------------------------------------------------------------
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
mov.b #121,&SCFQCTL ; (121+1) x 2 x 32768 = 7.99 MHz
ret ; Return to Main
;------------------------------------------------------------------------------
Write_I2C
;------------------------------------------------------------------------------
mov.b R4,RXTXI2C ; Load Out-Going Data
call #I2C_TX ; Send Data and Acknowledge
ret ; Return from subroutine
;------------------------------------------------------------------------------
I2C_Start; enter SDA=1, SCL=x
; exit SDA=1, SCL=0
;------------------------------------------------------------------------------
bic.b #SCL+SDA,&P2DIR ; SCL and SDA to input direction
bic.b #SCL+SDA,&P2OUT ; SCL=1, SDA=1
bis.b #SDA,&P2DIR ; SDA=0
bis.b #SCL,&P2DIR ; SCL=0
ret
;------------------------------------------------------------------------------
I2C_TX; enter SDA=x, SCL=0
; exit SDA=1, SCL=0
;------------------------------------------------------------------------------
mov #08,BITI2C ; number of bits to transfer
I2C_TX_Bit rla.b RXTXI2C ; data bit -> carry
jc I2C_TX1 ; test carry for 1 or 0
I2C_TX0 bis.b #SDA,&P2DIR ; SDA=0
jmp I2C_TXx ; Toggle SCL
I2C_TX1 bic.b #SDA,&P2DIR ; SDA=1
jmp I2C_TXx
I2C_TXx bic.b #SCL,&P2DIR ; SCL=1
nop ; delay to meet I2C spec
nop ;
bis.b #SCL,&P2DIR ; SCL=0
dec BITI2C ; all bits read?
jnz I2C_TX_Bit ; continue until 8 bits are sent
bic.b #SDA,&P2DIR ; SDA=1, release SDA line for acknowledge
;
TX_Ackn bic.b #SCL,&P2DIR ; SCL=1
nop ; delay to meet I2C spec
nop ;
bis.b #SCL,&P2DIR ; SCL=0
ret ; Return from subroutine
;------------------------------------------------------------------------------
I2C_Stop; enter SDA=x, SCL=0
; exit SDA=1, SCL=1
;------------------------------------------------------------------------------
bis.b #SDA,&P2DIR ; SDA = 0
bic.b #SCL,&P2DIR ; SCL = 1
bic.b #SDA,&P2DIR ; SDA = 1
I2C_End ret ; Return from subroutine
ZEGAR:
;-----------------------------------------------------------------------------
; ORG 01100h ; Program Start
SetupP1
mov.b #0FFh,&P2DIR
mov.b #0FFh,&P3DIR
MOV.B #0x00,&P1IFG
MOV.B #0x00,&P1SEL
MOV.B #0x00,&P1OUT
MOV.B #0x04,&P1DIR
MOV.B #00,&P1IES
MOV.B #0x01,&P1IE
clr R10
clr R8
push R6
mov #00,R9
WEITER mov.b #0x00,LCDMEM(R9)
inc R9
cmp #20,R9
jnz WEITER
pop R9
clr R9
clr R4
clr R5
clr R6
clr R7
call #Zerowanie
EINT
Mainloop: BIT.B #01,&P1IFG ; Testet ob der Interrupt von Bit.0 ausgel鰏t wurde ; Enter LPM0, enable interrupts
nop
nop
nop
jmp Mainloop
P1_ISR;
sekundy BIC.B #01h,&P1IFG
mov.b #6,R13
call #LCD
mov.b #7,R13
mov.b POZ_TAB(R13),R14 ; Toggle P5.1
mov.b R4,0(R14)
mov.b #8,R13
mov.b POZ_TAB(R13),R14 ; Toggle P5.1
mov.b R4,0(R14)
RLA R4
CMP #130,R4
JGE restart
jmp dalej
restart
mov.b #16,R4
dalej
mov.b #6,R13
;call #LCD
INC R10 ;zwieksz sekundy
bis.b #128,LCDM12
CMP #11,R10
JL spr
dec R13 ;zmien pozycje lcd na 5
inc R8
mov.b R8,R10
call #LCD
bis.b #128,LCDM12 ; dwukropek
inc R13 ;zmien pozycje LCD na 6
CLR R10
inc R10;;;;
spr CMP #6,R8
JEQ Minuty
jmp wyjscie
Minuty:
dec R13 ; zmien pozycje na 5
CLR R10
call #LCD ; wyzeroj lCD na pozycji 5
inc R5
mov.b R5,R10
dec R13 ;zmien pozycje LCD na 4
call #LCD
bis.b #128,LCDM16
INC R10 ;zwieksz minuty
CMP #11,R10 ; sprawdz
JL spr1
clr R5
mov.b #0,R10
call #LCD
dec R13 ;zmien pozycje lcd na 3
inc R9
mov.b R9,R10
call #LCD
bis.b #128,LCDM16
CLR R10
inc R10;;;;
spr1 mov.b #6,R13 ; ustaw na pozycji 6
clr R8
clr R10
inc R10
CMP #6,R9 ; sprawdz
JEQ Godziny
jmp wyjscie
Godziny:
clr R9
mov.b #3,R13 ; zmien pozycje na 3
CLR R10
call #LCD ; wyzeroj lCD na pozycji 3
inc R6
mov.b R6,R10
dec R13 ;zmien pozycje LCD na 2
call #LCD
INC R10 ;zwieksz minuty
CMP #11,R10 ; sprawdz
JL spr2
clr R6
mov.b #0,R10
call #LCD
dec R13 ;zmien pozycje lcd na 1
inc R7
mov.b R7,R10
call #LCD
CLR R10
inc R10;;;;
spr2 mov.b #6,R13 ; ustaw na pozycji 6
CMP #2,R7 ; sprawdz wartosc dziesietna godzin
JEQ godz
jmp wyjscie
godz CMP #4,R6
call #Zerowanie
wyjscie: bis.w #ADC12SC,&ADC12CTL0 ; Start sampling/conversion
;bis.w #GIE,SR ; LPM0, ADC12_ISR will force exit
reti
Zerowanie clr R10
clr R8
clr R5
clr R9
clr R6
clr R7
mov.b #6,R13 ;pozycja wyswietlacza
mov.b #0,R10
call # LCD
dec R13 ;5
call #LCD
bis.b #128,LCDM12
dec R13 ;4
call #LCD
dec R13 ;3
call #LCD
bis.b #128,LCDM16
dec R13 ;2
call #LCD
dec R13 ;1
call #LCD
mov.b #7,R13 ;ustaw spowrotem na pozycje 6
mov.b #16,R4
ret
LCD
mov.b POZ_TAB(R13),R12
mov.b #0,R15
CMP R15,R10
JEQ zero
inc R15
CMP R15,R10
JEQ jeden
inc R15
CMP R15,R10
JEQ dwa
inc R15
CMP R15,R10
JEQ trzy
INC R15
CMP R15,R10
JEQ cztery
inc R15
CMP R15,R10
JEQ Piec
inc R15
CMP R15,R10
JEQ szesc
INC R15
CMP R15,R10
JEQ siedem
inc R15
CMP R15,R10
JEQ osiem
inc R15
CMP R15,R10
JEQ dziewiec
inc R15
CMP R15,R10
JEQ dziesiec
zero mov.b R12,R11
inc R11
mov.b #240,0(R12)
mov.b #96,0(R11)
ret
jeden mov.b R12,R11
inc R11
mov.b #96d,0(R12) ;R5- pozycja nieparzystych liczb LCDM
mov.b #00,0(R11)
ret
dwa mov.b R12,R11
inc R11
mov.b #210,0(R12)
mov.b #36,0(R11) ;R4- pozycja parzystych liczb LCDM
ret
trzy mov.b R12,R11
inc R11
mov.b #242,0(R12)
mov.b #000,0(R11)
ret
cztery mov.b R12,R11
inc R11
mov.b #98,0(R12)
mov.b #68,0(R11)
ret
Piec mov.b R12,R11
inc R11
mov.b #178,0(R12)
mov.b #68,0(R11)
ret
szesc mov.b R12,R11
inc R11
mov.b #178,0(R12)
mov.b #100,0(R11)
ret
siedem mov.b R12,R11
inc R11
mov.b #224,0(R12)
mov.b #0,0(R11)
ret
osiem mov.b R12,R11
inc R11
mov.b #242,0(R12)
mov.b #100,0(R11)
ret
dziewiec mov.b R12,R11
inc R11
mov.b #242,0(R12)
mov.b #68,0(R11)
ret
dziesiec mov.b R12,R11
inc R11
mov.b #240,0(R12)
mov.b #96,0(R11)
ret
ADC12_ISR; Exit any LPMx on reti
mov R4,R13
bis.w #ADC12SC,&ADC12CTL0
mov.b #01,R14
bis.b R4,R14
mov.b #1,R4
mov.b R14,LCDMEM(R4)
cmp.w #0Ah,&ADC12MEM0 ; ADC12MEM = A0 > 0.5AVcc?
jl ADC12_ISR_1 ;
mov.b #9,R14
bis.b R13,R14
mov.b #1,R4
mov.b R14,LCDMEM(R4)
cmp.w #3FFh,&ADC12MEM0 ; ADC12MEM = A0 > 0.5AVcc?
jl ADC12_ISR_1 ;
mov.b #13,R14
bis.b R13,R14
mov.b #1,R4
mov.b R14,LCDMEM(R4)
cmp.w #08FFh,&ADC12MEM0 ; ADC12MEM = A0 > 0.5AVcc?
jl ADC12_ISR_1 ;
mov.b #15,R14
bis.b R13,R14
mov.b #1,R4
mov.b R14,LCDMEM(R4)
ADC12_ISR_1 ;bic.w #CPUOFF,0(SP)
mov R13,R4
bic.w #ADC12SC,&ADC12CTL0
reti
POZ_TAB
DB 165 ;1
DB 163 ;2
DB 161 ;3
DB 159 ;4
DB 157 ;5
DB 155 ;6
DB 153 ;7
DB 145 ; antenka 8
DB 146 ; strzalki 9
;------------------------------------------------------------------------------
; Interrupt Vectors
;------------------------------------------------------------------------------
ORG 0FFEEh ; ADC12 Vector
DW ADC12_ISR ;
ORG 0FFE8h
DW P1_ISR
ORG 0FFFEh ; RESET Vector
DW RESET ;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -