*-----------------------------------------------—-----------------*
*文件名: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