📄 闹铃3.txt
字号:
TF2 EQU 0CFH;T2中断标志控制位
TR2 EQU 0CAH;T2启动/停止控制位
ET2 EQU 0ADH;T2允许中断控制位
PT2 EQU 0BDH;T2优先级控制位
RCAP2L EQU 0CAH;T2自动重载低位
RCAP2H EQU 0CBH;T2自动重载高位
TL2 EQU 0CCH;T2计数器低位
TH2 EQU 0CDH;T2计数器高位
I2cStart EQU 55H;I2C开始标志
I2cStop EQU 0AAH;I2C结束标志
SDA EQU 0B2H;I2C数据线
SCL EQU 0B3H;I2C时钟线
SHOW_CODE EQU 80H;显示段码
SHOW_BIT EQU 0A0H;显示位码
KeyFlag EQU 00H;按键标志位
S_Flash EQU 01H;秒闪标志位
LED_FLAG EQU 02H;LDE显示模式标志位
BeforKey EQU 22H;上次采样键值
NowKey EQU 23H;现在次采样键值
LS_1 EQU 24H;临时变量1
LS_2 EQU 25H;临时变量2
LS_3 EQU 26H;临时变量3
time0 EQU 27H;时钟秒
time1 EQU 28H;时钟分
time2 EQU 29H;时钟时
SHOW_MOUDE EQU 2AH;显示模式
SHOW_PC EQU 2BH;显示数据指针
RingCount EQU 2CH;报警数据个数
ShowRingData EQU 2DH;显示报警数据地址
RINGDATAH EQU 2EH;报警数据高位起始地址
RINGDATAL EQU 57H;报警数据低位起始地址
ORG 0000H
MOV SP,#10H
SJMP START
ORG 0001BH
AJMP INT_T1
ORG 0002BH
CPL P3.5
CLR TF2
RETI
ORG 00035H
START: MOV TH2,#3CH ;设置T2定时50ms
MOV TL2,#0B0H
MOV RCAP2H,#3CH
MOV RCAP2L,#0B0H
SETB PT2
SETB ET2
MOV TMOD,#60H ;设置T1定时500ms(T2中断10次,T1中断5次)
MOV TH1,#0FBH
MOV TL1,#0FBH
SETB ET1
ACALL READ_DATA
SETB EA
SETB TR2
SETB TR1
MOV time0,#0
MOV time1,#0
MOV time2,#12
SETB LED_FLAG
CLR P3.4
AGAIN:
MOV SHOW_MOUDE,#0 ;显示模式0
MOV SHOW_PC,#time0;显示时钟(传时钟地址指针)
ACALL DISPLAY ;调用动态扫描子程序
ACALL COMP_DATA ;调用报警扫描子程序
MOV BeforKey,NowKey
ACALL GETKEY ;调用键盘扫描子程序
MOV NowKey,A
CJNE A,BeforKey,AGAIN
CJNE A,#0,NEXT_KEY0
SETB KeyFlag
SJMP AGAIN
NEXT_KEY0:
JNB KeyFlag,AGAIN
CLR KeyFlag
CJNE A,#1,NEXT_KEY2
ACALL SetTimer ;调用设置时钟子程序
SJMP AGAIN
NEXT_KEY2:
CJNE A,#2,AGAIN
ACALL SetRing ;调用设置报警子程序
SJMP AGAIN;--------------------//主程序结束//
COMP_DATA: ;报警扫描子程序
MOV A,RingCount ;-------------------循环执行打铃程序
JZ COMP_EXIT
MOV A,time0
JNZ COMP_EXIT
MOV R2,RingCount
MOV R0,#RINGDATAL
MOV R1,#RINGDATAH
COMP_LOOP:
MOV A,@R1
CJNE A,time2,NEXT_COMP
MOV A,@R0
CJNE A,time1,NEXT_COMP
SETB P3.4
SJMP COMP_EXIT
NEXT_COMP:
INC R0
INC R1
DJNZ R2,COMP_LOOP
COMP_EXIT:
RET
;//-----------------I2C接口程序----------------//
I2C_START: ;I2C开始
SETB SDA
SETB SCL
NOP
CLR SDA
NOP
CLR SCL
RET
I2C_STOP: ;I2C结束
CLR SDA
NOP
SETB SCL
NOP
SETB SDA
RET
I2C_SEND: ;I2C发送一个字节
MOV R7,#08
CLR C
SEND_BIT:
RLC A
MOV SDA,C
NOP
SETB SCL
NOP
CLR SCL
DJNZ R7,SEND_BIT
SETB SDA
NOP
SETB SCL
NOP
CLR SCL
RET
I2C_RECEIVE: ;I2C接收一个字节
MOV R7,#08
RECEIVE_BIT:
SETB SCL
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ R7,RECEIVE_BIT
SETB SDA
NOP
SETB SCL
NOP
CLR SCL
RET
READ_24C02: ;读24C02
ACALL I2C_START
MOV A,#0A0H
ACALL I2C_SEND
MOV A,R0
ACALL I2C_SEND
ACALL I2C_START
MOV A,#0A1H
ACALL I2C_SEND
ACALL I2C_RECEIVE
ACALL I2C_STOP
RET
WRITE_24C02: ;写24C02
ACALL I2C_START
MOV A,#0A0H
ACALL I2C_SEND
MOV A,R0
ACALL I2C_SEND
MOV A,R1
ACALL I2C_SEND
ACALL I2C_STOP
RET
READ_DATA:;--------------------从24C02中读取数据更新内存
MOV R2,#10
READ_START_AGAIN: ;读开始标志位
MOV R0,#0
CLR EA
ACALL READ_24C02
SETB EA
CJNE A,#I2cSTART,READ_SUB
SJMP WRITE_STOP
READ_SUB:
DJNZ R2,READ_START_AGAIN ;读开始位错误刷新24C02
WRITE_STOP:
XRL A,#I2cSTART
JZ READ_NEXT1
MOV R0,#0
MOV R1,#I2cStart
CLR EA
ACALL WRITE_24C02 ;写开始字节
SETB EA
MOV R7,#5
ACALL Delay1ms
MOV R0,#1
MOV R1,#I2cStop
CLR EA
ACALL WRITE_24C02 ;写结束字节
SETB EA
MOV R7,#5
ACALL Delay1ms
READ_NEXT1:
MOV R0,#1 ;读数据地址;R1为间地址寻址寄存器
MOV R3,#0 ;读数据总数;R2为数据缓存器
READ_DATA_AGAIN:
CLR EA
ACALL READ_24C02 ;读高位
SETB EA
INC R0
CJNE A,#I2cStop,READ_NEXT2 ;判断是否是结束标志
SJMP READ_EXIT
READ_NEXT2:
MOV R2,A
MOV A,#RINGDATAH
ADD A,R3
MOV R1,A
MOV A,R2
MOV @R1,A
CLR EA
ACALL READ_24C02 ;读低位
SETB EA
INC R0
MOV R2,A
MOV A,#RINGDATAL
ADD A,R3
MOV R1,A
MOV A,R2
MOV @R1,A
INC R3
CJNE R3,#40,READ_DATA_AGAIN
READ_EXIT:
MOV RingCount,R3 ;更新报警数据个数
RET
WRITE_DATA:;--------------------把内存中的数据写到24C02中去
MOV R0,#0
MOV R1,#I2cStart
CLR EA
ACALL WRITE_24C02 ;写开始标志
SETB EA
MOV R7,#5
ACALL Delay1ms
INC R0
MOV A,RingCount
JZ WRITE_RETURN
MOV R2,#0
WRITE_DATA_AGAIN:
MOV A,#RINGDATAH
ADD A,R2
MOV R1,A
MOV A,@R1
MOV R1,A
CLR EA
ACALL WRITE_24C02 ;写高位
SETB EA
INC R0
MOV R7,#5
ACALL Delay1ms
MOV A,#RINGDATAL
ADD A,R2
MOV R1,A
MOV A,@R1
MOV R1,A
CLR EA
ACALL WRITE_24C02 ;写低位
SETB EA
INC R0
MOV R7,#5
ACALL Delay1ms
INC R2
MOV A,R2
CJNE A,RingCount,WRITE_DATA_AGAIN
WRITE_RETURN:
MOV R1,#I2cStop
CLR EA
ACALL WRITE_24C02 ;写结束标志
SETB EA
RET
;//-----------------End I2c Code---------------//
;--------------显示子程序-----------------------
;显示模式:
; 0---------正常显示数据
; 1---------显示调试模式(0,1位闪烁)
; 2---------显示调试模式(2,3位闪烁)
; 3---------显示调试模式(4,5位闪烁)
; 4---------显示特殊字符模式
SHOW_NUMBER: ;段码
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DB 40H
SHOW_NULL: ;空码
DB 00H,38H,38H,3EH,37H,00H
SHOW_BIT_CODE: ;位码
DB 0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
;------------------
DISPLAY: ;显示子程序
MOV R1,#6
SHOW_AGAIN:
MOV A,SHOW_MOUDE
XRL A,#4
JZ SHOW_CHAR
MOV A,R1
ACALL GETCODE ;调用得到位数据子程序
MOV DPTR,#SHOW_NUMBER
MOVC A,@A+DPTR
SJMP SHOW_TO_CODE
SHOW_CHAR: ;显示模式为4则显示字符NULL
MOV DPTR,#SHOW_NULL
MOV A,R1
DEC A
MOVC A,@A+DPTR
SHOW_TO_CODE:
MOV SHOW_BIT,#0FFH;-------显示数据屏蔽
MOV SHOW_CODE,A
MOV A,R1
MOV DPTR,#SHOW_BIT_CODE-1
MOVC A,@A+DPTR
MOV SHOW_BIT,A
MOV R7,#1
ACALL Delay1ms
DJNZ R1,SHOW_AGAIN
MOV SHOW_BIT,#0FFH;--------显示数据屏蔽
RET
;---------------------------------------
Delay1ms: ;-----------延时1MS
MOV R5,#2
DELAY: MOV R6,#0
DJNZ R6,$
DJNZ R5,DELAY
DJNZ R7,Delay1ms
RET
;-----------------------------------------
GETCODE:;得到位数据子程序
MOV B,#10
DEC A
RL A
MOV DPTR,#FIND_BIT
JMP @A+DPTR
FIND_BIT:;位散转
SJMP SHOW_0
SJMP SHOW_1
SJMP SHOW_2
SJMP SHOW_3
SJMP SHOW_4
SJMP SHOW_5
SHOW_0: ;得到位0数据
MOV R0,SHOW_MOUDE
CJNE R0,#1,SHOW_LED_0
JB S_Flash,SHOW_LED_0
MOV A,#10
RET
SHOW_LED_0:
MOV R0,SHOW_PC
MOV A,@R0
DIV AB
MOV A,B
RET
SHOW_1: ;得到位1数据
MOV R0,SHOW_MOUDE
CJNE R0,#1,SHOW_LED_1
JB S_Flash,SHOW_LED_1
MOV A,#10
RET
SHOW_LED_1:
MOV R0,SHOW_PC
MOV A,@R0
DIV AB
RET
SHOW_2: ;得到位2数据
MOV R0,SHOW_MOUDE
CJNE R0,#2,SHOW_LED_2
JB S_Flash,SHOW_LED_2
MOV A,#10
RET
SHOW_LED_2:
MOV R0,SHOW_PC
INC R0
MOV A,@R0
DIV AB
MOV A,B
RET
SHOW_3: ;得到位3数据
MOV R0,SHOW_MOUDE
CJNE R0,#2,SHOW_LED_3
JB S_Flash,SHOW_LED_3
MOV A,#10
RET
SHOW_LED_3:
MOV R0,SHOW_PC
INC R0
MOV A,@R0
DIV AB
RET
SHOW_4: ;得到位4数据
MOV R0,SHOW_MOUDE
CJNE R0,#3,SHOW_LED_4
JB S_Flash,SHOW_LED_4
MOV A,#10
RET
SHOW_LED_4:
MOV R0,SHOW_PC
INC R0
INC R0
MOV A,@R0
DIV AB
MOV A,B
RET
SHOW_5: ;得到位5数据
MOV R0,SHOW_MOUDE
CJNE R0,#3,SHOW_LED_5
JB S_Flash,SHOW_LED_5
MOV A,#10
RET
SHOW_LED_5:
MOV R0,SHOW_PC
INC R0
INC R0
MOV A,@R0
DIV AB
RET
GETKEY:;扫描键盘得到键值子程序
MOV A,P1
CJNE A,#0FDH,GOTO_KEY2
MOV A,#1
RET
GOTO_KEY2:
CJNE A,#0FEH,GOTO_KEY3
MOV A,#2
RET
GOTO_KEY3:
CJNE A,#0FBH,GOTO_KEY4
MOV A,#3
RET
GOTO_KEY4:
CJNE A,#0F7H,GOTO_KEY5
MOV A,#4
RET
GOTO_KEY5:
CJNE A,#0EFH,GOTO_KEY6
MOV A,#5
RET
GOTO_KEY6:
CJNE A,#0DFH,GOTO_KEY7
MOV A,#6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -