;[LED.s]小灯驱动---------------------------------------*
;本文件包含:                                           *
;    (1)LEDinit:定义控制小灯的MCU的I/O引脚为输出       *
;    (2)LEDShow:驱动数码管显示数字                     *
;硬件连接:                                             *
;------------------------------------------------------*

 ;数码管驱动所需头文件
    INCLUDE 'MC9S08AW60.inc'    ;MCU映像寄存器名
 ;包含公用函数
    INCLUDE "GeneralFun.asm"   
     
 ;声明外部函数  
  XDEF LEDinit      ;小灯初始化  
  XDEF LEDshow      ;驱动小灯"亮","暗"
 ;小灯控制引脚宏定义
Light_P:   equ   PTBD    ;灯(Light)接在PTB口   
LEDdata:   equ   PTBD    ;LED数码管数据口
LEDdata_D: equ   PTBDD   ;相应的方向寄存器
LEDcs:     equ   PTDD    ;LED位选口 
LEDcs_D:   equ   PTDDD   ;位选口相应方向寄存器
 
 
MY_ZEROPAGE: SECTION  SHORT ;在此处定义你的变量 
LoopNum: DS.B 1             ;定义循环次数
TableAddr: DS.B 2           ;Table数组地址
CSAddr: DS.B 2              ;CSTable数组地址
TempHX: DS.W 1              ;存放临时的HX
CSNumIndex: DS.B 2          ;要显示的数据在CSTable中的索引       
ShowNumIndex: DS.B 2        ;要显示的数据在Table中的索引 

MyCode:      SECTION
;LEDinit:4连排LED初始化---------------------------------------------------*
;功能:定义LED控制引脚的数据口和位选口为输出                               *
;人口:无                                                                  *
;出口:无                                                                  *
;-------------------------------------------------------------------------*

LEDinit:
    LDA #$FF 
    STA LEDdata_D       ;数据口为输出
    STA LEDcs_D         ;位选口为输出
   RTS

;LEDshow: 在4连排LED上显示4个十进制数-------------------------------------*
;功能:在4连排LED上显示以Buf为首地址的4个数据                              *
;参数:HX 待显示数据的首地址                                               *
;返回:无                                                                  *
;内部调用:LEDshow1                                                        *
;-------------------------------------------------------------------------*
LEDshow:
    PSHA             ;保护寄存器A
    PSHH             ;保护寄存器H
    PSHX             ;保护寄存器X    
    LDA #0
    STA ShowNumIndex
    STA ShowNumIndex+1 ;清空ShowNumIndex 
    STA CSNumIndex
    STA CSNumIndex+1   ;清空ShowNumIndex 
    LDA #3
loop:
    STA LoopNum      ;设置循环次数
    ;去片选信号
    STHX TempHX      ;将HX的值先存放在TempHX中
    LDHX #CStable    ;取得片选信号首址
    STHX CSAddr
    LDA  LoopNum
    STA  CSNumIndex+1
    LDA  CSAddr +1
    ADD  CSNumIndex+1
    STA  CSAddr +1
    LDA  CSAddr
    ADC  CSNumIndex
    STA  CSAddr
    LDHX CSAddr
    LDA ,X
    STA LEDcs       ;送片选信号
     
    ;取数据
    LDHX TempHX   
    LDA ,X           ;取参数中的数字
    SUB  #$30                          
    STA ShowNumIndex+1 
    LDHX #Table       ;读取Table 16位地址，并将该地址存放在TableAddr数组中
    STHX TableAddr
    LDA  TableAddr + 1
    ADD  ShowNumIndex+1
    STA  TableAddr + 1
    LDA  TableAddr
    ADC  ShowNumIndex
    STA  TableAddr
    LDHX TableAddr
    LDA ,X            ;读取显示字       
    STA LEDdata       ;送显示数字
    LDHX #$000F       ;延时
    JSR  DelayHX 
    LDHX TempHX
    AIX  #1
    LDA LoopNum
    SUB #1
    BGE loop
    PULX
    PULH
    PULA    
  RTS

;[显示码表]   1   2   3   4   5   6   7   8   9
Table:
    DC.B $3F,$06,$5B,$4F,$66, $6D,$7D,$07,$7F,$6F
;[位选信号]    0     1    2   3
CStable: 
    DC.B $DF,$EF,$FD,$FE