📄 yaokongrili.asm
字号:
;名称:多功能遥控器日历
;----------------------------
;多功能遥控器日历功能描述
;----------------------------
;1.能够显示阳历年月日,星期几,
;2.具有时间显示:小时,分钟,秒钟,秒钟闪烁功能,采用24小时制,12小时制
;3.当前温度实时显示,显示范围-9'C---99'C
;4.能够显示当日距离新年的总天数,以及一年当中的第几周
;5.断电数据保留
;6.采用按键和遥控器双重调节功能,尤其遥控器调节大大提高了人机互动
;7.16个重要节日指示灯提醒,大小月指示灯,闰年,闰月指示灯
;-----------------------------
;多功能遥控器日历显示面板
;-----------------------------
;2007年06月23日 星期6
;第174天 23:56:57
;第25周 农历05月09日
;当前温度:30.6'C
;-----------------------------
; 定义各种变量地址
;-----------------------------
SCLK BIT P3.5 ;定义DS1302时钟
IO BIT P3.6 ;定义DS1302输入输出
RST BIT P3.7 ;定义DS1302复位端
IRIN BIT P3.2 ;定义红外接收头的输入输出
DYLED BIT P3.3 ;定义大月指示灯
XYLED BIT P3.4 ;定义小月指示灯
RYLED BIT P1.0 ;定义闰月指示灯
RNLED BIT P1.1 ;定义闰年指示灯
AMLED BIT P1.2 ;上午指示灯
PMLED BIT P1.3 ;下午指示灯
DECNUM BIT P1.4 ;减1按钮
ADDNUM BIT P1.5 ;加1按钮
DMODE BIT P1.6 ;逆序调整按钮
MODE BIT P1.7 ;顺序调整按钮
LED1 BIT P0.0 ;时间1号指示灯
LED2 BIT P0.1 ;时间2号指示灯
LS154_A BIT P0.2 ;定义154,4输入口
LS154_B BIT P0.3
LS154_C BIT P0.4
LS154_D BIT P0.5
LS154_G BIT P0.6
BP BIT P0.7
date_line BIT P2.7 ;定义温度传感器输入输出
YEARFLASH BIT 00H ;定义年闪烁
MONTHFLASH BIT 01H ;定义月闪烁
DAYFLASH BIT 02H ;定义日闪烁
HOURFLASH BIT 03H ;定义小时闪烁
MINUTEFLASH BIT 04H ;定义分钟闪烁
SECONDFLASH BIT 05H ;定义秒钟闪烁
KEEPFLASH BIT 06H ;定义保持闪烁
CON_ADJ BIT 07H ;定义遥控器调整进入位
YEARBIT BIT 08H ;年调整位
MONTHBIT BIT 09H ;月调整位
DAYBIT BIT 0AH ;日调整位
HOURBIT BIT 0BH ;时调整位
MINUTEBIT BIT 0CH ;分调整位
CHOICE_ADJ BIT 0EH ;遥控器和按键选择调整位
CLOSE_DIS BIT 0FH ;关闭显示选择位
ALARM BIT 11H ;整点闹铃标志位
TURNOFF BIT 12H ;关机标志位
; 23H,24H,25H, 遥控解码程序使用
; 27H,2CH 整点鸣叫程序使用
; 2DH,2EH 开机延时程序适用
IRCOM DATA 28H ;遥控编码地址位28H,29H,2AH,2BH
SEC_FLA DATA 26H ;秒钟闪烁计数器
ALARM_NO DATA 2FH ;整点鸣叫次数
;-----------------------------
TIME_YEAR DATA 30H ;定义年、月、日、小时、分钟、秒
TIME_MONTH DATA 31H
TIME_DAY DATA 32H
WEEK DATA 33H
HOUR DATA 34H
MINUTE DATA 35H
SECOND DATA 36H
;-----------------------------
DS1302_ADDR DATA 37H ;定义DS1302地址单元和数据单元
DS1302_DATA DATA 38H
;-----------------------------
ZHOUCI DATA 39H ;定义周次和余数
YUSHU DATA 3AH
;-----------------------------
TEMPL DATA 3BH ;定义温度的低位
TEMPH DATA 3CH ;定义温度的高位
TEMP_BUF DATA 3DH ;定义温度的中间地址单元
;-----------------------------
;-----------------------------
week_byte1 DATA 46H ;定义计算某年某月某日对应星期几的中间单元
WEEK_BYTE2 DATA 4CH
WEEK_BYTE3 DATA 4DH
WEEK_BYTE4 DATA 4EH
WEEK_BYTE5 DATA 4FH
;-----------------------------
CONvert_year DATA 6Eh ;定义农历年、月、日
CONvert_month DATA 6Fh ;BIT7 为 1 表示闰月
CONvert_date DATA 7Eh
temp_Byte1 DATA 5Bh ;定义农历中间单元
temp_Byte2 DATA 5Ch
temp_Byte3 DATA 5Dh
temp_Byte4 DATA 5Eh
temp_Byte5 DATA 5Fh
;---------------------------------------------
; 定义数据显示单元和缓冲单元
;---------------------------------------------
SECOND_DIS_L DATA 60H ;定义秒钟显示和缓冲地址单元
SECOND_BUF_L DATA 40H
SECOND_DIS_H DATA 61H
SECOND_BUF_H DATA 41H
;-----------------------------
MINUTE_DIS_L DATA 62H ;定义分钟显示和缓冲地址单元
MINUTE_BUF_L DATA 42H
MINUTE_DIS_H DATA 63H
MINUTE_BUF_H DATA 43H
;-----------------------------
HOUR_DIS_L DATA 64H ;定义小时显示和缓冲地址单元
HOUR_BUF_L DATA 44H
HOUR_DIS_H DATA 65H
HOUR_BUF_H DATA 45H
;-----------------------------
TEMP_TEN DATA 66H ;定义温度十位、个位、小数位、符号位显示单元
TEMP_SIGN DATA 6CH
TEMP_DEC DATA 6DH
TEMP_UNIT DATA 7DH
;-----------------------------
SUMDAYL DATA 67H ;定义总天数显示和缓冲地址单元
SUMDAYL_BUF DATA 47H
SUMDAYM DATA 68H
SUMDAYM_BUF DATA 48H
SUMDAYH DATA 69H
SUMDAYH_BUF DATA 49H
;-----------------------------
WEEKNOL DATA 6AH ;定义周次显示和缓冲地址单元
WEEKNOL_BUF DATA 4AH
WEEKNOH DATA 6BH
WEEKNOH_BUF DATA 4BH
;-----------------------------
DATE_DIS_L DATA 70H ;定义日期显示和缓冲地址单元
DATA_BUF_L DATA 50H
DATE_DIS_H DATA 71H
DATA_BUF_H DATA 51H
;-----------------------------
NDATE_DIS_L DATA 72H ;定义农历日期显示和缓冲地址单元
NDATA_BUF_L DATA 52H
NDATE_DIS_H DATA 73H
NDATA_BUF_H DATA 53H
;-----------------------------
NMONTH_DIS_L DATA 74H ;定义农历月显示和缓冲地址单元
NMONTH_BUF_L DATA 54H
NMONTH_DIS_H DATA 75H
NMONTH_BUF_H DATA 55H
;-----------------------------
WEEK_DIS DATA 76H ;定义星期显示和缓冲地址单元
WEEK_BUF DATA 56H
;-----------------------------
MONTH_DIS_L DATA 77H ;定义月显示和缓冲地址单元
MONTH_BUF_L DATA 57H
MONTH_DIS_H DATA 78H
MONTH_BUF_H DATA 58H
;-----------------------------
YEAR_DIS_L DATA 79H ;定义年显示和缓冲地址单元
YEAR_BUF_L DATA 59H
YEAR_DIS_H DATA 7AH
YEAR_BUF_H DATA 5AH
;-----------------------------
YEAR_0_DIS DATA 7BH ;定义2 0显示单元
YEAR_2_DIS DATA 7CH
;-----------------------------
;*****************************************
; 初始化程序
;*****************************************
ORG 00H
LJMP START
ORG 03H
JMP INT ;外部中断0入口地址
ORG 0BH
JMP T0_INT ;定时器0入口地址
ORG 1BH
JMP T1_INT ;定时器1入口地址
ORG 0030H
;---------------------------------------------
; 主程序
;---------------------------------------------
START:
MOV R1,#126 ;清RAM 128单元
MOV R0,#2
MOV A,#0
CLEAR:
MOV @R0,A
INC R0
DJNZ R1,CLEAR
MOV R0,A
MOV R1,A
MOV R7,#10 ;计数器0 初始计数值
LCALL ON_DISPLAY
MOV 6CH,#0CH ;摄氏温度的符号'C
SETB EA ;打开总中断
MOV SCON,#00H ;串行输出,方式0
MOV TMOD,#11H ;计数器1,方式1;计数器0,方式1
MOV TL1,#00H ;计数器1 初值 65.5MS中断一次,用于按钮闪烁调节
MOV TH1,#00H
MOV TH0,#3CH ;计数器0 50MS中断一次
MOV TL0,#0B0H
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A6H ;1302充电,充电电流1.1mA
lcall write
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;禁止写1302
LCALL WRITE
MOV SEC_FLA,#10 ;秒灯闪烁赋初始值
CLR ET1 ;关闭定时器1中断
SETB EX0 ;打开外部中断0
SETB IT0 ;采用脉冲下降沿触发
SETB PX0 ;外部中断零为最高级别中断
CLR LED1
MAIN:
MOV DS1302_ADDR,#8DH ;READ OUT YEAR
LCALL READ
MOV TIME_YEAR,DS1302_DATA
MOV DS1302_ADDR,#89H ;READ OUT MONTH
LCALL READ
MOV TIME_MONTH,DS1302_DATA
MOV DS1302_ADDR,#87H ;READ OUT DAY
LCALL READ
MOV TIME_DAY,DS1302_DATA
MOV DS1302_ADDR,#85H ;READ OUT HOUR
LCALL READ
MOV HOUR,DS1302_DATA
MOV DS1302_ADDR,#83H ;READ OUT MINUTE
LCALL READ
MOV MINUTE,DS1302_DATA
MOV DS1302_ADDR,#81H ;READ OUT SECOND
LCALL READ
MOV SECOND,DS1302_DATA
OPEN_AM_PM:
MOV A,HOUR
CJNE A,#12H,AM_PM
AM_PM:
JNC OPEN_PMLED
CLR AMLED
SETB PMLED
AJMP CEL_DIVIDE
OPEN_PMLED:
CLR PMLED
SETB AMLED
CEL_DIVIDE:
MOV R0,TIME_YEAR ;年分离,送显示缓存
LCALL DIVIDE
MOV 79H,R1
MOV 59H,R1
MOV 7AH,R2
MOV 5AH,R2
MOV R0,TIME_MONTH ;月分离,送显示缓存
LCALL DIVIDE
MOV 77H,R1
MOV 57H,R1
MOV 78H,R2
MOV 58H,R2
MOV A,78H ;主程序中消除阳历月高位0
CJNE A,#0,MAIN_XIAO_DAY
MOV 78H,#0AH
MOV 58H,#0AH
MAIN_XIAO_DAY:
MOV R0,TIME_DAY ;日分离,送显示缓存
LCALL DIVIDE
MOV 70H,R1
MOV 50H,R1
MOV 71H,R2
MOV 51H,R2
MOV A,71H ;主程序中消除阳历日高位0
CJNE A,#0,MAIN_XIAO_HOUR
MOV 71H,#0AH
MOV 51H,#0AH
MAIN_XIAO_HOUR:
MOV R0,HOUR ;小时分离,送显示缓存
LCALL DIVIDE
MOV 64H,R1
MOV 44H,R1
MOV 65H,R2
MOV 45H,R2
MOV A,65H ;主程序中消除小时高位0
CJNE A,#0,MAIN_MINUTE
MOV 65H,#0AH
MOV 45H,#0AH
MAIN_MINUTE:
MOV R0,MINUTE ;分分离,送显示缓存
LCALL DIVIDE
MOV 62H,R1
MOV 42H,R1
MOV 63H,R2
MOV 43H,R2
MOV A,63H
CJNE A,#0,MAIN_SECOND
MOV 63H,#0AH
MOV 43H,#0AH
MAIN_SECOND:
MOV R0,SECOND ;秒分离,送显示缓存
LCALL DIVIDE
MOV 60H,R1
MOV 40H,R1
MOV 61H,R2
MOV 41H,R2
MOV A,61H
CJNE A,#0,MAIN_GENGXIN ;主程序中消除秒钟高位0
MOV 61H,#0AH
MOV 41H,#0AH
MAIN_GENGXIN:
LCALL GENGXIN ;更新农历程序
MOV R0,CONVERT_MONTH ;农历月分离,送显示缓存
LCALL DIVIDE
MOV 74H,R1
MOV 54H,R1
MOV 75H,R2
MOV 55H,R2
MOV A,75H ;主程序中消除农历月高位0
CJNE A,#0,MAIN_XIAO_NDAY
MOV 75H,#0AH
MOV 55H,#0AH
MAIN_XIAO_NDAY:
MOV R0,CONVERT_DATE
LCALL DIVIDE
MOV 72H,R1
MOV 52H,R1
MOV 73H,R2
MOV 53H,R2
MOV A,73H ;主程序中消除农历日高位0
CJNE A,#0,MAIN_WEEK
MOV 73H,#0AH
MOV 53H,#0AH
MAIN_WEEK:
LCALL GETWEEK ;更新星期程序
MOV 76H,WEEK
MOV 56H,WEEK
LCALL ADJ_TOTAL ;调用总天数,星期程序
LCALL GET_TEMPER ;调用温度程序
LCALL DX_MONTH ;调用判断大小月程序
LCALL DISPLAY
ADJ_NEXT:
JNB MODE,SETG ;调整日历
MOV R3,TIME_YEAR
LCALL ZH ;判断当前年是否为闰年
MOV A,B
JNZ OFF_RNLED
CLR RNLED
AJMP ADJ_RYLED
OFF_RNLED:
SETB RNLED
ADJ_RYLED:
JNB F0,OFF_RYLED
CLR RYLED ;闰月,则p1.0清0,指示灯亮
LJMP MAIN
OFF_RYLED:
SETB RYLED ;非闰月,则p1.0置位,指示灯灭
LJMP MAIN
;*******************************
;* 公历设置程序 *
;*******************************
SETG:
SETB TR1
SETB ET1
SETB CHOICE_ADJ
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#80H ;1302停止振荡
LCALL WRITE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -