一直用汇编写程序,C有点熟悉,但一直没正真写C代码 下面是自己刚写的一段C (STC EEPROM的读写程序) 代码通过编译和调试 主要是请大家帮我提点建议,哪些地方需要改进和注意的 还有这样像我这么写会出现什么以外问题吗。
#include "reg52.h" #include "intrins.h"
#define isp_iap_byte_read 1; #define isp_iap_byte_program 2; #define isp_iap_sector_erase 3; #define time_wait 1;//<40M=0 <20M=1 <10M=2 <5M=3
sfr isp_data = 0xe2; ////ISP_DATA 使用大写 sfr isp_addrh = 0xe3; ////ISP_ADDRH sfr isp_addrl = 0xe4; ////ISP_ADDRL sfr isp_cmd = 0xe5; ////ISP_CMD sfr isp_trig = 0xe6; ////ISP_TRIG sfr isp_contr = 0xe7; //// ISP_CONTR
sbit red0 = P1^5; sbit blue = P1^6; sbit red1 = P1^7; bit rev_**;
void init_uart(); unsigned char iap_read(unsigned char h0,unsigned char l0); void iap_write(unsigned char h1,unsigned char l1,unsigned char data_one); void iap_erase(unsigned char h2,unsigned char l2); unsigned char mavis; //********************************************************************** void main(void) { unsigned int i; unsigned char rd_byte ,addrh,addrl,data_1; init_uart();
while(1) { if(rev_**==1) { // red0=0; // red1=1; addrh=0x80; addrl=0x00;
rd_byte=iap_read(addrh,addrl);
if(rd_byte==0x55) { // red0=0; // red1=0;
} else { red0=0; red1=1; addrh=0x80; addrl=0x00; for(i=0;i<=6000;i++); //时间调整主要看灯变化。
iap_erase(addrh,addrl); addrh=0x80; addrl=0x00; data_1=0x56; //与0X55不同,这样串口助手发77就可以看灯的变化 _nop_(); _nop_(); _nop_(); iap_write(addrh,addrl,data_1); red1=0; red0=1; } rev_**=0; }
} } //********************************************************************** void init_uart() { P1 = 0xff; PCON = 0x00; TMOD = 0x20; SCON = 0x50; TH1 = 0xfd; TL1 = 0xfd; EA = 1; TR1 = 1; ES = 1; } //********************************************************************** void UART_ISR(void) interrupt 4 { if(!TI) { RI = 0; mavis=SBUF; if(mavis==0x77) ;接收命令0X77 {blue=~blue; rev_**=1; } // rev_**=0; } TI=0;
} //**********************************************************************
//********************************************************************** //read unsigned char iap_read(unsigned char h0,unsigned char l0) { unsigned char i; isp_addrh=h0; isp_addrl=l0; EA=0; isp_contr=time_wait; isp_contr|=0x80; isp_cmd=isp_iap_byte_read; isp_trig=0x46; isp_trig=0xb9; _nop_(); i=isp_data; isp_contr =0; isp_cmd =0; isp_trig =0; isp_addrh =0; isp_addrl =0; EA=1; return(i);
} //**********************************************************************
//********************************************************************** //write void iap_write(unsigned char h1,unsigned char l1,unsigned char data_one) { isp_data=data_one; isp_addrh=h1; isp_addrl=l1; EA=0; isp_contr=time_wait; isp_contr|=0x80; isp_cmd=isp_iap_byte_program; isp_trig=0x46; isp_trig=0xb9; _nop_(); isp_contr =0; isp_cmd =0; isp_trig =0; isp_addrh =0; isp_addrl =0; EA=1;
} //**********************************************************************
//********************************************************************** //erase void iap_erase(unsigned char h2,unsigned char l2) {
isp_addrh=h2; isp_addrl=l2; EA=0; isp_contr=time_wait; isp_contr|=0x80; isp_cmd=isp_iap_sector_erase; isp_trig=0x46; isp_trig=0xb9; _nop_(); isp_contr =0; isp_cmd =0; isp_trig =0; isp_addrh =0; isp_addrl =0; EA=1;
} //********************************************************************** |