MEM_SO BIT P3.0
MEM_SCK BIT P3.1
MEM_SI BIT P3.2
MEM_CS BIT P1.7
BEEP_PORT BIT P3.4 ;蜂鸣器控制端口
WORK_PORT EQU P2 ;系统升级时的工作端口
SHAKE_HIGH EQU 0F7H ;11110111B
SHAKE_LOW EQU 0FBH ;11111011B
RECEIVE1 EQU 03H ;器件在线升级时的数据接收端口1(P2.3)
RECEIVE2 EQU 02H ;器件在线升级时的数据接收端口1(P2.2)
SEND_PORT1 BIT P2.3 ;器件在线升级时的数据发送端口1
SEND_PORT2 BIT P2.2 ;器件在线升级时的数据发送端口2
READ_CODE BIT P2.1
WRITE_CODE BIT P2.0
;CHPCON EQU 0BFH ;W78E58B专用寄存器
;CHPENR EQU 0F6H ;W78E58B专用寄存器
;SFRAL EQU 0C4H ;W78E58B专用寄存器
;SFRAH EQU 0C5H ;W78E58B专用寄存器
;SFRFD EQU 0C6H ;W78E58B专用寄存器
;SFRCN EQU 0C7H ;W78E58B专用寄存器
;T2MOD EQU 0C9H ;W78E58B定时器2工作模式寄存器
IDLE_L8 EQU 0F0H
IDLE_H8 EQU 0FFH
KEY_ACK BIT 20H.0 ;按键已响应标志
UPDATE_EN BIT 20H.1 ;软件升级时握手成功标志,为1时有效
LEFT_RIGHT BIT 20H.2 ;屏幕左边数据已显示完标志,为1有效
IN_BLANK BIT 20H.3 ;处于闪烁显示时,定时更换显示标志
SHAKE_ENABLE BIT 20H.4 ;允许发送软件升级的握手信号标志
CHANGE_PORT BIT 20H.5 ;定时更换端口数据状态标志
BEEP_FLAG BIT 20H.6 ;蜂鸣器工作允许标志
START_EN BIT 20H.7 ;允许启动升级标志
BEEP_ON_TIME EQU 05H ;蜂鸣器发声时间
SHAKE_HAND1 EQU 0C6H ;系统握手数据1
SHAKE_HAND2 EQU 03AH ;系统握手数据2
SHAKE_HAND3 EQU 09EH ;系统握手数据3
SHAKE_HAND4 EQU 0B5H ;系统握手数据4
ISP_SHAKE0 EQU 90H ;在线编程握手标志数据0
ISP_SHAKE1 EQU 06H ;在线编程握手标志数据1
ISP_SHAKE2 EQU 4CH ;在线编程握手标志数据2
ISP_SHAKE3 EQU 12H ;在线编程握手标志数据3
ISP_SHAKE4 EQU 01H ;在线编程握手标志数据4
ISP_SHAKE5 EQU 0F0H ;在线编程握手标志数据5
ISP_SHAKE6 EQU 75H ;在线编程握手标志数据6
ISP_SHAKE7 EQU 0A8H ;在线编程握手标志数据7
ISP_SHAKE8 EQU 82H ;在线编程握手标志数据8
ISP_SHAKE9 EQU 0C2H ;在线编程握手标志数据9
ISP_SHAKEA EQU 97H ;在线编程握手标志数据A
ISP_SHAKEB EQU 55H ;在线编程握手标志数据B
ISP_SHAKEC EQU 0C2H ;在线编程握手标志数据C
ISP_SHAKED EQU 0AAH ;在线编程握手标志数据D
ISP_SHAKEE EQU 74H ;在线编程握手标志数据E
ISP_SHAKEF EQU 14H ;在线编程握手标志数据F
ISP_SHAKEG EQU 19H ;在线编程握手标志数据G
ISP_SHAKEH EQU 96H ;在线编程握手标志数据H
ISP_SHAKEI EQU 31H ;在线编程握手标志数据I
ISP_SHAKEJ EQU 0DEH ;在线编程握手标志数据J
T1_H8 EQU 0B1H ;20ms
T1_L8 EQU 0E0H
;以下是存储单元分配使用情况
T0_H8 EQU 10H
T0_L8 EQU 11H
SYSTEM_STATUS EQU 16H ;系统工作状态存放单元
KEY_DATA EQU 44H ;按键键值临时存放单元
KEY_AGE_COUNT EQU 45H ;按键年龄计数单元
BEEP_WAVE EQU 47H ;蜂鸣器发声时间
STACK_POINT EQU 69H ;系统堆栈指针,实质上堆栈区由6AH单元开始
ORG 0000H
LJMP MAIN_LOADER
ORG 000BH
CLR TR0 ;定时器T0停止运行
MOV A,T0_L8 ;重新设置定时器初值
MOV TL0,A
MOV A,T0_H8
MOV TH0,A
RETI
ORG 001BH ;10ms
MOV TH1,#T1_H8
MOV TL1,#T1_L8
CLR MEM_CS ;首先清除X5045的看门狗定时器
NOP
SETB MEM_CS
JB SHAKE_ENABLE,PRM
AJMP KEYBOARD
PRM: MOV A,#SHAKE_HIGH
JB CHANGE_PORT,PRN
MOV A,#SHAKE_LOW
PRN: MOV P2,A
CPL CHANGE_PORT
JB READ_CODE,PRQ
MOV P2,#0FFH
SETB START_EN
CLR SHAKE_ENABLE
PRQ: JB BEEP_FLAG,BEEP_WORK;蜂鸣器服务检查程序
NOP ;冗余指令,抗干扰用
NOP
TASK_END: RETI
BEEP_WORK: DJNZ BEEP_WAVE,END_BEEP
SETB BEEP_PORT ;结束发声
CLR BEEP_FLAG
END_BEEP: RETI
MAIN_LOADER: CLR EA
MOV SP,#STACK_POINT ;设置系统堆栈指针
MOV A,#0FFH
MOV P0,A
MOV P1,A
MOV P2,A
MOV P3,A
CLR A
MOV IP,A
MOV IE,A
MOV PSW,A ;设定0区工作寄存器
MOV TCON,A
MOV T2CON,A
LCALL ALARM_OK
MOV CHPENR,#87H ;设置允许改变CHPCON数据命令
MOV CHPENR,#59H
MOV CHPCON,#13H ;进入在线编程状态,同时使能片内AUX_RAM
CLR A
MOV CHPENR,A ;禁止改变CHPCON寄存器内容
MOV TCON,A
MOV IP,A
MOV IE,#82H ;允许定时器0中断,准备从IDLE模式唤醒
MOV A,#IDLE_L8
MOV T0_L8,A
MOV TL0,A
MOV A,#IDLE_H8
MOV T0_H8,A
MOV TH0,A
MOV TMOD,#01H ;设置T0为16位定时器模式
MOV TCON,#10H ;启动定时器0工作
MOV PCON,#01H ;进入IDLE工作模式,准备进入在线编程状态
READY_UPDATE: CLR MEM_CS ;清除X5045的看门狗定时器
NOP
SETB MEM_CS
CLR A
MOV 20H,A ;系统工作标志单元
MOV 21H,A ;系统工作标志单元
MOV KEY_AGE_COUNT,A ;按键年龄
MOV KEY_DATA,A ;保存键值
MOV SYSTEM_STATUS,A
MOV TCON,A
MOV TMOD,#11H ;设置T0,T1为16位定时器模式
MOV TH1,#T1_H8
MOV TL1,#T1_L8
CLR TF1
SETB TR1 ;启动定时器T1
SETB ET1 ;允许定时器T1中断
SETB EA ;允许全局中断
JNB UPDATE_EN,$ ;等待软件升级的握手信号
CLR UPDATE_EN
LCALL RECEIVE_SHAKE ;等待接收芯片擦除并查空完毕信息
LCALL READ_APROM_SET ;器件编程
LCALL READ_PAGE
LCALL READ_APROM_SET ;编程效验
LCALL READ_PAGE
MOV A,#0FFH
MOV P2,A
LCALL ALARM_OK
SJMP READY_UPDATE
KEYBOARD: MOV A,P1 ;读取键盘口的状态
ORL A,#11111001B ;屏蔽不需要的数据位,系统暂未用到
CPL A ;将ACC取反
JZ NO_KEY ;没有键压下,转NO_KEY
INC KEY_AGE_COUNT ;按键年龄加一
XCH A,KEY_DATA ;保存键值
XRL A,KEY_DATA ;与上次按键相同否?
JZ SAME_KEY ;相同,转SAME_KEY
NO_KEY: CLR A
MOV KEY_AGE_COUNT,A ;不同,按键年龄清零
CLR KEY_ACK ;清除'按键已响应'标志
RETI
SAME_KEY: MOV A,#0FEH ;单击键年龄初始化为40ms
ADD A,KEY_AGE_COUNT
JC ACCEPT ;按键年龄已到,转ACCEPT处理
MPY: RETI ;年龄未到,不作处理
ACCEPT: JB KEY_ACK,KEY_OFF
UP
评论0