网上下载的一个 电子纸驱动程序,供你参考
.SYMBOLS
.LIST ON
.CHIP R65C02
.syntax 6502
;============================================================
;= Project name: TT20 =
;= Code function: TT20 simple Demo code for EPD =
;= Finished date: 2011/11/01 =
;= Last modify date: 2010/04/07 =
;= Assemble encoder: Eric Lin =
;============================================================
;==================================================
; REGISTER ADDRESS DEFINATION =SFR地址
;==================================================
INTEN EQU 00H ;中断使能寄存器
SMCR EQU 01H ;系统模式控制寄存器
T0CTRL EQU 02H ;计数器0控制寄存器
T1CTRL EQU 03H ;计数器1控制寄存器
TMR0L EQU 04H ;计数器0低位寄存器
TMR0H EQU 05H ;计数器0高位寄存器
TMR1L EQU 06H ;计数器1低位寄存器
TMR1H EQU 07H ;计数器1高位寄存器
SECOND EQU 08H ;秒寄存器
ALMSEC EQU 09H ;秒闹铃寄存器
MINUTE EQU 0AH ;分寄存器
ALMMIN EQU 0BH ;分闹铃寄存器寄存器
HOUR EQU 0CH ;时寄存器
ALMHR EQU 0DH ;时闹铃寄存器
ADCCTRL EQU 0EH ;AD控制寄存器
ADCDATA EQU 0FH ;AD数据寄存器
SMCR2 EQU 11H ;系统模式控制寄存器2
UARTCKL EQU 12H ;异步时钟低位寄存器
UARTCKH EQU 13H ;异步时钟高位寄存器
UARTCTRL EQU 14H ;异步时钟控制寄存器
UARTDATA EQU 15H ;异步时钟数据寄存器
SPICTRL EQU 16H ;SPI控制端口
SPIDATA EQU 17H ;SPI数据端口
PAF EQU 18H A口其位寄存器
PACN EQU 19H A口NMOS/CMOS输出驱动控制寄存器
PADIR EQU 1AH A口方向寄存器
PADATA EQU 1BH A口数据寄存器
PBF EQU 1CH ;同上
PBCN EQU 1DH
PBDIR EQU 1EH
PBDATA EQU 1FH
;==================================================
; REGISTER ADDRESS DEFINATION END =
;==================================================
;---------------------------------------------------------------------------------------------------------------------------
;==================================================
; PROGRAM FLAG & PARAMETER DEFINATION =
; =
;==================================================
adL_flag equ FEH
adH_flag equ FFH
DELAY_FG1 equ 401H
DELAY_FG2 equ 402H
UARTDATA_temp equ 403H
SPIDATA_R_temp equ 404H
SPIDATA_T_temp equ 405H
count_flag equ 406H
ROM_check_flag equ 407H
RAM_check_flag equ 408H
Check_sum_buffer0 equ 409H
Check_sum_buffer1 equ 40AH
Check_sum_buffer2 equ 40BH
Hchannel_temp_reg equ 40CH
;==================================================
; PROGRAM FLAG & PARAMETER DEFINATION END =
;==================================================
;---------------------------------------------------------------------------------------------------------------------------
;==================================================
;= PROGRAM INITIAL SETTING =
;==================================================
ORG 4000H rogram initial from ROM address $4000H
RESET: ;Setting Stack RAM
sei ;置位中断禁止标志I 1→I
ldx #FFH ;将FF送入寄存器X
;设置堆叠
txs ;将变址寄存器X的内容送入堆栈指针
stz INTEN ;中断使能寄存器 清零
lda #00000011b ;bit5=0 disable LVR, bit0~1=11 enable charge pump
sta SMCR2 ;将累加器A中的内容 (00000011)送入SMCR2 (系统模式控制寄存器2)
lda #01000011b ;将(00000011)送入累加器A中,bit2=0 enable charge pump, bit0~1=11 FM/1 , bit6=1 enable 32.768Khz
sta SMCR ;将累加器A中的内容 (00000011)送入SMCR2 (系统模式控制寄存器2)
stz T0CTRL ;T0CTRL寄存器清零
stz T1CTRL ;T1CTRL寄存器清零
;----------------------------------------------------
ldx #0CH ;将FF送入寄存器X
Clear_ALL_Flag:
stz $401H,x ;
dex ;Clear RAM address (X暫存器內容減1)
bpl Clear_ALL_Flag ;若S = 0,则调到Clear_ALL_Flag处执行
;----------------------------------------------------
;---------Timer1_setting-------------
lda #FFH ;将FF送入寄存器X
sta TMR1H ;将累加器A中的内容 (FF) 送入TMR1H (计数器1高位寄存器)
lda #FFH ;将FF送入寄存器X
;lda #00H ;Timer1 for 0.5ms buffer
sta TMR1L ;将累加器A中的内容 (FF) 送入TMR1L (计数器1低位寄存器)
;---------PA_OUT_setting-------------
lda #00000001b ;将(00000001)送入累加器A中
sta PADIR ;将累加器A中内容 送入PADIR寄存器
lda #00000001b ;将(00000001)送入累加器A中
sta PACN ;将累加器A中内容 送入PACN寄存器
;----------------------------------------------------
cli ;置位中断禁止标志I 1→I
;==================================================
; PROGRAM INITIAL SETTING END =
;==================================================
;-------------------------------------------------------------------------------------------
;==================================================
; MAIN PROGRAM =
;==================================================
main:
jsr Led_display
jsr Clr_EPD_Display ;Display initial to clear ;初步显示清零。定格为全黑
jsr EPD_pattern1 ;pattern black background and white segement;黑底白字模式
jsr Delay_1s rogram Delay 1sec;延时1S
jsr Delay_1s
jsr Delay_1s
jsr Clr_EPD_Display ;clear display pattern from white to black;全屏有全白到全黑
jsr EPD_pattern2 ;pattern2 inverse the color of background and segement
jsr Delay_1s rogram Delay 1sec
jsr Delay_1s
jsr Delay_1s
jsr Led_display
jmp main
;==================================================
; MAIN PROGRAM END =
;==================================================
;-------------------------------------------------------------------------------------------
;==================================================
; Macro =
;==================================================
;==================================================
; Macro End =
;==================================================
;==================================================
; SUBROUTINE =
;==================================================
;===============Dispaly pattern2================
EPD_pattern2:
pha HA指令,功能是把累加器A的内容按堆栈指针S所指示的位置送入堆栈,然后堆栈指针减1
php HP指令,功能是把标志寄存器P的内容按堆栈指针S所指示的位置送入堆栈,然后堆栈指针减1
;--------White BG and Black Segement-------白底黑字模式
lda #01000100b ;将 01000100b 送入寄存器X
sta Hchannel_temp_reg ;将 01000100b 送入 Hchannel_temp_reg
jsr EPD_fill_in ;转到 EPD_fill_in 执行
lda #01000111b ;
sta $203CH ;SEG为低,BG为低,SEG为高
;--------White BG and Black Segement-------
lda #01010011b ;Enable All Hi-V channel read state from register
sta SMCR
lda #01000011b ;Then all Hi-V channel latch out for synchronize
sta SMCR
jsr Delay_1s
jsr Delay_1s
jsr Delay_1s
plp ;plp指令,功能是先让堆栈指针S+1,然后取加过1的S所指向的单元的内容,把它送标志寄存器P
pla ;pla指令,功能是先让堆栈指针S+1,然后取加过1的S所指向的单元的内容,把它送累加器A
rts ;从子函数返回
;===============Dispaly pattern2================
;===============Dispaly pattern1================
EPD_pattern1:
pha
php
;--------Black BG and White Segement-------黑底白字
lda #01110111b
sta Hchannel_temp_reg
jsr EPD_fill_in
lda #01000100b
sta $203CH ;SEG为高,COM和BG为低(没有电压差时候维持原来的状态)
;--------Black BG and White Segement-------
pattern_modual:
lda #01010011b ;Enable All Hi-V channel read state from register;输出更新
sta SMCR
lda #01000011b ;Then all Hi-V channel latch out for synchronize ;禁止输出更新
sta SMCR
jsr Delay_1s
jsr Delay_1s
jsr Delay_1s
plp
pla
rts
;===============Dispaly pattern1================
;===========Using Timer1 to Delay 1s============
Delay_1s:
pha
php
lda #01100000b ;将 01100000b 送入 T1CTRL
sta T1CTRL
wait_timer1:
lda T1CTRL ;Delay subroutine for 1sec
and #80H
beq wait_timer1
stz T1CTRL
plp
pla
rts
;===========Using Timer1 to Delay 1s============
;=============Clear_EPD_Display=================
Clr_EPD_Display:
pha
php
;------------Reflash to white-----------
lda #01110111b
sta Hchannel_temp_reg
jsr EPD_fill_in
lda #01000111b ;BG为低,COM,SEG为高
sta $203CH ;
;------------Reflash to white----------- ;刷白
lda #01010011b ;Enable All Hi-V channel read state from register;所有的输出状态更新
sta SMCR
lda #01000011b ;Then all Hi-V channel latch out for synchronize;禁止所有的状态更新
sta SMCR
jsr Delay_1s ;延时1S
;-----------Reflash to black------------ ;刷黑
lda #01000100b
sta Hchannel_temp_reg
jsr EPD_fill_in
lda #01110100b
sta $203CH ;BG为高,COM和SEG为低
;-----------Reflash to black------------ ;刷黑
lda #01010011b ;Enable All Hi-V channel read state from register
sta SMCR
lda #01000011b ;Then all Hi-V channel latch out for synchronize
sta SMCR
jsr Delay_1s
plp
pla
rts
;=============Clear_EPD_Display=================
;=============Fill in the same value============
EPD_fill_in:
pha
php
lda Hchannel_temp_reg ;
ldy #3CH ;One register control two Hi-V channel (refer to spec.)and then all output High=36V
store_loop:
sta $2000H,y
dey ;Storing the state into Hi-V channel control register from 2000H~203CH
bpl store_loop
plp
pla
rts
;=============Fill in the same value============
Led_display:
pha
php
lda #00000000b
sta PADATA
jsr Delay_1s
jsr Delay_1s
jsr Delay_1s
lda #00000001b
sta PADATA
plp
pla
rts
;==================================================
; SUBROUTINE END =
;==================================================
;-----------------------------------------------------------------------------------------------------------------------------------------------------
;==================================================
; INDEX TABLE =
;==================================================
;==================================================
; INDEX TABLE END =
;==================================================
;-----------------------------------------------------------------------------------------------------------------------------------------------------
;==================================================
; INTERRUPT SUBROUTINE =
;==================================================
UART_INT:
URST_INT:
ADC_INT:
TIMER1_INT:
TIMER0_INT:
PB_INT:
PA_INT:
RTC_INT:
;===================================================
; INTERRUPT SUBROUTINE END =
;===================================================
;===================================================
; VECTOR OF SYSTEM INTERRUPT =
;===================================================
ORG $7FE0H
DW UART_INT
DW URST_INT
DW ADC_INT
DW TIMER1_INT
DW TIMER0_INT
DW PB_INT
DW PA_INT
DW RTC_INT
ORG $7FFCH
DW RESET
;===================================================
; VECTOR OF SYSTEM INTERRUPT =
;===================================================
END
|