*-----------------------------------------------—-----------------* *文件名: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寄存器选择信号接PTC0 LCD-RW equ 1 ;读写信号接PTC1 LCD-E equ 2 ;LCD使能信号接PTC2 RAMstartAddr equ $0040 ;RAM的起始地址 FlashStartAddr equ $8000 ;程序开始地址 *-----变量定义-------------------------------------------------------- org RAMstartAddr LCD_Buffer rmb 16 ;第一行显示缓冲器(16字节) flag rmb 1 value1 rmb 1 ;第二行显示缓冲器 value2 rmb 1 value3 rmb 1 *-------------------主程序开始----------------------------------------------- org FlashStartAddr MainInit: ;复位后程序从此开始执行 ;系统初始化 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 #$00 Display1: ;把要显示的16个初始字符放入LCD-Buffer中 LDA DisplayBytes,X STA LCD_Buffer,X AIX #1 CPHX #$10 BNE Display1 ;循环16次 BRA Start DisplayBytes 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.6ms Clr-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 #$FF DelaySub3: 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 end ab: 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