?? ht7289b.asm
字號:
; ht7289b.asm
; ht48f10e, 4.0MHz XTAL
; Created by u-hwa 2008,8
#include "ht48f10e.inc"
; spi pin defination
#define CS PB.0
#define SDA PB.1
#define SCK PB.2
#define CS_C PBC.0
#define SDA_C PBC.1
#define SCK_C PBC.2
; variables
var_da .section 'data'
timeCount db ?
byteCount db ?
bitCount db ?
temp db ?
count db ?
flag db ?
byteCount_1 db ?
spiBuffer db 16 dup(?)
;
#define KEY_ARQ flag.0 ; 重發標志
#define DAT_ARQ flag.1
;
reset_co .section at 0000h 'code'
jmp Start
start_co .section 'code'
Start:
clr INTC ; 關中斷
mov A, 05h
mov TMR, A
mov A, 93h ; fosc/16, 打開timer
mov TMRC, A
mov A, 0ffh
mov PBC, A ; 上電時全作為輸入
mov A, 9Ch
mov timeCount, A
Loop:
snz TF
jmp Loop ; 等待4ms定時到
clr INTC ; 清TF標志
mov A, 05h
mov TMR, A
clr WDT ; 清WDT
siz timeCount
jmp Loop ; 等待100ms
mov A, 9Ch
mov timeCount, A
clr KEY_ARQ
clr DAT_ARQ
; *********************************************************
; =================100ms讀取一次按鍵=======================
; *********************************************************
ReadKey:
mov A, 0C0h ; 讀鍵盤指令
mov spiBuffer[0], A
mov A, 03h
mov spiBuffer[1], A
mov A, 0Ah
mov spiBuffer[2], A
mov A, 03h
mov byteCount, A
call PutSPI
call Delay20us ; 延時20us讀返回值(3 bytes)
call GetSPIByte
mov spiBuffer[0], A
call GetSPIByte
mov spiBuffer[1], A
call GetSPIByte
mov spiBuffer[2], A
call StopSPI ; 結束SPI通訊
;
mov A, spiBuffer[0]
xor A, 0ACh
snz Z
jmp KeyError ; 數據無效
mov A, spiBuffer[2]
xor A, 0Ah
snz Z
jmp KeyError ; 數據無效
mov A, spiBuffer[1]
and A, 7fh
sub A, 38h
sz C
jmp KeyEnd ; 無按鍵
; 有效按鍵處理
sz spiBuffer[1].7
jmp KeyEnd ; 本演示程序不處理連擊鍵
mov A, spiBuffer[1]
xor A, 00h
sz Z
jmp DoKey0 ; 處理0#鍵
xor A, 01h
sz Z
jmp DoKey1 ; 處理1#鍵
xor A, 02h XOR 01h
sz Z
jmp DoKey2 ; 處理2#鍵
xor A, 03h XOR 02h
sz Z
jmp DoKey3 ; 處理3#鍵
xor A, 08h XOR 03h
sz Z
jmp DoKey8 ; 處理8#鍵
xor A, 09h XOR 08h
sz Z
jmp DoKey9 ; 處理9#鍵
xor A, 0Ah XOR 09h
sz Z
jmp DoKeyA ; 處理A#鍵
xor A, 0Bh XOR 0Ah
sz Z
jmp DoKeyB ; 處理B#鍵
xor A, 10h XOR 0Bh
sz Z
jmp DoKey10 ; 處理10#鍵
xor A, 11h XOR 10h
sz Z
jmp DoKey11 ; 處理11#鍵
xor A, 12h XOR 11h
sz Z
jmp DoKey12 ; 處理12#鍵
xor A, 13h XOR 12h
sz Z
jmp DoKey13 ; 處理13#鍵
xor A, 18h XOR 13h
sz Z
jmp DoKey18 ; 處理18#鍵
xor A, 19h XOR 18h
sz Z
jmp DoKey19 ; 處理19#鍵
xor A, 1Ah XOR 19h
sz Z
jmp DoKey1A ; 處理1A#鍵
xor A, 1Bh XOR 1Ah
sz Z
jmp DoKey1B ; 處理1B#鍵
jmp KeyEnd ; 所有鍵結束
; 0# key
DoKey0:
; 顯示復位
mov A, 0D0h
mov spiBuffer[0], A
mov A, 0AAh
mov spiBuffer[1], A
mov A, 55h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 1# key
DoKey1:
; 直接顯示: DIG0-DIG7對應顯示A-DP段
mov A, 0D6h
mov spiBuffer[0], A
mov A, 80h
mov spiBuffer[1], A
mov A, 80h
mov spiBuffer[2], A
mov A, 40h
mov spiBuffer[3], A
mov A, 20h
mov spiBuffer[4], A
mov A, 10h
mov spiBuffer[5], A
mov A, 08h
mov spiBuffer[6], A
mov A, 04h
mov spiBuffer[7], A
mov A, 02h
mov spiBuffer[8], A
mov A, 01h
mov spiBuffer[9], A
mov A, 0Ah
mov spiBuffer[10], A
mov A, 0Bh
mov byteCount, A
jmp SendData
; 2# key
DoKey2:
; 譯碼顯示: DIG0-DIG7對應顯示數字1-5,6(帶小數點),7-8
mov A, 0DCh
mov spiBuffer[0], A
mov A, 80h
mov spiBuffer[1], A
mov A, 01h
mov spiBuffer[2], A
mov A, 02h
mov spiBuffer[3], A
mov A, 03h
mov spiBuffer[4], A
mov A, 04h
mov spiBuffer[5], A
mov A, 05h
mov spiBuffer[6], A
mov A, 86h
mov spiBuffer[7], A
mov A, 07h
mov spiBuffer[8], A
mov A, 08h
mov spiBuffer[9], A
mov A, 0Ah
mov spiBuffer[10], A
mov A, 0Bh
mov byteCount, A
jmp SendData
; 3# key
DoKey3:
; 譯碼顯示: DIG0-DIG7對應顯示數字A-F, [blank], -
mov A, 0DCh
mov spiBuffer[0], A
mov A, 80h
mov spiBuffer[1], A
mov A, 0ah
mov spiBuffer[2], A
mov A, 0bh
mov spiBuffer[3], A
mov A, 0ch
mov spiBuffer[4], A
mov A, 0dh
mov spiBuffer[5], A
mov A, 0eh
mov spiBuffer[6], A
mov A, 0fh
mov spiBuffer[7], A
mov A, 10h
mov spiBuffer[8], A
mov A, 1eh
mov spiBuffer[9], A
mov A, 0Ah
mov spiBuffer[10], A
mov A, 0Bh
mov byteCount, A
jmp SendData
; 8# key
DoKey8:
; 位閃爍: DIG5閃爍
mov A, 0D0h
mov spiBuffer[0], A
mov A, 10h
mov spiBuffer[1], A
mov A, 04h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 9# key
DoKey9:
; 段閃爍: DIG5的DP段閃爍
mov A, 0D0h
mov spiBuffer[0], A
mov A, 1Dh
mov spiBuffer[1], A
mov A, 01h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; A# key
DoKeyA:
; 閃爍頻率: 1Hz
mov A, 0D0h
mov spiBuffer[0], A
mov A, 20h
mov spiBuffer[1], A
mov A, 01h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; B# key
DoKeyB:
; 閃爍頻率: 5Hz
mov A, 0D0h
mov spiBuffer[0], A
mov A, 20h
mov spiBuffer[1], A
mov A, 03h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 10# key
DoKey10:
; 亮度調節: 1/16(最暗)
mov A, 0D0h
mov spiBuffer[0], A
mov A, 30h
mov spiBuffer[1], A
mov A, 01h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 11# key
DoKey11:
; 亮度調節: 1/4
mov A, 0D0h
mov spiBuffer[0], A
mov A, 30h
mov spiBuffer[1], A
mov A, 04h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 12# key
DoKey12:
; 亮度調節: 1/2
mov A, 0D0h
mov spiBuffer[0], A
mov A, 30h
mov spiBuffer[1], A
mov A, 08h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 13# key
DoKey13:
; 亮度調節: 全亮
mov A, 0D0h
mov spiBuffer[0], A
mov A, 30h
mov spiBuffer[1], A
mov A, 00h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 18# key
DoKey18:
; 位隱顯: DIG0隱顯
mov A, 0D0h
mov spiBuffer[0], A
mov A, 00h
mov spiBuffer[1], A
mov A, 80h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 19# key
DoKey19:
; 位顯示: DIG0顯示
mov A, 0D0h
mov spiBuffer[0], A
mov A, 70h
mov spiBuffer[1], A
mov A, 80h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 1A# key
DoKey1A:
; 段關閉: DIG1的G段關閉
mov A, 0D0h
mov spiBuffer[0], A
mov A, 09h
mov spiBuffer[1], A
mov A, 02h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; 1B# key
DoKey1B:
; 段點亮: DIG1的G段電亮
mov A, 0D0h
mov spiBuffer[0], A
mov A, 79h
mov spiBuffer[1], A
mov A, 02h
mov spiBuffer[2], A
mov A, 0Ah
mov spiBuffer[3], A
mov A, 04h
mov byteCount, A
jmp SendData
; send data
SendData:
; ******************************************************************************
; ===================連續兩次數據收發至少延時50us==============================
; ******************************************************************************
call Delay50us ; 50us
mov A, byteCount
mov byteCount_1, A ; 備份以重發
call PutSPI
mov A, byteCount_1
mov byteCount, A
call Delay20us
call GetSPIByte
call StopSPI
xor A, 0AAh
sz Z
jmp KeyEnd
; 接收0xAA應答錯誤
NoAck:
; 延時500us重發
sz DAT_ARQ
jmp KeyEnd ; 只重發一次
call Delay500us
set DAT_ARQ ; 置DATA已重發標志
jmp SendData
; 讀取按鍵代碼錯
KeyError:
; 延時500us重發
sz KEY_ARQ
jmp KeyEnd
call Delay500us
set KEY_ARQ ; 置KEY已重發標志
jmp ReadKey
KeyEnd:
jmp Loop
; *********************************************************
; ================== SPI收發程序 ==========================
; *********************************************************
; delay 500us
Delay500us:
mov A, 165d
sdz ACC
jmp $ - 1
nop
ret
; delay 50us
Delay50us:
mov A, 15d
sdz ACC
jmp $ - 1
nop
ret
; delay 20us
Delay20us:
mov A, 05d
sdz ACC
jmp $ - 1
nop
ret
; Get Data from SPI
GetSPIByte: ; 字節之間時間間隔至少8us
set SDA_C ; SDA as input
mov A, 08h
mov bitCount, A
GetSPIByte_1:
clr SCK
nop ; SCK拉低至少4us
nop
rl temp
clr temp.0
set SCK ; SCK為高至少4us
nop
sz SDA
set temp.0
sdz bitCount
jmp GetSPIByte_1
mov A, temp
ret
; Put Data to SPI
PutSPI:
set SCK ; SCK輸出高
clr SCK_C
clr CS ; CS拉低
clr CS_C
clr SDA_C
call Delay50us ; 從CS拉低到SCK下降沿延時50us
clr count
PutSPI_1:
mov A, count ; 字節之間時間間隔至少8us
clr BP ; bank 0
add A, offset spiBuffer
mov MP0, A
mov A, IAR0
mov temp, A
mov A, 08h
mov bitCount, A
PutSPI_2:
clr SCK ; SCK拉低至少4us
clr SDA
sz temp.7
set SDA
rl temp
set SCK ; SCK為高至少4us
nop
sdz bitCount
jmp PutSPI_2
inc count ; 下一字節
sdz byteCount
jmp PutSPI_1
set SDA_C ; 發送完畢SDA作為輸入
ret
; Stop SPI
StopSPI:
set CS ; CS拉高
ret
END
; end of file
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -