⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ht7289b.asm

📁 LED显示和按键管理芯片HT7289B,功能超强: SPI接口
💻 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 + -