;使用LED1SCH实验板制作摇控区码测试仪,键码测试
;SUB_24CXX(24CXX的总线地止):24C01-24C16使用
;型号***********起始地止*************容量
;24C01----------0A0H(00H-07FH)-------1K
;24C02----------0A0H(00H-0FFH)-------2K
;24C04----------0A0H(00H-1FFH)-------4K
;24C08----------0A0H(00H-3FFH)-------8K
;24C16----------0A0H(00H-7FFH)------16K
;写入000H-0FFH:SUB_24CXX=0A0H
;写入100H-1FFH:SUB_24CXX=0A2H
;写入200H-2FFH:SUB_24CXX=0A4H
;写入300H-3FFH:SUB_24CXX=0A6H
;写入400H-4FFH:SUB_24CXX=0A8H
;写入500H-5FFH:SUB_24CXX=0AAH
;写入600H-6FFH:SUB_24CXX=0ACH
;写入700H-7FFH:SUB_24CXX=0AEH
;*****************************************
;当使用24C32-24C256时使用分页写入,写入地止必须写入二次,第一次为页数,第二次为页地止
;24C32: R4=0-15共16页
;24C64: R4=0-31共32页
;24C128:R4=0-63共64页
;24C256:R4=0-127共128页
;------------------------------------------
SDA BIT P3.7
SCL BIT P3.6
;------------------------------------------
W_SDA BIT P3.4
W_SCL BIT P3.5
;------------------------------------------
F_DISP0 EQU 00H
F_DISP EQU 01H
R_SUBADR EQU 02H
R_KEY EQU 03H
BIT_32 EQU 04H
F_24C2X EQU 05H
;------------------
F_24C1X EQU 21H
;------------------
F_24C01 EQU 08H
F_24C02 EQU 09H
F_24C04 EQU 0AH
F_24C08 EQU 0BH
F_24C16 EQU 0CH
F_24C32 EQU 0DH
F_24C64 EQU 0EH
;------------------
F_24C2XX EQU 22H
;------------------
F_24C128 EQU 10H
F_24C256 EQU 11H
F_24C512 EQU 12H
DISP01 EQU 30H
DISP02 EQU 31H
DISP03 EQU 32H
DISP04 EQU 33H
DISP05 EQU 34H
DISP06 EQU 35H
DISP07 EQU 36H
DISP08 EQU 37H
;------------------------------------------
BITCNT EQU 38H ;送数8位
SUBADR EQU 39H ;取存储地址
BIT32 EQU 3AH
SUB_24CXX EQU 3BH ;24CXX的总线地止
TIME EQU 3CH
;**********************************************
ORG 0000H
AJMP START1 ;转入主程序
ORG 001BH
LJMP TTT
ORG 0030H
;**********************************************
START1:
CLR P3.3 ;以下为主程序进行CPU中断方式设置
SETB EA ;打开CPU总中断请求
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
SETB EX0 ;打开INT0中断请求
MOV R0,#7FH
MCR:
MOV @R0,#00H
DJNZ R0,MCR
MOV TMOD,#00010001B
MOV TH1,#3CH
MOV TL1,#0B0H
SETB ET1
MOV TIME,#2
; SJMP $
SETB BIT_32
MOV SUB_24CXX,#0A0H ;24CXX总线起始地址
;*************************************
MAIN:
LCALL KEY
JB BIT_32,MAIN ;到32页了就不再写入24C64
F_01:
JNB F_24C01,F_02
LJMP RW_24C01
F_02:
JNB F_24C02,F_04
LJMP RW_24C02
F_04:
JNB F_24C04,F_08
LJMP RW_24C04
F_08:
JNB F_24C08,F_16
LJMP RW_24C08
F_16:
JNB F_24C16,F_32
LJMP RW_24C16
F_32:
JNB F_24C32,F_64
LJMP RW_24C32
F_64:
JNB F_24C64,F_128
LJMP RW_24C64
F_128:
JNB F_24C128,F_256
LJMP RW_24C128
F_256:
JNB F_24C256,MAIN
LJMP RW_24C256
F_512:
JNB F_24C128,F_512
LJMP RW_24C512
LJMP MAIN
;----------------------
RW_24C01:
LCALL ADD_RW24 ;写入数据
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#80H,RW_24C01
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C02:
LCALL ADD_W24 ;写入数据
INC 60H
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C02
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C04:
LCALL ADD_W24 ;写入数据
INC 60H
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C04
MOV A,SUB_24CXX ;24CXX总线起始地址加2
ADD A,#02H
MOV SUB_24CXX,A
MOV SUBADR,#00H ;从24C64的0地止开始写入
CJNE A,#0A4H,RW_24C04
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C08:
LCALL ADD_W24 ;写入数据
INC 60H
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C08
MOV A,SUB_24CXX ;24CXX总线起始地址加2
ADD A,#02H
MOV SUB_24CXX,A
MOV SUBADR,#00H ;从24C64的0地止开始写入
CJNE A,#0A8H,RW_24C08
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C16:
LCALL ADD_W24 ;写入数据
INC 60H
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C16
MOV A,SUB_24CXX ;24CXX总线起始地址加2
ADD A,#02H
MOV SUB_24CXX,A
MOV SUBADR,#00H ;从24C64的0地止开始写入
CJNE A,#0B0H,RW_24C16
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C32:
LCALL ADD_W24 ;写入数据
INC 60H
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C32
MOV 60H,#0
INC R4
MOV SUBADR,#00H ;从24C64的0地止开始写入
CJNE R4,#16,RW_24C32
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C64:
LCALL ADD_W24 ;写入数据
INC 60H
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C64
MOV 60H,#0
INC R4
MOV SUBADR,#00H ;从24C64的0地止开始写入
CJNE R4,#32,RW_24C64
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C128:
LCALL ADD_W24 ;写入数据
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C128
INC R4
MOV SUBADR,#00H ;从24C64的0地止开始写入
CJNE R4,#64,RW_24C128
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C256:
LCALL ADD_W24 ;写入数据
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C256
INC R4
MOV SUBADR,#00H ;从24C64的0地止开始写入
CJNE R4,#128,RW_24C256
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;----------------------
RW_24C512:
LCALL ADD_W24 ;写入数据
INC SUBADR ;24C02地止加1
MOV A,SUBADR
CJNE A,#00H,RW_24C512
INC R4
MOV SUBADR,#00H ;从24C64的0地止开始写入
CJNE R4,#00H,RW_24C512
SETB BIT_32
MOV P1,#0FFH
LJMP MAIN
;*************************************
KEY:
MOV A,#00H
MOV B,#00H
MOV P0,#0FH ;P0=0000 1111 ó?·′×a·¨2é?ü
MOV A,P0 ;A =0000 1111
ANL A,#0FH ;A =0000 1111
MOV B,A ;B =0000 1111
MOV P0,#0F0H ;P0=1111 0000
MOV A,P0 ;A =1111 0000
ANL A,#0F0H ;A =1111 0000
ORL A,B ;A =1111 1111
;*************************************
K_24C01:
CJNE A,#77H,K_24C02
MOV F_24C1X,#00000001B
MOV F_24C2XX,#00000000B
MOV P1,#11111110B
MOV SUB_24CXX,#0A0H
MOV 60H,#00H
CLR BIT_32
MOV R4,#0
CLR F_24C2X
RET
K_24C02:
CJNE A,#0B7H,K_24C04
MOV F_24C1X,#00000010B
MOV F_24C2XX,#00000000B
MOV P1,#11111101B
MOV SUB_24CXX,#0A0H
MOV 60H,#00H
CLR BIT_32
MOV R4,#0
CLR F_24C2X
RET
K_24C04:
CJNE A,#7BH,K_24C08
MOV F_24C1X,#00000100B
MOV F_24C2XX,#00000000B
MOV P1,#11111011B
MOV SUB_24CXX,#0A0H
MOV 60H,#00H
CLR BIT_32
MOV R4,#0
CLR F_24C2X
RET
K_24C08:
CJNE A,#0BBH,K_24C016
MOV F_24C1X,#00001000B
MOV F_24C2XX,#00000000B
MOV P1,#11110111B
MOV SUB_24CXX,#0A0H
MOV 60H,#00H
CLR BIT_32
MOV R4,#0
CLR F_24C2X
RET
K_24C016:
CJNE A,#7DH,K_24C32
MOV F_24C1X,#00010000B
MOV F_24C2XX,#00000000B
MOV P1,#11101111B
MOV SUB_24CXX,#0A0H
MOV 60H,#0
CLR BIT_32
MOV R4,#0
CLR F_24C2X
RET
K_24C32:
CJNE A,#0BDH,K_24C64
MOV F_24C1X,#00100000B
MOV F_24C2XX,#00000000B
MOV P1,#11011111B
MOV SUB_24CXX,#0A0H
MOV 60H,#0
CLR BIT_32
MOV R4,#0
SETB F_24C2X
RET
K_24C64:
CJNE A,#7EH,K_24C128
MOV F_24C1X,#01000000B
MOV F_24C2XX,#00000000B
MOV P1,#10111111B
MOV SUB_24CXX,#0A0H
MOV 60H,#0
CLR BIT_32
MOV R4,#0
SETB F_24C2X
RET
K_24C128:
CJNE A,#0BEH,K_24C256
MOV F_24C1X,#00000000B
MOV F_24C2XX,#00000001B
MOV P1,#00000001B
MOV SUB_24CXX,#0A0H
MOV 60H,#0
CLR BIT_32
MOV R4,#0
SETB F_24C2X
RET
K_24C256:
CJNE A,#0DEH,K_24C512
MOV F_24C1X,#00000000B
MOV F_24C2XX,#00000010B
MOV P1,#00000010B
MOV SUB_24CXX,#0A0H
MOV 60H,#0
CLR BIT_32
MOV R4,#0
SETB F_24C2X
RET
K_24C512:
CJNE A,#0EEH,KEYRET
MOV F_24C1X,#00000000B
MOV F_24C2XX,#00000100B
MOV P1,#00000100B
MOV SUB_24CXX,#0A0H
MOV 60H,#0
CLR BIT_32
MOV R4,#0
SETB F_24C2X
RET
KEYRET:
RET
;--------------------------------------------
TTT:
DJNZ TIME,T_RET
MOV TIME,#2
CPL P1.1
T_RET:
MOV TH1,#3CH
MOV TL1,#0B0H
RETI
;**********************************************
DIS60H:
MOV A,60H ;将存放在RAM\62H中的数据移入A中
ANL A,#0F0H ;取RAM\62H中的数据低位
SWAP A
MOV R0,#DISP02
LCALL DISNUMA
MOV A,60H ;将存放在RAM\62H中的数据移入A中
ANL A,#0FH ;取RAM\62H中的数据高位
MOV R0,#DISP01
LCALL DISNUMB
;**********************************************
;发送子程序
;**********************************************
LOOP_DISP:
MOV R2,#2 ;2个8字显示
MOV R0,#DISP01 ;缓冲区首址入R0
MOV SCON,#00H ;UART方式0设定
SOUT: MOV A,@R0 ;发送数据入A中
CLR TI ;发送结束标志清零
MOV SBUF,A ;启动发送
WAIO: JNB TI,WAIO ;发送等等
INC R0 ;指向下一个发送数据地址
DJNZ R2,SOUT ;N个字节发送完未完转SOUT
DISRET:
RET
;============================
;写数据
ADD_W24:
MOV R7,60H
LCALL DIS60H
SETB TR1
LCALL WRITE_24C02 ;将R7的数据写入24C02
RET
;============================
WRITE_24C02:
ACALL START ;发送IC总线起始条件
MOV A,SUB_24CXX ;24CXX总线起始地址
ACALL ONETBYTE ;发送24C02器件总线地址
JB F0,SEND ;出错返回
JNB F_24C2X,F_24C16A
MOV A,R4 ;取存储地址
ACALL ONETBYTE ;发送24C02器件存储地址
JB F0,SEND ;出错返回
F_24C16A:
MOV A,SUBADR ;取存储地址
ACALL ONETBYTE ;发送24C02器件存储地址
JB F0,SEND ;出错返回
MOV A,R7
ACALL ONETBYTE ;发送一次数据
JB F0,SEND ;出错返回
ACALL STOP ;发送IC总线停止条件
DELAY12: ;延时10MS等待数据写完
MOV 54H,#40
DE2:
MOV 55H,#30
DJNZ 55H,$
DJNZ 54H,DE2
CLR TR1
RET
SEND:
MOV 54H,#0FFH
DE3:
MOV 55H,#0FFH
DJNZ 55H,$
DJNZ 54H,DE3
INC 61H
CPL P1.0
MOV A,61H
CJNE A,#30,EER
MOV 61H,#0
CLR TR1
SETB BIT_32
MOV P1,#00H
LJMP MAIN
EER:
RET
;=======================================
START:
SETB SDA ;发送起始条件的数据信号
NOP
NOP
NOP
SETB SCL ;发送起始条件的时钟信号
NOP ;起始条件建立时间大于4.7s
NOP
NOP
CLR SDA ;发送起始信号
NOP ;起始条件锁定时间大于4s
NOP
NOP
CLR SCL ;钳住IC总线准备发送或接受数据
RET
;==================================
STOP:
CLR SDA ;发送停止条件的数据信号
NOP
NOP
NOP
SETB SCL ;发送停止条件的时钟信号
NOP ;起始条件建立时间大于4s
NOP
NOP
SETB SDA ;发送IC总线停止信号
NOP
NOP
NOP
NOP
RET
;===============================
ONETBYTE: ;送数8位;发送24C02器件总线地址
MOV BITCNT,#08H
SENTB:
RLC A ;要发送的数据左移,发送入位C
MOV SDA,C
NOP
NOP
NOP
SETB SCL ;置时钟线为高,通知被控制开始接受数据位
NOP ;保证时钟高周期大于4s
NOP
NOP
CLR SCL ;钳住总线准备接受下一个数据位
DJNZ BITCNT,SENTB ;8位没发送完继续发送
NOP
NOP
SETB SDA ;8位发送完后释放数据线准备收应答位
NOP
NOP
SETB SCL ;开始接受应答信号
NOP
NOP
CLR F0 ;预先清发送数据出错标志
JNB SDA,ACKEND ;判断是否接受应答信号正常转ACKEND
SETB F0 ;未受到应答置位错误标志
ACKEND: ;应答信号正常
NOP
CLR SCL ;发送结束钳住总线准备下一步发送或接受数据或进行其他处理
RET
;=================================
RCVBYTE:
SETB SDA ;置数据线为输入方式
MOV BITCNT,#08H ;要传送的数据长度为8位
RCV:
NOP
CLR SCL ;置时钟线为低,准备接受数据
NOP ;时钟低周期大于4.7s
NOP
NOP
NOP
NOP
SETB SCL ;置时钟线为高使数据线上数据有效
NOP
NOP
MOV C,SDA
RLC A ;接受的数据位放入ACC
NOP
NOP
DJNZ BITCNT,RCV ;8位没收完继续接受
CLR SCL ;8位接受完置时钟线和数据线
NOP
NOP
CLR SDA
SETB SDA ;接受非应答信号
NOP
NOP
SETB SCL ;置时钟线为高使应答位有效
NOP ;时钟高周期大于4.7s
NOP
SETB SDA
NOP
NOP
NOP
CLR SCL ;清时钟线钳住IC总线以便发送停止条件
RET
;=================================
DISNUMA:
DIS0A: ;前0
CJNE A,#0,DIS1A
MOV @R0,#10001000B
RET
DIS1A: ;前1
CJNE A,#1,DIS2A
MOV @R0,#11101110B
RET
DIS2A: ;前2
CJNE A,#2,DIS3A
MOV @R0,#10010010B
RET
DIS3A: ;前3
CJNE A,#3,DIS4A
MOV @R0,#10100010B
RET
DIS4A: ;前4
CJNE A,#4,DIS5A
MOV @R0,#11100100B
RET
DIS5A: ;前5
CJNE A,#5,DIS6A
MOV @R0,#10100001B
RET
DIS6A: ;前6
CJNE A,#6,DIS7A
MOV @R0,#10000001B
RET
DIS7A: ;前7
CJNE A,#7,DIS8A
MOV @R0,#11101010B
RET
DIS8A: ;前8
CJNE A,#8,DIS9A
MOV @R0,#10000000B
RET
DIS9A: ;前9
CJNE A,#9,DISA
MOV @R0,#10100000B
RET
DISA: ;前a
CJNE A,#0AH,DISB
MOV @R0,#11000000B
RET
DISB: ;前b
CJNE A,#0BH,DISC
MOV @R0,#10000101B
RET
DISC: ;前c
CJNE A,#0CH,DISD
MOV @R0,#10010111B
RET
DISD: ;前d
CJNE A,#0DH,DISE
MOV @R0,#10000110B
RET
DISE: ;前e
CJNE A,#0EH,DISF
MOV @R0,#10010001
RET
DISF: ;前f
CJNE A,#0FH,DISARET
MOV @R0,#11010001
RET
DISARET:
RET
;**********************************************
DISNUMB:
DIS0B: ;后0
CJNE A,#0,DIS1B
MOV @R0,#00010001B
RET
DIS1B: ;后1
CJNE A,#1,DIS2B
MOV @R0,#01110111B
RET
DIS2B: ;后2
CJNE A,#2,DIS3B
MOV @R0,#10010100B
RET
DIS3B: ;后3
CJNE A,#3,DIS4B
MOV @R0,#01010100B
RET
DIS4B: ;后4
CJNE A,#4,DIS5B
MOV @R0,#01110010B
RET
DIS5B: ;后5
CJNE A,#5,DIS6B
MOV @R0,#01011000B
RET
DIS6B: ;后6
CJNE A,#6,DIS7B
MOV @R0,#00011000B
RET
DIS7B: ;后7
CJNE A,#7,DIS8B
MOV @R0,#01110101B
RET
DIS8B: ;后8
CJNE A,#8,DIS9B
MOV @R0,#00010000B
RET
DIS9B: ;后9
CJNE A,#9,DISBA
MOV @R0,#01010000B
RET
DISBA: ;后a
CJNE A,#0AH,DISBB
MOV @R0,#00110000B
RET
DISBB: ;后b
CJNE A,#0BH,DISBC
MOV @R0,#00011010B
RET
DISBC: ;后C
CJNE A,#0CH,DISBD
MOV @R0,#10011001B
RET
DISBD: ;后d
CJNE A,#0DH,DISBE
MOV @R0,#00010110B
RET
DISBE: ;后e
CJNE A,#0EH,DISBF
MOV @R0,#10011000B
RET
DISBF: ;后f
CJNE A,#0FH,DISBRET
MOV @R0,#10111000B
RET
DISBRET:
RET
;*****************************************************
MUSIC:
CPL P3.3
LCALL DELAY
CLR P3.3
LCALL DELAY
LCALL DELAY
RET
;**********************************************
MUSIC1:
CPL P3.3
LCALL DELAY
CPL P3.3
LCALL DELAY
CPL P3.3
LCALL DELAY
CLR P3.3
LYYY:
MOV P0,#0FH
MOV A,P0
CJNE A,#0FH,LYYY
RET
;**********************************************
DELAY:
MOV 40H,#0FFH
DELAY1: MOV 41H,#0FFH
DJNZ 41H,$
DJNZ 40H,DELAY1
RET
;**********************************************
YS1: MOV 40H,#20 ;延时882微秒
D1: MOV 41H,#20
DJNZ 41H,$
DJNZ 40H,D1
RET
;**********************************************
YS2: MOV 40H,#10 ;延时4740微秒
D2: MOV 41H,#235
DJNZ 41H,$
DJNZ 40H,D2
RET
;**********************************************
YS3: MOV 40H,#2 ;延时1000微秒
D3: MOV 41H,#248
DJNZ 41H,$
DJNZ 40H,D3
RET
;**********************************************
END
用户377235 2012-5-6 17:06
用户741296 2007-11-9 12:48
不错啊!
o(∩_∩)o...