软件设计详细说明
项目名TMPT
日期2002/9/12 版本号V0.1
设计者AJIE http://www.21ic.com http://www.21icbbs.com Author: ajie[文档更新表更新日期更新原因]
更新日期更新原因
2002/9/10 增加测量准确度更改温度查表算法2002/9/11目录
软件各模块的功能实现主要是各执行模块的规划
一实时时钟不考虑其他模块影响时的功能实现与其他模块的联系最小时间片段
二AD转换
三UART RX功能
四UART TX 功能
五显示切换按键处理
六LCD显示
七软件看门狗
[ 任何一个模块的设计都应该是先从不考虑其他模块的影响开始然后把其他模块的影响加进来遵从一种从简单到复杂的原则这里我只有第一个模块是完整的后面我都不写了因为是让大家看看所以举一反三吧]
程序空间规划
一ROM空间规划
二R AM空间规划变量的定义及各变量的作用解释
[ 其实是对你上面模块变量的一种总结但已经联系到了具体的编程]
程序状态转移图
[ 适合复杂的控制情况此处因为只有一种稳态单循环所以不画了你可以看看无绳电话或者是手机的软件设计中的程序状态转移图那个是复杂的画得很详细]
程序结构规划
[ 就是监控程序的规划主程序在什么状态时应该监控哪些功能应该处在哪种循环扫描状态下需要注意的只有一点执行程序段的时间不能超过最短扫描时间否则你在执行程序时有功能要求处理而你没扫描到直到下次功能要求处理这就使程序发生错误可以参考一下北航的单片机应用程序设计技术周航慈著那里对监控程序的写法说得好清楚的由于这里只有一种稳态一个主扫描循环功能比较单一这部分我就不列出来了]
程序流程图
[ 一般用VISIO画速度很快的这个肯定大家都会]
[ 这样做的好处让你看见一个复杂系统原来并不复杂理顺关系从简单到复杂一步一步来你很快就明白了这样在升级或者是修改时你可以马上找到相应的模块改之并知道哪些相关模块需要修改否则根本不用考虑]
由于后面部分都是大家看看就知道该怎么干的我就不多说了后面也没有相关的具体例子模块一实时时钟
采用TIMER1 来计时设定为每过025 S 中断一次
则一初始化
1初始化比较寄存器和控制寄存器
#0FFH CR10 比较寄存器
计数器TM1中的值等于比较比较寄存器中的值
时产生中断INTTM1
#0FH TCL1 Timer clock select register 1
TCL1.3 TCL1.2 TCL1.1 TCL1.0 TIMER1 CLOCK
0 1 1 0 fx / 2 pwr 2
0 1 1 1 fx / 2 pwr 3
1 0 0 0 fx /
2 pwr 4
1 0 0 1 fx /
2 pwr 5
1 0 1 0 fx /
2 pwr 6
1 0 1 1 fx /
2 pwr 7
1 1 0 0 fx /
2 pwr 8
1 1 0 1 fx /
2 pwr 9
1 1 1 0 fx /
2 pwr 10
1 1 1 1 fx /
2 pwr 12
TCL1.7 TCL1.6 TCL1.5 TCL1.4 TIMER2 CLOCK
NOT USED . DEFINED AS 0 0 0 0
#01H TMC1
0 0 0 0 0 TMC12 TCE2 TCE1
TMC12 0 8bit_timer register X 2 channels mode ( TM1 TM2 )
1 16bit_timer register X 1 channel mode ( TM )
TCE2 0 operation stop ( TM2 clear to 0 )
1 operation enable
TCE1 0 operation stop ( TM2 clear to 0 )
1 operation enable
2开放中断口
二INTTM1中断处理
进入中断即表示时间已过025 秒
1用 QTR_SECOND_CNT统计中断次数每中断一次QTR_SECOND_CNT
加 1 当 QTR_SECOND_CNT等于 4 时表示时间已过一秒则清
QTR_SECOND_CNT 并置位一秒标志 F_ONE_SECOND
RAM QTR_SECOND_CNT INIT #0
此变量用来统计0.25秒的中断次数如果已有4次则表示时间
已过一秒则清此变量
FLAG F_ONE_SECOND INIT #0
此标志用来标示时间是否已过一秒如果过一秒则置位此标志1秒的相关处理结束后清此标志
2判断发送数据计时器UART_TM_CNT是否等于0如果等于0则不作任何处理跳出中断如果不等于0则UART_TM_CNT减一
UART_TM_CNT用来统计发送一个MSG后的时间详细说明见发送模块里
面关于此变量的定义
三主循环
判断F_ONE_SECOND标志是否置位如果置位则表示一秒已过进入修改时
间模块UPDATE_TIME
1清一秒标志F_ONE_SECOND
2一秒计数器ONE_SECOND_CNT加1判断1秒计数器等于5否如果不等于5则该计数器加一并进入下一步如果等于5则表示5秒钟已过再
判断ADCR_CNT是否等于8如果不等于8表示一分钟内还没采样8次温
度值则ADCR_CNT加一并打开A/D中断再进入下一步如果等于8
则表示一分钟内已采样8次温度值则不作任何处理进入下一步3修改实时时钟UPDATE_CLOCK
1秒处理秒加1再判断秒是否大于59如果大于59则进入分处理并
清秒变量否则直接结束
RAM SECOND 0 ~ 59 INIT #0 1 bytes HEX
2分处理进入后分加一并置位发送时间标志F_SEND_TM_MSG和
置位计算温度累加值标志F_ADD_TMPT清温度转换次数变
量 ADCR_CNT如果分大于59则进入时处理并清分变量
否则结束修改
RAM MINUTE 0 ~ 59 INIT #0 1 bytes HEX 3时处理进入后时加1则判断时间是否已过23小时如果已过则
进入天处理并清时变量否则结束修改
RAM HOUR 0 ~ 23 INIT #0 1 bytes HEX
4天处理进入后天加1判断该月的最大天数用天变量与之进行比
较如果已过则天初始化为1并进入月处理否则结束修
改
RAM DATE 1 ~ 31 INIT #1 1 bytes HEX 5月处理进入后月加1判断月是否已大于12 如果大于则月置
值1并结束修改
RAM MONTH 1 ~ 12 INIT #1 1 bytes HEX
与其他模块的联系的详细说明
一A/D 转换模块在主循环中增加一个RAM ONE_SECOND_CNT 统计1秒的次数,每过5秒则判断此一分钟里面是否已经获得了8次ADCR值如果是
则不做任何相关处理否则继续开ADCR中断并累加ADCR的中断计数值
即ADCR_CNT加1
二何一个循环路径的执行时间不能超过1秒否则影响实时时钟三UART 通讯模块
1 TD338 UART 发送完一个MSG后等待DECT FP 回答如果3秒后还没有
收到回送信息则重发此MSG包重发三次还没有收到则放弃在UART
通讯中发完一个数据包后即置UART_TIME_CNT为120.25 s * 12 = 3 TIMER1每中断一次即对此RAM 进行操作如果UART_TIME_CNT 为0则不进行任何处理否则每次减1
TD338 UART在发送完一个MSG后即等待DECT FP 的ACK MSG如果
收到ACK MSG则清UART_TIME_CNT否则对UART_TIME_CNT进行判
断如果UART_TIME_CNT等于0则表示3秒已过无ACK MSG重发
上次所发数据
用此计时模块来统计3秒时间已过否存在一定的误差误差范围在0.25s 内
2时钟每过一分钟则置时间发送标志通过UART口给DECT FP 发送
SEND_TIME_MSG
模块二 AD转换
在AD转换中我们用ANI0来用做模拟信号输入口转换时间是 100/fx 用软件启动
初始化为 Stop conversion 则
一初始化
#20H ADM
CS TRG FR1 FR0 ADM3 ADM2 ADM1 HSC
CS A/D convertion operation control
0 operation stop
1 operation start
TRG External trigger selection
0 no external trigger ( software starts )
1 conversion starts by external trigger ( hardware starts )
FR1 FR0 HSC
0 0 1 160 / fx
0 1 1 80 / fx
1 0 0 100 / fx
1 0 1 200 / fx
ADM3 ADM2 ADM1 Analog Input Channel Selection
000 ~ 111 VS ANI0 ~ ANI7
#01H ADIS number of analog input input channel selection register
0 0 0 0 ADIS3 ADIS2 ADIS1 ADIS0
ADIS3 ADIS2 ADIS1 ADIS0
0 0 0 0 no analog input channel
0 0 0 1 1 channel ( ANI0 )
0 0 1 0 2 channel ( ANI0 , ANI1 )
0 0 1 1 3 channel ( ANI0 ~ ANI2 )
0 1 0 0 4 channel ( ANI0 ~ ANI3 )
0 1 0 1 5 channel ( ANI0 ~ ANI4 )
0 1 1 0 6 channel ( ANI0 ~ ANI5 )
0 1 1 1 7 channel ( ANI0 ~ ANI6 )
1 0 0 0 8 channel ( ANI0 ~ ANI7 )
二在改变实时时钟模块UPDATE_TIME下进行如下判断
时钟已过 5 秒否如果已过清1秒计时器并判断这一分钟内是否已进行了8次A/D转换如果是则不再进行A/D转换如果不是则打开AD转换即 #1 CS 时钟没过5秒则不作处理
RAM ONE_SECOND_CNT INIT #0 统计秒的次数RAM ADCR_CNT INIT #0 统计一分钟内A/D转换的次数
如果一分钟内转换了8次则不
再转换
ADCR_CNT在时钟过去一分钟后清0
三INTAD中断处理
进入中断则表示一次AD转换结束读出ADCR中的数据保存AD_CNV_RESULT中
置位新AD数据需要处理的标志F_NEW_ADCR关A / D中断.
RAM AD_CNV_RSLT INIT #0 1 byte
FLAG F_NEW_ADCR 是否有A / D 转换数据需要处理标志
1 有新的ADCR数据需要处理
0 无ADCR数据需要处理
四主循环LOOKUP_TMPT
查询 F_NEW_ADCR 置位否如果置位则有新的AD 数据待处理处理此数
据
1 AD 结果查表查得相应的温度值
先手工对电阻温度表进行计算处理得出电压和温度的对应关系再通过
电压和ADCR的关系算出ADCR值和温度的对应关系最后查表的是
ADCR值和温度的对应关系由于只有在-6 ~ 45 度范围内才有ADCR范围
值和温度的一一对应关系超出此范围则会出现不同温度ADCR值可能相
同的重合现象见103ET的温度电阻对应表为解决此一问题我们根据
温度缓慢变化原则只要阻值在该温度允许电阻变化范围内则认为温度不
变做成两张表在不同情况下查不同的表可得出相对准确的温度值
1果此次的ADCR值大于上次测量的ADCR值则说明温度可能在上升查表一具体取值方式可参考我们做的ADCR温度对应表
查的方向40 ~ 70 度
为了缩短查询时间我们采用上次的ADCR值和TMPT值作为参考进
行查询根据TMPT值移动HL指针指到上次的TMPT对应的ROM地
址以HL为基础对
先根据上次的温度值计算出上次的查询位置值从上次的位置值开始
递加查询本次的温度值
2果此次的ADCR值小于上次测量的ADCR值则说明温度可能在下降
查表二
查的方向 70 ~ 40 度
查出温度值后AD_CNV_RSLT AD_LAST_CNV
并用本次温度值更新上次温度值 TMPT_NOW TMPT_LAST
RAM AD_LAST_RSLT INIT #0 1byte ADCR值
RAM AD_TMPT_RSLT INIT #0 1byte ADCR值
RAM TMPT_NOW 此数据最高位为符号位后面为温度值HEX
RAM TMPT_LAST 此数据最高位为符号位后面为温度值HEX Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
Bit7 是符号为Bit7 = 1 表示此温度数据为负
Bit7 = 0 表示此温度数据为正Bit6 ~ Bit 0为温度数据
对温度度采样次数进行计数并把各温度值分别存入一温度记录表中采用
循环保存保存到第四十个RECORD空间时自动转到第一个保存
RAM TMPT_RECORD_CNT 1 bytes 温度数据存储指针
RAM TMPT_RECORD 40 bytes 温度数据记录表首地址
五主循环ADD_TMPT
1分钟过否如果已过则计算所有测得温度的累加值计算后置位温度平均标志
F_A VERAGE_TMPT
RAM TMPTH HEX
RAM TMPTL HEX
FLAG F_TMPT_SIGN 用来表示累加值的符号
1为负0 为正
FLAG F_A VERAGE_TMPT 标示是否计算温度平均值
1表示累加值计算结束可以计算平均值了
0表示不能计算平均值
六主循环A VERAGE_TMPT
如果温度平均标志置位则计算温度平均值并把数据从HEX格式转化成标准温度的BCD格式比较这次的平均温度值和上次保存的平均温度值如果不等则置显示刷新标志发送温度标志并把本次的温度值移入显示温度的存储空间把此次的温度平均值移入上次温度平均值存储空间
RAM LAST_TMPTH
RAM LAST_TMPTL
FLAG F_UPDATE_DISP 刷新显示时置位
FLAG F_SEND_TMPT_MSG 发送温度时置位模块三 UART 模块初始化和RX功能
我们采用NEC 780062芯片的Serial interface channel 2 作为 UART 通讯
串行通讯接口2被设置成可收发的8位无奇偶校研一位停止位9600
The serial channel 2 is set to 2_way UART mode of 8_bit , no parity ,1 stop bit and 9600 baud from the internal baud rate generator .
一初始化
# 00H CSIM2
This register is set when serial interface is used in the 3_wire seriial I/O mode.When UART mode is selected , CSIM2 should be set to 00H.
# 0CBH ASIM Asynchronous serial interface mode register (ASIM )
TXE RXE PS1 PS0 CL SL ISRM SCK
TXE Control Operation Control
0 Transmit operation stopped
1 Transmit operation enabled
RXE Receive Operation Control
0 Receive operation stopped
1 Receive operation enabled
PS1 PS0 Parity Bit Specification
0 0 No parity
0 1 0 parity always added in transmission
No parity test in reception (parity error not generated )
1 0 Odd parity
2 1 Even parity
CL Character Length Specification
0 7bits
1 8bits
SL Transmit Data Stop Bit Length Specification
0 1_bit
1 2_bit
ISRM Control of Reception Completion Interrupt in Case of Error
Generation
0 Reception completion interrupt generated in case of error
generation
1 Reception completion interrupt not generated in case of error
generation
SCK Clock Selection in Asynchronous Serial Interface Mode
0 Input clock from off_chip to ASCK pin
1 Dedicated baud rate generator output
# 7BH BRGC Baud rate generator control register (BRGC )
TPS3 TPS2 TPS1 TPS0 MDL3 MDL2 MDL1 MDL0 TPL3 ~ TPL0 = 0 0 0 0 ~ 1 1 1 0 VS k = 0 ~ 14
TPS3 ~ TPS0 = 0 0 0 0 VS n = 11
TPS3 ~ TPS0 = 0 1 0 1 ~ 1 1 1 0 VS n = 1 ~ 10[ Baud rate ] = fxx / [ ( 2 pwr n ) X ( k + 16 ) ]
fxx :
MCS = 1 fxx = fx
MCS = 0 fxx = fx/2
二 INTSR 中断
进入此中断表示已有数据收到读出该数据到RAM RX_DATA
读ASIS判定该数据是否出错如果出错不予处理否则置接受到数据标志
F_RX_DATA
RAM RX_DATA 1byte INIT #0
FLAG F_RX_DATA INIT #0 接收到正确的数据时置位
三主循环FRAME_CHECK
对接收到的数据进行判断整个数据包接收完否如果接收完则置新数据包收到的标志如果未接收完则继续接收详细的过程请参考流程图
FLAG F_NEW_MSG INIT #0
1 收到新数据包0 未收到新数据包
RAM RX_BUFF 接受数据包首址划分空间16 bytes
三主循环 DECODE_MSG
收到新数据包否如果收到则对该数据包进行解码否则不做任何处理
1收到DECT FP 发过来的应答包
1收到ACK_OK包则数据发送成功此时清MSG正在发送标志
F_UART_KEEP清发送超时计时器UART_TM_CNT清发送次数存储器
TX_MSG_CNT
2收到ERROR BUSY Undefined No Response Bad PP number数据包则此次发送不成功清重发标志马上进行重发操作
2收到DECT FP 发过来的命令包
1要求发送三个通道和室内温度的数据包 GET_THG_MSG
Length = 02
Command = 0x57
Sub command = 0xF0
Data = none
TD338收到此数据包后回送PROVIDE_THG_MSG实际上在此模块部分只要置位F_SEND_THG_MSG即可
Length = 15
Command = 0x57
Subcommand = 0xF0
Data = temperature (2 bytes ) and humidity (1 bytes ) in channel 1 temperature (2 bytes ) and humidity (1 bytes ) in channel 2
temperature (2 bytes ) and humidity (1 bytes ) in channel 3
temperature (2 bytes ) and humidity (1 bytes ) indoor
weather (1 bytes )
此处当我们回送数据包时我们用通道1来回送温度其他的通道全部采用默认值各值如下
Data = Channel1 temperature 实际测量发送 humidity 0x50
Channel2 temperature #0x00 humity 0x00
Channel3 temperature #0x00 humity 0x00
Weather 0x06
TD338发完此数据包后即等待DECT FP 回送ACK数据包如果DECT FP 回送了ACK_OK数据包则表示整个发送完成具体操作见上面收到ACK 包的处理
2收到要求发送时间的数据包GET_TIME_MSG
Length = 0x02
Command = 0x54
Subcommand = 0xE0
Data = none
TD338收到此数据包后回送TIME_MSG实际上在此模块中只要置位标志F_SEND_TM_MSG即可注意这里发送的时间是压缩码时间从时
间变量空间取出的时间必须经过HEX BCD变换才能发送区别从DECT FP 发过来的时间
Length = 0x07
Command = 0x54
Sub command = 0xE3
Data = Second ( 1byte )压缩码
Minute (1byte )压缩码
Hour (1byte )压缩码
Date (1byte )压缩码
Month (1byte )压缩码
TD 338 发送完此数据包后即等待DECT FP 回送ACK 数据包见上面的处理
3收到时间数据包 TIME_MSG 这里面的时间数据为HEX码可直接移入
时间变量空间
Length = 0x07
Command = 0x54
Sub command = 0xE3
Data = Second ( 1byte )
Minute (1byte )
Hour (1byte )
Date (1byte )
Month (1byte )
NOTE 此处收到数据包后不回送ACK包协议不具有统一和完整性好需要修改
模块四 UART TX 模块
一INT_TX 中断
进入此中断表示一个字节的数据发送完毕判断一个数据包发送完毕否如果已发送完则不做任何处理跳出中断如果没有发送完则从TX_BUFF中读出下一个数据继续进行发送直到所有的数据全部发送完即发送COUNT为0时表示一个MSG已经全部发送完毕
RAM TX_BUFF 发送数据首址
RAM COUNT 发送数据长度
二主循环
判断有数据包正在发送否如果有数据包正在发送_TX_KEEP = 1 则不作任何处理如果没有数据包在发送则判断是否有数据包需要发送如果有数据包需要发送则置位数据包正在发送标志 F_TX_KEEP 并进入数据包发送模块否则不作任何处理
数据发送子模块
1如果F_SEND_THG_MSG为真则表示有数据包需要发送发送
PROVIDE_THG_MSG
2如果F_SEND_TM_MSG为真则表示有数据包需要发送发送TIME_MSG
如果这些发送数据标志全部为0则不作任何处理
三主循环重送处理
判断有数据正在发送否是判断发送计时器UART_TM_CNT等于0否如果不等于0则不做任何处理如果等于0再判断TX_MSG_CNT(重送次数)等于0否如果等于0则清正在发送数据包标志F_TX_KEEP后进入下一步操作否则TX_BUFF 里面的数据重发#12 UART_TX_TIME并且TX_MSG_CNT减1发送首址重回TX_BUFF并把发送长度再次送入TX_LENGTH COUNT模块五显示切换按键处理
一初始化
端口为输入口带上拉电阻未按下状态为1
二全部在定时器二的中断中实现
查询端口端口为低时表示可能有键按下判断键按下标志F_KEY_PRS是否置位如果置位表示上次按下的键还未释放不作任何处理如果键按下标志复位则表示刚检测到端口可能有键按下则延时1ms继续判断直到18ms后端口还为低则表示有键按下置位键按下标志切换LCD显示模并置位刷新显示标志F_UPDATE_LCD 如果查询端口为高则表示键已释放则复位键按下标志F_KEY_PRS
#1 F_UPDATE_DISP
FLAG F_DISP_UNIT INIT #0 复位表示是显示摄氏度
置位表示是显示华氏度
FLAG F_KEY_PRS INIT #0模块六 LCD显示
一初始化
LCD 时钟512Hz ,1/3 biasing and 1/3 duty cycle #1 TMC2.1
LCDM LCD display mode register INIT #31H LCDM
LCDON LCDM6 LCDM5 LCDM4 0 LCDM2 LCDM1 LCDM0 LCDM2 LCDM1 LCDM0 Bias method
0 0 0 1 / 3
0 0 1 1 / 3
0 1 0 1 / 2
0 1 1 1 / 2
1 0 0 static
Other setting prohibitted
LCDM6 LCDM5 LCDM4 LCD clock seletion
0 0 0 fw / 2 pwr 9
0 0 1 fw / 2 pwr 8
0 1 0 fw / 2 pwr 7
0 1 1 fw / 2 pwr 6
fw = fxx / 2 pwr 7
DISPON LCD display
on
0 display
off
1 display
LCDC LCD display control register INIT #01H LCDC
LCDC7 LCDC6 LCDC5 LCDC4 0 0 LEPS LIPS
LEPS LIPS LCD driving power supply seletion
0 0 Doesn’t supply power to LCD
0 1 Supply power to LCD from VDD pin
1 0 Supply power to LCD from BIAS pin
(short BIAS and VLCD pins internally)
1 1 Setting prohibitted
LCD7 ~ LCD4 Setting pins S24 ~ S39 port pins or segment pins NOT USED HERE.
显示为摄氏度先执行一次温度测量后再显示实际温度
二主循环
显示刷新标志置位否置位则进行显示刷新先判定显示模式如果是摄氏度显示模式则把数据直接从温度显示RAM中移入显示缓冲区如果是华氏度显示模式则先把摄氏度转换成华氏度再移入显示缓冲区把显示缓冲区中的数据依次读出进行显示LCD 8段码的显示采用查数字码表算法把各数字位一位一位查表计算显示刷新结束后显示刷新标志复位如果显示刷新标志复位则无处理继续主循环
鉴于LCD格式尚未最后确定此处暂不详细化
RAM DIGIT1 待显示数字
RAM DIGIT2 待显示数字
RAM DIGIT3 待显示数字
RAM DIGIT4 待显示数字RAM LCD_TMPTL 待显示温度值低位
RAM LCD_TMPTH 待显示温度值高位
待显示温度数据存放格式请参考相关的通讯协议文档温度格式
FLAG F_UNIT_HUA 温度单位标志
1 显示华氏度0 显示摄氏度
FLAG F_DP_ON 小数点标志
1 点亮0 熄灭
FLAG F_SHE_SIGN 摄氏度的符号
1 摄氏度为负0 摄氏度为正
FLAG F_HUA_SIGN 华氏度符号
1 华氏度为负0 华氏度为正
1根据温度单位标志显示温度单位
F_UNIT_HUA 1 显示华氏度单位0 显示摄氏度单位
2根据温度单位标志进行下面的处理
如果是显示摄氏度则不做任何处理进入下一步
如果是显示华氏度则先把摄氏度变为华氏度再进行显示变换如下
1计算公式华氏度 = 摄氏度X 9 / 5 + 32
2用符号F_SHE_SIGN记录摄氏度的符号1为负0为正
3把LCD_TMPT2LCD_TMPT1转化成十六进制数再进行四则计算结果保留在LCD_TMPT2,LCD_TMPT1中再对LCD_TMPT2,LCD_TMPT1进
行处理见下面3
3显示摄氏度温度范围为 40 ~ 70
1如果温度为正0 ~ 70
熄灭DIGIT1
LCD_TMPTH低四位数放在DIGIT2显示
LCD_TMPTL高四位放在DIGIT3显示
LCD_TMPTL低四位放在DIGIT4显示
置小数点标志
2如果温度为负 40~ 0
熄灭DIGIT1
号放在DIGIT2显示
A如果LCD_TMPTH低四位不等于040 ~ 10
LCD_TMPTH低四位放在DIGIT3显示
LCD_TMPTL高四位放在DIGIT4显示
复位小数点标志
B BYTE2的低四位等于0 10 ~ 0
LCD_TMPTL的高四位放在DIGIT3显示
LCD_TMPTL的低四位放在DIGIT4显示
置小数点标志
4显示华氏度温度范围为40 ℉ ~ 158 ℉
1如果温度为正0 ℉ ~ 158 ℉
LCD_TMPTH高四位放在DIGIT1显示
LCD_TMPTH低四位放在DIGIT2显示LCD_TMPTL高四位放在DIGIT3显示
LCD_TMPTL低四位放在DIGIT4显示
置小数点标志
2如果温度为负 40℉~ 0 ℉
熄灭DIGIT1
号放在DIGIT2显示
A如果LCD_TMPTH低四位不等于040℉ ~ 10℉
LCD_TMPTH低四位放在DIGIT3显示
LCD_TMPTL高四位放在DIGIT4显示
复位小数点标志
B LCD_TMPTL的低四位等于0 10℉ ~ 0℉
LCD_TMPTL的高四位放在DIGIT3显示
LCD_TMPTL的低四位放在DIGIT4显示
置小数点标志
5数据显示
1 DIGIT1
为0则不显示任何数字不为0则显示1
2 DIGIT2
DIGIT2 = 0 是DIGIT1 = 0也是则DIGIT2不能显示故#0BH –DIGIT2 DIGIT2等于0 ~ 9时直接查表DGT_TABLE显示0 ~ 9
DIGIT2如果等于0AH则显示
DIGIT2如果等于0BH则无任何显示
3 DIGIT3
直接查表DGT_TABLE显示0 ~ 9
4 DIGIT4
直接查表DGT_TABLE显示0 ~ 9
6小数点处理
根据小数点的标志点亮或者熄灭小数点
1点亮0熄灭
为什么小数点放在最后处理是因为小数点和数字3的第一个DISP RAM 地址相同为方便所以放在最后可参考相关的显示和DISP RAM 对应表
LCD查表数据 DIGIT显示数字和RAM地址输入值的关系具体
DB 06H,05H,06H ;display '0' DIGIT = 0
DB 06H,00H,00H ;display '1' DIGIT = 1
DB 04H,07H,02H ;display '2' DIGIT = 2
DB 06H,07H,00H ;display '3' DIGIT = 3
DB 06H,02H,04H ;display '4' DIGIT = 4
DB 02H,07H,04H ;display '5' DIGIT = 5
DB 02H,07H,06H ;display '6' DIGIT = 6
DB 06H,04H,00H ;display '7' DIGIT = 7
DB 06H,07H,06H ;display '8' DIGIT = 8DB 06H,07H,04H ;display '9' DIGIT = 9 DB 00H,02H,00H ;display '-' DIGIT = 0AH DB 00H,00H,00H ;no display DIGIT = 0BH
程序空间规划
-> 整个系统中的RAM资源情况
FA58H - FA7FH : LCD RAM
FD00H - FE1FH :
Direct addressing
Register indirect addressing
Basing addressing
Bassed indexed addressing
FE20H - FEDFH : Short Direct Addressing
FEE0H - FEFFH : Register addressing
Short Direct Addressing
FF00H - FF1FH : Short Direct Addressing
SFR Addressing
FF1FH - FFFFH : SFR Addressing
-> 本系统中可规划RAM资源
--------FD00H - FE1FH : 可用作SP空间和RAM表在此用做SP空间--------FE20H - FEDFH : 一般的RAM变量保存空间
->本系统中的ROM资源情况
0000H - 003FH : 中断向量地址空间不可用作通用编程空间
0040H - 007FH : CALLT Table Area 不可用作通用编程空间
0080H - 07FFH : Program Area 通用编程空间
0800H - 0FFFH : CALLF Entry Area 不可用作通用编程空间
1000H - 3FFFH : Program Area 通用编程空间
->本系统中可规划的ROM资源情况
0080H - 07FFH : 系统初始化及主循环代码空间
1000H - 3FFFH : 系统中断子程序及各执行模块代码空间
变量定义及意义说明
---------------------------------------------------
MORAM DSEG AT 0FE20H
;---------------TIMER
QTR_SECOND_CNT DS 1 ;FE20H 0.25 S counter
ONE_SECOND_CNT DS 1
UART_TM_CNT DS 1 ;FE22H
SECOND DS 1
MINUTE DS 1 ;FE24HHOUR DS 1
DATE DS 1 ;FE26H
MONTH DS 1
;---------------UART RX
RX_DATA DS 1 ;FE28H
RX_CNT DS 1
RX_BUFF DS 7 ;FE2AH ~ FE30H FRAME_STATUS DS 1
LENGTH DS 1 ;FE32H
;---------------UART TX
COUNT DS 1
TX_BUFF DS 19 ;FE34H
TX_DATA DS 1
TX_LENGTH DS 1 ;FE36H
;---------------LCD DISPLAY
DIGIT1 DS 1 ;FE38H
DIGIT2 DS 1
DIGIT3 DS 1 ;FE3AH
DIGIT4 DS 1
LCD_TMPTH DS 1 ;FE3CH
LCD_TMPTL DS 1
;---------------A/D CONVERSION
ADCR_CNT DS 1 ;FE3EH
AD_CNV_RSLT DS 1
AD_LAST_RSLT DS 1 ;FE40H
AD_TMPT_CNT DS 1
TMPTL_LAST DS 1 ;FE42H TMPTH_NOW DS 1
TMPT_RECORD_CNT DS 1 ;FE44H
TMPTH DS 1 ;FE46H
TMPTL DS 1
TMPT_RECORD DS 40 ;FE48H ~ FE87H ;---------------
;FLAG definication ;0FE88H
;---------------------------------------------------
definication MFLAG
BSEG ;bitF_ONE_SECOND DBIT ;0FE88.0
F_SEND_TM_MSG DBIT ;1
F_SEND_THG_MSG DBIT ;2
F_ADD_TMPT DBIT ;3
F_A VERAGE_TMPT DBIT ;4
F_NEW_ADCR DBIT ;5
F_UPDATE_DISP DBIT ;6
F_UNIT_HUA DBIT ;7
F_DP_ON DBIT ;0FE.0 F_SHE_SIGN DBIT ;1
F_HUA_SIGN DBIT ;2
F_EIGHT_TMPT DBIT ;3
F_RX_DATA DBIT ;4
F_TMPT_SIGN DBIT ;5
;---------------------------------------------------