*-----------------------------------------------—-----------------**文件名: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
导读:目前正在解读《定时器高级应用编程示例》的相关信息,《定时器高级应用编程示例》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《定时器高级应用编程示例》的详细说明。
简介:本文介绍的主要是定时器高级应用的编程示例。
提醒:《定时器高级应用编程示例》最后刷新时间 2024-03-14 01:02:51,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《定时器高级应用编程示例》该内容的真实性请自行鉴别。