1、用VB把字符串的HEX转换成bin二进制文件
就一个简单的按钮即可
【VB代码】
Public Function str2hex(i As String, j As String) As Byte
Dim a As Byte
Dim b As Byte
Dim c As Byte
c = Asc("a") - Asc("A")
If Asc(i) >= Asc("a") And Asc(i) <= Asc("z") Then
i = Chr(Asc(i) - c)
End If
If Asc(j) >= Asc("a") And Asc(j) <= Asc("z") Then
j = Chr(Asc(j) - c)
End If
If Asc(i) < Asc("A") Then
a = Asc(i) - Asc("0")
Else
a = Asc(i) - Asc("A") + 10
End If
If Asc(j) < Asc("A") Then
b = Asc(j) - Asc("0")
Else
b = Asc(j) - Asc("A") + 10
End If
str2hex = a * 16 + b
End Function
Private Sub Command1_Click()
Dim i As Byte
Dim a As String
Dim b As String
Dim c As String
Dim d As String
a = "0"
b = "0"
c = "0"
d = "0"
Open App.Path + "\1.txt" For Input As #1
Open App.Path + "\2.bin" For Output As #3
Print #3, ""
Close #3
Open App.Path + "\2.bin" For Binary As #2
While Not EOF(1)
a = b
b = c
c = d
d = Input(1, #1)
If a = "0" And (b = "x" Or b = "X") Then
i = str2hex(c, d)
Put #2, , i
End If
Wend
Close #1
Close #2
End Sub
双击存储器,把2.bin导入进去
【H文件】
#ifndef __M45PE16_H_
#define __M45PE16_H_
/**********************************
包含头文件
**********************************/
#include<reg51.h>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/**********************************
PIN口定义 P1
**********************************/
sbit M45PE16_c=P2^0;
sbit M45PE16_d=P2^1;
sbit M45PE16_q=P2^2;
sbit M45PE16_s=P2^3;
/**********************************
函数声明
**********************************/
void M45PE16_RDID(uchar *p);//读取RDID标志寄存器
uchar M45PE16_RDSR();//读取RDSR状态寄存器
//读取单个字节 3字节地址
uchar M45PE16_data1(uchar msb,uchar hsb,uchar lsb);
//读取n个字节 3字节地址
void M45PE16_datan(uchar msb,uchar hsb,uchar lsb,uchar n,uchar *p);
//进入高速读取模式
void M45PE16_FAST_READ(uchar msb,uchar hsb,uchar lsb);
//页写1-256B
void M45PE16_pw(uchar msb,uchar hsb,uchar lsb,uchar *p,uchar n);
//页编程1-256B
void M45PE16_pp(uchar msb,uchar hsb,uchar lsb,uchar *p,uchar n);
//发送命令+地址
void M45PE16_ee(uchar com,uchar msb,uchar hsb,uchar lsb);
void M45PE16_send8(uchar m);//写单个指令
//读取8bit
uchar M45PE16_read8();
void M45PE16_send8(uchar m);
void M45PE16_init();//写使能
#endif
【C文件】
#include "M45PE16.h"
/*
0-31页,0页范围:000000H~00FFFFH
*/
void M45PE16_delay(uchar i)
{
while(i--);
}
//写单个指令
/*
M45PE16_s=0;
M45PE16_send8(0x06)//写使能 (0x04)//写禁止
(0xb9)关机(0xab)开机
M45PE16_s=1;
*/
void M45PE16_send8(uchar m)
{
uchar i;
M45PE16_c=0;
M45PE16_delay(10);
for(i=0;i<8;i++)
{
if((m & 0x80)>0)
M45PE16_d=1;
else
M45PE16_d=0;
m<<=1;
M45PE16_c=1;
M45PE16_delay(10);
M45PE16_c=0;
M45PE16_delay(10);
}
}
void M45PE16_init()//写使能
{
M45PE16_s=0;
M45PE16_send8(0x06);//写使能
M45PE16_s=1;
}
//读取8bit
uchar M45PE16_read8()
{
uchar i,k=0;
for(i=0;i<8;i++)
{
k<<=1;
M45PE16_c=1;
if(M45PE16_q)
k++;
M45PE16_delay(10);
M45PE16_c=0;
M45PE16_delay(10);
}
return k;
}
//读取RDID标志寄存器
void M45PE16_RDID(uchar *p)
{
M45PE16_s=0;
M45PE16_send8(0x9f);
*p=M45PE16_read8();//制造商标志1B
p++;
*p=M45PE16_read8();//内存类型
p++;
*p=M45PE16_read8();//内存容量
M45PE16_s=1;
}
//读取RDSR状态寄存器
uchar M45PE16_RDSR()
{
uchar i;
M45PE16_s=0;
M45PE16_send8(0x05);
i= M45PE16_read8();
M45PE16_s=1;
return i;
}
//读取单个字节 3字节地址
uchar M45PE16_data1(uchar msb,uchar hsb,uchar lsb)
{
uchar i;
M45PE16_s=0;
M45PE16_send8(0x03);
M45PE16_send8(msb);
M45PE16_send8(hsb);
M45PE16_send8(lsb);
i=M45PE16_read8();
M45PE16_s=1;
return i;
}
//读取n个字节 3字节地址
void M45PE16_datan(uchar msb,uchar hsb,uchar lsb,uchar n,uchar *p)
{
uchar i;
M45PE16_s=0;
M45PE16_send8(0x03);
M45PE16_send8(msb);
M45PE16_send8(hsb);
M45PE16_send8(lsb);
for(i=0;i<n;i++)
{
*p=M45PE16_read8();
p++;
}
M45PE16_s=1;
}
//进入高速读取模式
//该模式可以一直读下去,无需重新发送命令
/*
M45PE16_FAST_READ(uchar msb,uchar hsb,uchar lsb);
i=M45PE16_read8();
M45PE16_s=1;//退出
*/
void M45PE16_FAST_READ(uchar msb,uchar hsb,uchar lsb)
{
M45PE16_s=0;
M45PE16_send8(0x0b);
M45PE16_send8(msb);
M45PE16_send8(hsb);
M45PE16_send8(lsb);
M45PE16_send8(0);
}
//页写1-256B
void M45PE16_pw(uchar msb,uchar hsb,uchar lsb,uchar *p,uchar n)
{
uchar i;
M45PE16_s=0;
M45PE16_send8(0x0a);
M45PE16_send8(msb);
M45PE16_send8(hsb);
M45PE16_send8(lsb);
for(i=0;i<n;i++)
{
M45PE16_send8(*p);
p++;
}
M45PE16_s=1;
}
//页编程1-256B 只能把1变成0.不能把0变成1
void M45PE16_pp(uchar msb,uchar hsb,uchar lsb,uchar *p,uchar n)
{
uchar i;
M45PE16_s=0;
M45PE16_send8(0x02);
M45PE16_send8(msb);
M45PE16_send8(hsb);
M45PE16_send8(lsb);
for(i=0;i<n;i++)
{
M45PE16_send8(*p);
p++;
}
M45PE16_s=1;
}
//发送命令+地址
//页擦除M45PE16_ee(0xdb,0,0,0);
//扇区擦除M45PE16_ee(0xd8,0,0,0);
void M45PE16_ee(uchar com,uchar msb,uchar hsb,uchar lsb)
{
M45PE16_s=0;
M45PE16_send8(com);
M45PE16_send8(msb);
M45PE16_send8(hsb);
M45PE16_send8(lsb);
M45PE16_s=1;
}
【主函数】
#include "reg51.h"
#include "M45PE16.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;//按钮
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit k9=P3^7;
sbit k10=P3^6;
sbit k11=P3^5;
sbit k12=P3^4;
uchar str[]="0000000000";
uchar time=0,mode=0;//系统变量
//延时
void delay(uint i)
{
while(i--);
}
//串口发送
void send(uchar i)
{
SBUF=i;
while(!TI);
TI=0;
}
void main() //主函数
{
uchar i;
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
TH1=0XFD;
TL1=0XFD;
TR1=1; //打开计数器
TMOD|=0X01;
TH0=(65536-50000)/256;//50ms
TL0=(65536-50000)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
if(!k1)
{
M45PE16_RDID(str);//读取RDID
send(str[0]);
send(str[1]);
send(str[2]);
while(!k1);
}
if(!k2)//读取RDSR
{
i=M45PE16_RDSR();
send(i);
while(!k2);
}
if(!k3)//关机,没用
{
M45PE16_s=0;
M45PE16_send8(0xb9);
M45PE16_s=1;
while(!k3);
}
if(!k4)//开机,没用
{
M45PE16_s=0;
M45PE16_send8(0xab);
M45PE16_s=1;
while(!k4);
}
if(!k5)//读取1B
{
i=M45PE16_data1(0,0,1);
send(i);
while(!k5);
}
if(!k6)//连续读
{
M45PE16_datan(0,0,0,3,str);
send(str[0]);
send(str[1]);
send(str[2]);
while(!k6);
}
if(!k7)//高速模式
{
M45PE16_FAST_READ(0,0,0);
while(!k7);
}
if(!k8)//高速模式读
{
i=M45PE16_read8();
send(i);
while(!k8);
}
if(!k9)//退出高速模式
{
M45PE16_s=1;//退出
while(!k9);
}
if(!k10)//页写
{
M45PE16_init();//写使能
M45PE16_pw(0,0,0,"4568",4);
while(!k10);
}
if(!k11)//页编程
{
M45PE16_init();//写使能
M45PE16_pp(0,0,0,"0568",4);
while(!k11);
}
if(!k12)
{
M45PE16_init();//写使能
M45PE16_ee(0xdb,0,0,0);//页擦除
//M45PE16_ee(0xd8,0,0,0);//扇区擦除
while(!k12);
}
}
}
//定时器中断
void Timer0() interrupt 1
{
if(time<10)//0.5s
time++;
else
{
time=0;
}
TH0=(65536-50000)/256;//50ms
TL0=(65536-50000)%256;
}