AC16程序功能.docx
《AC16程序功能.docx》由会员分享,可在线阅读,更多相关《AC16程序功能.docx(27页珍藏版)》请在冰豆网上搜索。
AC16程序功能
;********************************************************************
;*程序功能:
单片机技术初步实践模拟考试平台*
;*设计者:
蔡泽凡*
;*时间:
2014年4月15日*
;********************************************************************
;********************************************************************
;**
;*重要提示:
*
;*
(1)需要添加代码的地方已经用"%%%%"标识*
;**
;*
(2)LED1~4分别由B口的0~3引脚控制,设置LED的驱动引脚的电平*
;*如要使LED1点亮,则应使用下面的语句*
;*BCLR0,PTBD*
;*如要使LED1熄灭,则应使用下面的语句*
;*BSET0,PTBD*
;**
;*(3)变量初始化*
;*下面的两句把ScanIndex初始化为26*
;*LDA#26T*
;*STAScanIndex*
;**
;*(4)使一个8位的变量或者寄存器的某位的状态取反,对于PTAD来说*
;*要使0位的状态取反,使用下面3句*
;*LDAPTAD*
;*EOR#%00000001*
;*STAPTAD*
;*要使1位的状态取反,使用下面3句*
;*LDAPTAD*
;*EOR#%00000010*
;*STAPTAD*
;*要使2位的状态取反,使用下面3句*
;*LDAPTAD*
;*EOR#%00000100*
;*STAPTAD*
;*要使3位的状态取反,使用下面3句*
;*LDAPTAD*
;*EOR#%00001000*
;*STAPTAD*
;*要使4位的状态取反,使用下面3句*
;*LDAPTAD*
;*EOR#%00010000*
;*STAPTAD*
;*要使5位的状态取反,使用下面3句*
;*LDAPTAD*
;*EOR#%00100000*
;*STAPTAD*
;*要使6位的状态取反,使用下面3句*
;*LDAPTAD*
;*EOR#%01000000*
;*STAPTAD*
;*要使7位的状态取反,使用下面3句*
;*LDAPTAD*
;*EOR#%10000000*
;*STAPTAD*
;**
;*(5)对某个标志(如RefreshSegFlag)的操作*
;*把RefreshSegFlag设为0,使用以下的语句*
;*CLRRefreshSegFlag*
;*把RefreshSegFlag设为1,使用以下的语句*
;*MOV#$01,RefreshSegFlag*
;*使RefreshSegFlag的状态取反,设第0位有效,使用以下的语句*
;*LDARefreshSegFlag*
;*EOR#%00000001*
;*STARefreshSegFlag*
;**
;********************************************************************
;包含寄存器定义的头文件
INCLUDE'derivative.inc'
;**************************************************************
;*常量宏定义:
用一些有意义的名称来代替一些常数*
;**************************************************************
;SN74LS164信号定义
SN74LS164ABEQUPTFD_PTFD4;SN74LS164数据信号
SN74LS164CLKEQUPTFD_PTFD5;SN74LS164时钟信号
;七段码信号定义
SegCom1EQUPTFD_PTFD1;七段码的个位公共信号
SegCom2EQUPTFD_PTFD0;七段码的十位公共信号
;矩阵按键信号定义
KeyRow1EQUPTAD_PTAD0;矩阵按键的行1信号
KeyRow2EQUPTAD_PTAD1;矩阵按键的行2信号
KeyColumn1EQUPTDD_PTDD0;矩阵按键的列1信号
KeyColumn2EQUPTDD_PTDD1;矩阵按键的列2信号
;**************************************************************
;*变量定义:
在这里定义一般变量或者数据表格*
;**************************************************************
ORGZ_RAMStart;定位变量/数据区的起始地址:
0页空间
;时间平台变量
To2msRMB1;2ms计时
To20msRMB1;20ms计时
To200msRMB1;200ms计时
To1sRMB1;1s计时
SecondRMB1;秒数
;控制七段码的变量
RefreshSegFlagRMB1;七段码刷新标志
ScanIndexRMB1;控制七段码扫描片选
SegContentRMB1;七段码的显示内容,
;0:
当前温度,非0:
临界温度
SegContentCtrlRMB1;七段码的显示内容切换控制
;控制蜂鸣器的变量
BuzzerFlagRMB1;蜂鸣器驱动标志
;控制按键的变量
KeyScanFlagRMB1;按键扫描的间隔
KeyScanTimesRMB1;按键扫描的次数
KeyBufferRMB1;按键键值缓冲值
KeyEffectRMB1;按键的有效键值
ArrayKeyScanFlagRMB1;按键扫描标志
ArrayKeyCodeRMB1;矩阵按键键码
ArrayKeyCodeLastRMB1;上次矩阵按键键码
ArrayKeyPressedTimeRMB1;矩阵按键按下时间,单位:
2毫秒
;温度采样的变量
ADSampleFlagRMB1;AD采样标志
AD11ValueRMB1;AD11管脚的AD采样值
Temperature1RMB1;PTD3采集到的温度值
MaxTemperature1RMB1;温度值的最大允许值30~35
;控制蜂鸣器的变量
LedFlashFlagRMB1;Led闪烁标志
;**************************************************************
;*以下为程序代码*
;**************************************************************
ORGROMStart;定位程序区的起始地址
;七段码段码表
SegTbl;0123456789
FCB$03,$9F,$25,$0D,$99,$49,$41,$1F,$01,$09
;101112131415全灭
FCB$11,$C1,$63,$85,$61,$71,$FF
;AD值--温度对应表
ADToTempTbl
FCB0T,0T,0T,1T,1T,2T,2T,2T,3T,3T;AD56~65
FCB4T,4T,4T,5T,5T,5T,6T,6T,6T,7T;AD66~75
FCB7T,8T,8T,8T,9T,9T,9T,10T,10T,10T;AD76~85
FCB11T,11T,11T,12T,12T,12T,13T,13T,13T,14T;AD86~95
FCB14T,14T,15T,15T,15T,16T,16T,16T,17T,17T;AD96~105
FCB17T,18T,18T,18T,19T,19T,19T,20T,20T,20T;AD106~115
FCB21T,21T,21T,22T,22T,22T,23T,23T,23T,24T;AD116~125
FCB24T,24T,25T,25T,26T,26T,26T,27T,27T,27T;AD126~135
FCB28T,28T,28T,29T,29T,29T,30T,30T,30T,31T;AD136~145
FCB31T,32T,32T,32T,33T,33T,33T,34T,34T,34T;AD146~155
FCB35T,35T,36T,36T,36T,37T,37T,38T,38T,38T;AD156~165
FCB39T,39T,40T,40T,41T,41T,41T,42T,42T,43T;AD166~175
FCB43T,44T,44T,45T,45T,45T,46T,46T,47T,47T;AD176~185
FCB48T,48T,49T,49T,50T,50T,51T,52T,52T,53T;AD186~195
FCB53T,54T,54T,55T,56T,56T,57T,58T,58T,59T;AD196~205
FCB60T,60T,61T,62T,62T,63T,64T,65T,66T,66T;AD206~215
FCB67T,68T,69T,70T,71T,72T,73T,74T,75T,76T;AD216~225
FCB77T,78T,80T,81T,82T,84T,85T,86T,88T,90T;AD226~235
FCB91T,93T,95T,97T;AD236~239
;十六_十转换表
T_to_H_tab
FCB$00,$01,$02,$03,$04,$05,$06,$07,$08,$09
FCB$10,$11,$12,$13,$14,$15,$16,$17,$18,$19
FCB$20,$21,$22,$23,$24,$25,$26,$27,$28,$29
FCB$30,$31,$32,$33,$34,$35,$36,$37,$38,$39
FCB$40,$41,$42,$43,$44,$45,$46,$47,$48,$49
FCB$50,$51,$52,$53,$54,$55,$56,$57,$58,$59
FCB$60,$61,$62,$63,$64,$65,$66,$67,$68,$69
FCB$70,$71,$72,$73,$74,$75,$76,$77,$78,$79
FCB$80,$81,$82,$83,$84,$85,$86,$87,$88,$89
FCB$90,$91,$92,$93,$94,$95,$96,$97,$98,$99
;-------------------------------------------------------------
;_Startup:
单片机的程序入口
_Startup:
;程序的入口地址(复位向量所指向的地址)
;------------------------------------------------
;单片机的初始化部分--------------------------
;选择CPU工作时钟
;使用外部晶振,不启用内部锁相环,即采用FBE方式
;外部晶振使用8MHz,要使总线频率为Fbus=4MHz,则
LDA#$70
STAICGC1;时钟源选择外部高频的晶振
BRCLRICGS1_ERCS,ICGS1,*;等待外部的晶振时钟稳定下来
LDHX#RAMEnd+1;初始化堆栈
TXS
SEI;关中断
;以下3句关看门狗,SOPT不能按位操作,需要整体赋值
LDASOPT
AND#7FH
STASOPT
;初始化矩阵按键管脚
LDAPTDDD
AND#$FC
STAPTDDD
LDAPTAD
AND#$FC
STAPTAD
LDAPTADD
ORA#$03
STAPTADD
;设置蜂鸣器的驱动引脚
BCLR2,PTCD
BSET2,PTCDD
;设置LED的驱动引脚的方向,都设置为输出
BSET0,PTBDD;LED1控制引脚的方向控制位
BSET1,PTBDD;LED2控制引脚的方向控制位
BSET2,PTBDD;LED3控制引脚的方向控制位
BSET3,PTBDD;LED4控制引脚的方向控制位
;设置LED的驱动引脚的电平
;%%%%设置需要控制的LED灯对应的控制管脚
;变量初始化
CLRTo2ms;清2ms计时
CLRTo20ms;清20ms计时
CLRTo200ms;清200ms计时
CLRTo1s;清1s计时
CLRSecond;清秒变量
CLRBuzzerFlag;清蜂鸣器驱动标志
CLRRefreshSegFlag;七段码刷新标志清零
CLRSegContent;SegContent清零
CLRSegContentCtrl;SegContentCtrl清零
CLRArrayKeyScanFlag;清按键扫描标志
CLRArrayKeyPressedTime;ArrayKeyPressedTime清零
CLRLedFlashFlag;清Led闪烁标志
CLRADSampleFlag;AD采样标志清零
;下面的两句把温度值初始化为26
LDA#26T
STATemperature1;设置温度初始值为26
;%%%%在下面添加代码,初始化最大允许温度值MaxTemperature1
JSRSN74LS164SegInit;SN74LS164和七段码初始化
JSRTimerInit;定时器1溢出中断设置
CLI;开中断
CLRBuzzerFlag;清蜂鸣器驱动标志
;-------------------------------------------------------------
;程序主循环:
一般把程序的主体部分安排在主循环中
mainLoop:
;主循环的开始
TSTRefreshSegFlag;七段码的控制
BEQTestKeyScan
CLRRefreshSegFlag
JSRRefreshSeg
;按键扫描与处理------------------------
TestKeyScan
TSTArrayKeyScanFlag
BEQTestADSample
CLRArrayKeyScanFlag
JSRArrayKeyScan
;温度的检测与比较----------------------
TestADSample
TSTADSampleFlag
BEQmainLoop
CLRADSampleFlag;清AD采样标志
;温度的检测
JSRADConversion
JSRADToTemperature
;%%%%在下面添加代码实现温度的比较,即温度Temperature1和最大温度MaxTemperature1比较
BRAmainLoop;跳转到主循环的开始
;**************************************************************
;*七段码刷新子函数*
;**************************************************************
RefreshSeg
CLRH;消除变址寄存器高8位的影响
;关七段码片选
BCLRSegCom1,PTFD
BCLRSegCom2,PTFD
INCScanIndex;使ScanIndex的0位在0和1切换
BRCLR0,ScanIndex,RefreshSegCom2
;更新七段码个位
RefreshSegCom1:
;以十进制的格式显示
TSTSegContent;判断显示的内容
BEQDispTemperature_1
DispMaxTemperature_1
LDXMaxTemperature1
BRAConvetToDec_1
DispTemperature_1
LDXTemperature1
ConvetToDec_1
LDAT_to_H_tab,X
AND#$0F
TAX;把AD10Value的低4位送到X
LDASegTbl,X;通过查表获得段码
TSTSegContent
BEQ*+4
AND#$FE;显示设定温度值时个位显示小数点
JSRSN74LS164SendData;把段码送到SN74LS164
BSETSegCom1,PTFD;开个位片选
RTS
;更新七段码十位
RefreshSegCom2:
TSTSegContent;判断显示的内容
BEQDispTemperature_2
DispMaxTemperature_2
LDXMaxTemperature1
BRAConvetToDec_2
DispTemperature_2
LDXTemperature1
ConvetToDec_2
LDAT_to_H_tab,X
LSRA
LSRA
LSRA
LSRA
TAX;把AD10Value的高4位送到X
CLRH
LDASegTbl,X;通过查表获得段码
JSRSN74LS164SendData;把段码送到SN74LS164
BSETSegCom2,PTFD;开十位片选
RTS
;**************************************************************
;*延时程序*
;**************************************************************
DelaySomeTime
LDHX#0;把寄存器H和X清零
Delay
AIX#1;使H:
X的值加1
CPHX#400T;判断H:
X的值是否达到400
BNEDelay;如果H:
X的值还没有达到400,则转到Delay
;否则,执行下一条语句
RTS
;**************************************************************
;*矩阵按键扫描子函数:
*
;*每2毫秒扫描1次,只考虑单按键的情况.*
;**************************************************************
ArrayKeyScan
;判断是否有按键按下
LDAPTDD
AND#$03
CMP#$03
BEQArrayKeyScanExit;没有按键
;软件消抖
INCArrayKeyPressedTime
LDAArrayKeyPressedTime
CMP#35T
BLOArrayKeyScanReturn
;软件消抖完毕
CLRArrayKeyPressedTime
;判断哪个按键被按下
;先判断第一行
TestKeyRow1
BCLRKeyRow1,PTAD
BSETKeyRow2,PTAD
;由于按键电路中有RC电路,因此换片选后必须延时
;片刻,以使RC电路充分的放电或者充电,该延时时间
;的初值必须根据具体的总线频率做适当的调整.
;延时程序
BSRDelaySomeTime
TestKey1
BRSETKeyColumn1,PTDD,TestKey3
LDA#1T
TestKey3
BRSETKeyColumn2,PTDD,TestKeyRow2
LDA#3T
;再判断第二行
TestKeyRow2
BCLRKeyRow2,PTAD
BSETKeyRow1,PTAD
;由于按键电路中有RC电路,因此换片选后必须延时
;片刻,以使RC电路充分的放电或者充电,该延时时间
;的初值必须根据具体的总线频率做适当的调整.
;延时程序
BSRDelaySomeTime
TestKey2
BRSETKeyColumn1,PTDD,TestKey4
LDA#2T
TestKey4
BRSETKeyColumn2,PTDD,SaveKeyCode
LDA#4T
SaveKeyCode
STAArrayKeyCode
BSRArrayKeyAction;矩阵按键操作
;使按键的两个片选信号均有效
BCLRKeyRow1,PTAD
BCLRKeyRow2,PTAD
BRAArrayKeyScanReturn
;复位按键相关变量
ArrayKeyScanExit
CLRArrayKeyPressedTime
LDA#$FF
STAArrayKeyCode
STAArrayKeyCodeLast
;退出按键扫描
ArrayKeyScanReturn
RTS
;**************************************************************
;*矩阵按键处理子函数*
;**************************************************************
ArrayKeyAction
LDAArrayKeyCode
CMPArrayKeyCodeLast
BEQArrayKeyActionReturn;和上次键值相等不处理
STAArrayKeyCodeLast;保存新的键值
TestKey1Operation
CMP#1T