;serial memory 93c46 org 00h ;---------------register define------------------ s9346_cs equ p1.0 s9346_clk equ p1.1 s9346_di equ p1.2 s9346_do equ p1.3 ;------------------------------------------------ temp_9346 equ 0x75 count_9346 equ 0x74 data_hb equ 0x73 ;data register data_lb equ 0x72 ;data register adrs_9346 equ 0x20 ;single bit define ;========================================================================= mov p2,#0xff ;if p2=>8 leds(lb) mov p3,#0xff ;if p3=>8 leds(hb) ; clr s9346_cs ;initial status clr s9346_clk ;initial status clr s9346_di ;initial status setb s9346_do ;;initial status(notice) ; mov adrs_9346,#0x00 ;write 93c46@00h mov data_hb,#0x0a ;if data high byte=0ah mov data_lb,#0x55 ;if data high byte=55h call write_data ; mov data_hb,#0x00 ;clear data_hb mov data_lb,#0x00 ;claer data_lb ; mov adrs_9346,#0x00 ;read 93c46@00h call read_data mov p3,data_hb mov p2,data_lb end_9346: jmp end_9346 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;===============clock signal clk_pus: setb s9346_clk nop clr s9346_clk ret ;===============write start bit wr_sb: setb s9346_cs setb s9346_di call clk_pus ret ;===============write 1-byte data wr_byte: mov count_9346,#8 wrbit: mov a,temp_9346 rlc a mov temp_9346,a jc wrh clr s9346_di call clk_pus jmp wrlp9346 wrh: setb s9346_di call clk_pus wrlp9346: djnz count_9346,wrbit ret ;===============read 1-byte data rd_byte: mov count_9346,#8 clr a rdbit: call clk_pus jb s9346_do,rdh clr c rlc a jmp rdlp9346 rdh: setb c rlc a rdlp9346: djnz count_9346,rdbit mov temp_9346,a ret ;===============erase/write enable ew_ena: mov temp_9346,#00110000b ;opcode=00,address=11xxxx call wr_sb call wr_byte clr s9346_di clr s9346_cs ret ;==============erase/write disable ew_dis: mov temp_9346,#00000000b ;opcode=00,address=00xxxx call wr_sb call wr_byte clr s9346_di clr s9346_cs ret ;===============erase 1-data,write 0xff to 1-address erase_data: setb adrs_9346.7 ;opcode=11 setb adrs_9346.6 mov temp_9346,adrs_9346 call wr_sb call wr_byte clr s9346_cs clr s9346_di nop setb s9346_cs erasewait: nop jnb s9346_do,erasewait clr s9346_cs ret ;========================================================================= ;***************write 16 bits data to 93c46 write_data: call ew_ena call erase_data clr adrs_9346.7 ;opcode=01 setb adrs_9346.6 mov temp_9346,adrs_9346 call wr_sb call wr_byte nop mov temp_9346,data_hb call wr_byte mov temp_9346,data_lb call wr_byte clr s9346_di clr s9346_cs nop setb s9346_cs wrwait: nop jnb s9346_do,wrwait call ew_dis clr s9346_cs ret ;***************read 16 bits data from 93c46 read_data: setb adrs_9346.7 ;opcode=10 clr adrs_9346.6 mov temp_9346,adrs_9346 call wr_sb call wr_byte nop call rd_byte mov data_hb,temp_9346 call rd_byte mov data_lb,temp_9346 clr s9346_di clr s9346_cs ret ; end