📄 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 + -