AC16程序功能.docx

上传人:b****3 文档编号:24816493 上传时间:2023-06-01 格式:DOCX 页数:27 大小:21.82KB
下载 相关 举报
AC16程序功能.docx_第1页
第1页 / 共27页
AC16程序功能.docx_第2页
第2页 / 共27页
AC16程序功能.docx_第3页
第3页 / 共27页
AC16程序功能.docx_第4页
第4页 / 共27页
AC16程序功能.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

AC16程序功能.docx

《AC16程序功能.docx》由会员分享,可在线阅读,更多相关《AC16程序功能.docx(27页珍藏版)》请在冰豆网上搜索。

AC16程序功能.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1