📄 红外发送eeprom.asm
字号:
;***************************;
; 数控调频手动控制器 ;
;***************************;
;显示驱动模块HT1621
;发射控制芯片BH1415F
ISP_DATA EQU 0E2H
ISP_ADDRH EQU 0E3H
ISP_ADDRL EQU 0E4H
ISP_CMD EQU 0E5H
ISP_TRIG EQU 0E6H
ISP_CONTR EQU 0E7H
;ENABLE_ISP EQU 83H ;<5MHZ
;ENABLE_ISP EQU 82H ;<10MHZ
ENABLE_ISP EQU 81H ;<20MHZ (我用12MHZ)
;ENABLE_ISP EQU 80H ;>20MHZ
DATA_FLASH_START_ADDRES EQU 2000H ;STC89C/LE52RC
DATA_FLASH_START_ADDRE EQU 2200H ;STC89C/LE52RC
DATA_FLASH_START_ADDR EQU 2400H ;STC89C/LE52RC
DATA_FLASH_START_ADD EQU 2600H ;STC89C/LE52RC
HONG EQU P2.7 ;红外线发送端口
WEISHU EQU 30H ;位数指示
XIANSHI EQU 31H ;位指示
CONBITL EQU 21H ;频率控制字节低8位
CONBITH EQU 22H ;频率控制字节高8位
LCDL EQU 24H ;LCD控制字节低8位
LCDH EQU 25H ;LCD控制字节高8位
KEYWORD EQU 23H ;存放键扫描时P1口值
DATA EQU P3.7 ;LCD数据
CLOCK EQU P3.6 ;LCD时钟
CSCE EQU P3.5 ;LCD片选
Muting EQU P2.0 ;发射静音(厂里P2.0)(家里)
DATAF EQU P2.1 ;发射数据(厂里P2.1)(家里)
CLOCKF EQU P2.2 ;发射时钟(厂里P2.2)(家里)
CSCEF EQU P2.3 ;发射片选(厂里P2.3)(家里)
DATAFF EQU P2.7 ;发射数据(厂里)(家里P2.7)
CLOCKFF EQU P2.6 ;发射时钟(厂里)(家里P2.6)
CSCEFF EQU P2.5 ;发射片选(厂里)(家里P2.5)
;
;
ORG 0000H ;程序开始地址
LJMP START ;转START执行
ORG 0003H ;
RETI ;不用中断程序
ORG 000BH ;
RETI ; 不用中断程序
ORG 0013H ;
RETI ; 不用中断程序
ORG 001BH ;
LJMP INTT1 ; 不用中断程序
ORG 0023H ;
RETI ; 不用中断程序
ORG 002BH ;
RETI ; 不用中断程序
;
;初始化程序
CLEARMEN: MOV R0,#20H ;20H-34H循环清0
MOV R1,#12H ;
CLEARLOOP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARLOOP ;
MOV P1,#0FFH ;
MOV P0,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
CLR Muting ;发射开音BH1415禁止操作
CLR DATAF ;发射数据
CLR CLOCKF ;发射时钟
CLR CSCEF ;发射片选
CLEAR1: MOV PCON,#00H ;控制寄存器清0
LCALL EEPROM_read ;
LCALL DISPUPDAT ;写入BH1415芯片(修改发送频率)
MOV WEISHU,#05H
LCALL XIANSHIA
RET
;*************************************
;* *
;* 初 始 化 程 序 *
;* *
;*************************************
CLEARMEMIO: CLR HONG ;关遥控输出
CLEARMEM2: MOV IE,#00H ;关所有中断
MOV IP,#01H ;设优先级
MOV TMOD,#22H ;8位自动重装初值模式
MOV TH1,#0F3H ;定时为13微秒初值
MOV TL1,#0F3H
SETB EA ;开总中断允许
RET ;返回
;
CLS2: MOV A,#10000000B ;SYS EN
MOV R3,#8
CLR P3.5 ;LCD片选
LCALL PUTT
MOV A,#00111111B
MOV R3,#5
LCALL PUTT
SETB P3.5 ;LCD片选
SETB P3.6 ;LCD时钟
SETB P3.7 ;LCD数据
MOV A,#10000000B ;LCD ON
MOV R3,#8
CLR P3.5 ;LCD片选
LCALL PUTT
MOV A,#01111111B
MOV R3,#5
LCALL PUTT
SETB P3.5 ;LCD片选
SETB P3.6 ;LCD时钟
SETB P3.7 ;LCD数据
MOV A,#10000101B ;BIAS 1/3
MOV R3,#8
CLR P3.5 ;LCD片选
LCALL PUTT
MOV A,#01111111B
MOV R3,#5
LCALL PUTT
SETB P3.5 ;LCD片选
SETB P3.6 ;LCD时钟
SETB P3.7 ;LCD数据
RET
;主程序
START: LCALL CLEARMEN ;上电初始化
LCALL CLEARMEMIO
LCALL CLS2
MAIN: LCALL KEYFUN00 ;调查键子程序
LCALL DINGSHI
LCALL ASDFFF
AJMP MAIN ;转MAIN循环
NOP ;PC出错处理
NOP ;
AJMP START ;重新初始化
;读
EEPROM_read:
MOV DPTR,#DATA_FLASH_START_ADDRES
LCALL Byte_read
MOV 26H,A
MOV DPTR,#DATA_FLASH_START_ADDRE
LCALL Byte_read
MOV 27H,A
MOV DPTR,#DATA_FLASH_START_ADDR
LCALL Byte_read
MOV 28H,A
MOV DPTR,#DATA_FLASH_START_ADD
LCALL Byte_read
MOV 29H,A
RET
;写
EEPROM_XIE:
MOV DPTR,#DATA_FLASH_START_ADDRES
ACALL sector_erase
MOV DPTR,#DATA_FLASH_START_ADDRES
MOV A,26H
ACALL bute_program
MOV DPTR,#DATA_FLASH_START_ADDRE
ACALL sector_erase
MOV DPTR,#DATA_FLASH_START_ADDRE
MOV A,27H
ACALL bute_program
MOV DPTR,#DATA_FLASH_START_ADDR
ACALL sector_erase
MOV DPTR,#DATA_FLASH_START_ADDR
MOV A,28H
ACALL bute_program
MOV DPTR,#DATA_FLASH_START_ADD
ACALL sector_erase
MOV DPTR,#DATA_FLASH_START_ADD
MOV A,29H
ACALL bute_program
RET
;
ASDFFF:JB P1.5,HGFDSA
AWDEFR:JNB P1.5,AWDEFR ;
JJJJ: LCALL OUT_HongWaiXian
JNB P1.4,HGFDSA
AJMP JJJJ
HGFDSA:RET
;
INTT1: CPL HONG ;40kHZ红外线遥控信号产生
RETI
;
HECHENG: MOV R0,#7
LOOP: MOV A,LCDH
RLC A
MOV LCDH,A
MOV A,LCDL
RLC A
RL A
MOV B,A
INC LCDL
LCALL LCDPLAY
DJNZ R0,LOOP
RET
;
KEYFUN00: JB P1.1,DSFSFAS
KEYFUN0011: JNB P1.1,KEYFUN0011
JNB P1.1,KEYFUN0011
INC WEISHU ;个位数加1
MOV A,WEISHU ;
CLR C ;
CJNE A,#06H,JHLLURYEE ;判断是否小于10
JHLLURYEE: JC DSFSFAS1 ;小于10转FUN02OUT
MOV WEISHU,#01H ;大于或等于10清为0
DSFSFAS1: LCALL EEPROM_XIE
LCALL XIANSHIA
DSFSFAS: RET ;
;
;
DINGSHI: JB P1.2,RGERRTHRTH
DINGSHI1: JNB P1.2,DINGSHI1
JNB P1.2,DINGSHI1
MOV A,WEISHU
CJNE A,#01H,NAGEAIQU1
KEYFUN01: CLR A
INC 28H ;百位数加1
MOV A,28H ;入A
CLR C ;清进位标志
CJNE A,#04H,FUN001 ; ;百位小于2转FUNOO0UT
MOV 28H,#08H
AJMP FUN0013 ;大于等于2清为0(百位只能是0或1)
FUN001: CJNE A,#09H,FUN0012
MOV 28H,#09H
AJMP FUN0013
FUN0012: CJNE A,#0AH,FUN0013
MOV 28H,#00H
FUN0013: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
AJMP NAGEAIQU
NAGEAIQU1: CJNE A,#02H,NAGEAIQU2
CLR A
INC 27H ;个位数加1
MOV A,27H ;
CLR C ;
CJNE A,#0AH,FUN02 ;判断是否小于10
FUN02: JC FUN02OUT ;小于10转FUN02OUT
MOV 27H,#00H ;大于或等于10清为0
FUN02OUT: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
AJMP NAGEAIQU
NAGEAIQU2: CJNE A,#03H,NAGEAIQU3
CLR A
INC 26H ;个位数加1
MOV A,26H ;
CLR C ;
CJNE A,#0AH,FUN03 ;判断是不小于10
FUN03: JC FUN03OUT ;小于10转FUN03OUT
MOV 26H,#00H ;大于或等于10清为0
FUN03OUT: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
AJMP NAGEAIQU
NAGEAIQU3: CJNE A,#04H,NAGEAIQU
CLR A
INC 29H ;个位数加1
MOV A,29H ;
CLR C ;
CJNE A,#02H,FUN04 ;判断是不小于10
FUN04: JC FUN04OUT ;小于10转FUN03OUT
MOV 29H,#00H ;大于或等于10清为0
FUN04OUT: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
NAGEAIQU: LCALL EEPROM_XIE
RGERRTHRTH: LCALL XIANSHIA
RET
; 将BCD码转为十六进制数,与5位控制码合成操作码,写入控制芯片
DISPUPDAT: LCALL BCDB ; 调BCD码转为十六进制数程序
LCALL CONCOMMAND ; 调与5位控制码合成操作码程序
LCALL PUTBIT ; 发控制字至BH1415
RET ;返回
;
; 将BCD码转为十六进制数程序
BCDB: MOV A,#00H
MOV CONBITL,#00H ; 控制字清0
MOV CONBITH,#00H ; 控制字清0
MOV CONBITL,26H ;小数位数放入控制字低8位
MOV A,27H ;个位数乘10操作
MOV B,#10 ;
LCALL MULLOOP ;调乘法子程序
MOV A,28H ;十位数乘100操作
MOV B,#100 ;
LCALL MULLOOP ; 调乘法子程序
MOV A,29H ;
JNZ ADD3E8 ;百位数为1转ADD3E8(加1000操作)
RET ; 百位数为0退出
ADD3E8: CLR C ;清进位档标志
MOV A,#0E8H ;低8位加法
ADD A,CONBITL ;累加
MOV CONBITL,A ;放回CONBITL
MOV A,#03H ; 高8位加法
ADDC A,CONBITH ;控制字高8位处理
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;乘法及累加处理程序(将四位显示的十进制BCD码转为1个二进制数)
MULLOOP: MUL AB ;乘法
CLR C ;清进位标志
ADD A,CONBITL ;积低8位与CONBITL相加
MOV CONBITL,A ;放回CONBITL
MOV A,CONBITH ;
ADDC A,B ;积高8位与CONBITH带进位累加
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;频率控制数据与5位控制码合成BH1415控制字
CONCOMMAND: ANL CONBITH,#07H ;高四位为0
MOV A,#40H ;控制字放入A
ORL A,CONBITH ;合成控制字
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 发送控制字节子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
PUTBIT: MOV A,CONBITL ;低8位控制字入A
SETB CSCEF ;片选 ;BH1415使能(允许写)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -