定时器高级应用编程示例

来源:本站
导读:目前正在解读《定时器高级应用编程示例》的相关信息,《定时器高级应用编程示例》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《定时器高级应用编程示例》的详细说明。
简介:本文介绍的主要是定时器高级应用的编程示例。

*-----------------------------------------------—-----------------**文件名:shiyan62.ASM                                               **硬件连接:(1)LCD显示模块、键盘模块插在上排,利用系统的默认连接。 **         (2)PTD0接一开关。                                      **         (3)信号输入输出根据使用的定时器模块确定。              *                            *程序描述:  利用微控制器MC68HC908GP32内定时器1通道0的输入捕捉功能测**         量外部输入信号的周期,外部输入信号由扫频/函数信号产生器产**         生,被测信号周期小于250us。测量结果在LCD上显示,LCD上排稳**         定显示"Signal Period is",下排靠右以十进制形式"xxx us"格 * *         式显示周期。                                             **目的:理解微控制器定时器模块输入捕捉、输出比较、PWM等的基本原理,掌**     握MC68HC908GP32定时器模块的高级应用方法。                    * *--------------------------------------------------—--------------*  *----------寄存器地址--------------------------------------------------------DDRA      equ  $0004            ;A口数据方向寄存器PTA       equ  $0000            ;A口数据寄存器PTAPUE  equ  $000D              ;A口上拉电阻允许寄存器DDRB    equ  $0005              ;B口数据方向寄存器   (PTB口接开关作为从机号)PTB     equ  $0001              ;B口数据寄存器PTC     equ  $0002              ;C口数据寄存器DDRC    equ  $0006              ;C口数据方向寄存器T1SC      equ $0020             ;定时器1状态和控制寄存器T1CNTH    equ $0021             ;定时器1计数寄存器(高位)T1CNTL    equ $0022             ;定时器1计数寄存器(低位)T1MODH    equ $0023             ;定时器1模数寄存器(高位)T1MODL    equ $0024             ;定时器1模数寄存器(低位)T1SC0     equ $0025             ;定时器1通道0状态和控制寄存器T1CH0H    equ $0026             ;定时器1通道0的通道寄存器(高位)T1CH0L    equ $0027             ;定时器1通道0的通道寄存器(低位)T1SC1     equ $0028             ;定时器1通道1状态和控制寄存器T1CH1H    equ $0029             ;定时器1通道1的通道寄存器(高位)T1CH1L    equ $002A             ;定时器1通道1的通道寄存器(低位)LCD-RS  equ  0                  ;LCD寄存器选择信号接PTC0LCD-RW  equ  1                  ;读写信号接PTC1LCD-E   equ  2                  ;LCD使能信号接PTC2RAMstartAddr   equ  $0040       ;RAM的起始地址FlashStartAddr equ  $8000       ;程序开始地址   *-----变量定义--------------------------------------------------------      org RAMstartAddrLCD_Buffer  rmb  16             ;第一行显示缓冲器(16字节)flag       rmb    1value1      rmb    1             ;第二行显示缓冲器value2      rmb    1             value3      rmb    1           *-------------------主程序开始----------------------------------------------- org    FlashStartAddrMainInit:                       ;复位后程序从此开始执行         ;系统初始化        SEI                     ;禁止所有中断        LDHX #$023F             ;堆栈初始化,放入GP32的RAM最高端        TXS        JSR Init0               ;调系统初始化子程序Init0        clr flag        CLR value1        clr value2        clr value3        ;I/O初始化        NOP        LDA  #%11111111                 STA  DDRA        STA  DDRB        LDA  #%00010111                         STA  DDRC        ;------------------------------------------------------------------         ;定时器1通道0初始化        LDA  #%00110011         ;不允许溢出中断、不启动计数、分频因子=8        STA  T1SC               ;定时器1状态和控制寄存器        LDA  #%01000100         ;设为输入捕捉模式,允许输入捕捉中断,                                ;上升沿捕捉(即电平发生变化时产生中断)        STA  T1SC0              ;定时器1通道0状态和控制寄存器        BCLR 5,T1SC             ;允许定时器1计数寄存器计数            CLI                     ;开放中断       ;---------------------初始化结束-------------------------------------    LDHX #$00Display1:                       ;把要显示的16个初始字符放入LCD-Buffer中        LDA  DisplayBytes,X        STA  LCD_Buffer,X        AIX  #1        CPHX #$10        BNE  Display1            ;循环16次        BRA  StartDisplayBytes  FCB  "Signal Period is";主程序循环Start:        JSR  Init-LCD            ;LCD初始化           JSR  Show-LCD-Buffer     ;LCD显示        LDA  #$0A        JSR DelaySub        BRA Start*------以下为子程序存放处--------------------------------------------*----系统初始化子程序(Init0)----------------------------------**功能:系统初始化                                             **入口:无                                                     **出口:                                                       **占用CPU内寄存器:A                                           **-------------------------------------------------------------* Init0:                          ;系统初始化Init0子程序        LDA  #%00000001         ;初始化CONFIG2        STA  $001E        LDA  #%00111101         ;初始化CONFIG1        STA  $001F        CLR  $0036              ;初始化PTCL        ;fBUS=2.4576MHz        ;MOV  #$01,$0036        ;MOV  #$01,$0038        ;MOV  #$2C,$0039        ;MOV  #$80,$003A        ;fBUS=8MHz        MOV  #$02,$0036        MOV  #$03,$0038        MOV  #$D1,$0039        MOV  #$D0,$003A        BSET 5,$0036        BSET 7,$0037        BSET 4,$0036        RTS*---INIT-LCD(LCD初始化子程序)----------------------------------------**入口:无                                                             **功能:初始化LCD(HD44780)                                             **调用子程序:LCDCOMMAND(LCD命令执行子程序)                            **占用CPU内部寄存器:A,X                                               **--------------------------------------------------------------------*Init-LCD:        BCLR LCD-RS,PTC         ;令LCD的RS=0,R/W=0,进行LCD初始化        BCLR LCD-RW,PTC        LDA  #%00111000         ;功能设置:8位数据接口,2行显示,5*7点阵模式        JSR  LCDCommand        LDA  #%00001000         ;显示开关控制:关显示,关光标显示,不闪烁        JSR  LCDCommand        LDHX #$0060             ;等待40us        DBNZX *        BCLR LCD-RS,PTC         ;RS,RW清零开始清屏        BCLR LCD-RW,PTC        LDA  #%00000001          ;清屏指令        JSR  LCDCommand        LDHX #$89d              ;等待清屏完毕,时间>1.6msClr-LCD-2-MS:                   ;延时        AIX #-1        CPHX #0        BNE Clr-LCD-2-MS        LDA #%00000110          ;输入方式设置:数据读写操作后,AC自动增1                                                           ;显示不动,光标左移        JSR LCDCommand        LDA #%00010100          ;光标移位设置:光标右移一个字符位,AC自动加1        JSR LCDCommand        LDA #%00001100          ;显示开关设置:开显示,关光标显示,不闪烁        JSR LCDCommand        RTS************************************************************************----LCDCommand(LCD命令执行子程序)------------------------------------**入口:A                                                               **功能:对A中指令使用PORTA作为输出口,到LCD进行命令执行或字符显示        **占用CPU内部寄存器:A                                                  **----------------------------------------------------------------------LCDCommand:        PSHH                     ;保护现场        PSHX        LDHX #$0060              ;等待40us        DBNZX *        STA PTB                  ;把指令码送到B口        NOP        NOP        BSET LCD-E,PTC           ;LCD开始接受数据,置使能位为1        NOP        NOP        BCLR LCD-E,PTC           ;LCD结束接受数据,置使能位为0        LDHX #$0060              ;等待40us        DBNZX *        PULX                     ;恢复现场        PULH        RTS************************************************************************----Show-LCD-Buffer(LCD显示子程序)-----------------------------------**入口:内存LCD-Buffer开始的16个地址中存放要显示的字符编码、value       **功能:显示内存LCD-Buffer开始的16字节数据在第一行,value中容在第二行   *     *调用:LCDCommand子程序                                                **占用CPU内部寄存器:A,HX                                               **---------------------------------------------------------------------*Show-LCD-Buffer:                ;进行显示数据寄存器(DD RAM)地址设置        BCLR LCD-RS,PTC        BCLR LCD-RW,PTC         ;设置前8个字符首DD RAM地址        LDA  #%10000000        JSR  LCDCommand        LDHX #$00                ;显示前16个字符Show-First-16Byte:        BSET LCD-RS,PTC         ;令LCD的RS=1,R/W=0,写入数据到DD RAM中        BCLR LCD-RW,PTC        LDA  LCD_Buffer,X        ;将{LCD-BUFFER+X}的数据放入A作为入口        JSR  LCDCommand        AIX  #1        CPHX #$10        BNE  Show-First-16Byte        BCLR LCD-RS,PTC        BCLR LCD-RW,PTC        LDA  #%11000000          ;设置后1个字符首DD RAM地址        JSR  LCDCommand        LDHX #$00               ;显示后1个字符Show-Next-16Byte:        BSET LCD-RS,PTC         ;?LCD?RS=1,R/W=0,?????DD RAM?        BCLR LCD-RW,PTC        LDA  #$20             ;?value?????A????        JSR  LCDCommand        AIX  #1        CPHX #$0A        BNE  Show-Next-16Byte        BSET LCD-RS,PTC         ;?LCD?RS=1,R/W=0,?????DD RAM?        BCLR LCD-RW,PTC        LDA  value1        JSR  LCDCommand        BSET LCD-RS,PTC         ;?LCD?RS=1,R/W=0,?????DD RAM?        BCLR LCD-RW,PTC        LDA  value2        JSR  LCDCommand        BSET LCD-RS,PTC         ;?LCD?RS=1,R/W=0,?????DD RAM?        BCLR LCD-RW,PTC        LDA  value3        JSR  LCDCommand        BSET LCD-RS,PTC         ;?LCD?RS=1,R/W=0,?????DD RAM?        BCLR LCD-RW,PTC        LDA  #$20        JSR  LCDCommand        BSET LCD-RS,PTC         ;?LCD?RS=1,R/W=0,?????DD RAM?        BCLR LCD-RW,PTC        LDA  #!117        JSR  LCDCommand        BSET LCD-RS,PTC         ;?LCD?RS=1,R/W=0,?????DD RAM?        BCLR LCD-RW,PTC        LDA  #!115        JSR  LCDCommand                RTS*------------------程序延时子程序(DelaySub)-------------------**功能:程序方法延时,延时长短由入口A中的数值决定              **入口:A=延时长度                                             **注:最小延时0.1秒,最大延时A=$FF ,255*0.1=25.5秒             **    这里要求延时1秒                                          **占用CPU内寄存器:HX,A                                        **-------------------------------------------------------------* DelaySub:                        ;延时0.1秒        PSHH                      ;保据寄存器HX       PSHX       DelaySub1:       LDHX  #!320             DelaySub2:        PSHA                      ;保护寄存器A       LDA   #$FFDelaySub3:           DBNZA DelaySub3        PULA       AIX #-$1                  ;对HX进行减1循环       CPHX #$0000       BNE DelaySub2       DBNZA DelaySub1        PULX       PULH       RTS                       ;子程序返回*-----定时器1通道0输入捕捉中断子程序(Timer1CH0In)-------------**功能:定时器输入捕捉中断处理,取反指示灯                     **入口:无                                                     **出口:                                                       **占用CPU内寄存器:HX,A                                        **-------------------------------------------------------------* Timer1CH0In:        PSHH                    ;保护 H 寄存器        lda flag        cbeqa #$01,ab        MOV T1CH0L,$70         inc flag        bra endab:        mov T1CH0L,$71        CLR flag                        lda $71        sub $70        sta $72          LDHX #$000A          DIV          STHX value3          CLRH             DIV          STA value1          PSHH          PULA          STA value2          lda value3          add #$30          sta value3          lda value2          add #$30          sta value2          lda value1          add #$30          sta value1        end:                LDA  T1SC0              ;清除定时器1通道0输入捕捉中断标志位        BCLR 7,T1SC0                     PULH                    ;释放 H 寄存器        RTI*----------向量区-----------------------------------------------------------       ORG    $FFF6             ;定时器1通道0输入捕捉中断向量       DW     Timer1CH0In       ORG    $FFFE             ;复位向量       DW     MainInit 

提醒:《定时器高级应用编程示例》最后刷新时间 2024-03-14 01:02:51,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《定时器高级应用编程示例》该内容的真实性请自行鉴别。