vb2002 发表于 2024-8-1 21:06:57

这eeprom看不见,摸不着,好难哦,不像pwm那样可以看见调试

这个是代码.

串口也见不到FF
也看不到效果.
不懂怎么诊断了
#include "stc8h.h"
#include "intrins.h"

#define MAIN_Fosc 11059200UL
#define BRT         (65536 - MAIN_Fosc / 115200 / 4)

typedef unsigned char u8;typedef unsigned int u16;

void delayms(u16 ms);   
void sys_init();
void PWM_init(void);
//void Timer0_Init(void);
void UartInit();
void UartSend(char dat);
char IapRead(unsigned int addr);
void IapProgram(unsigned int addr, char dat);
void IapErase(unsigned int addr);
void IapIdle();

u8 temp,number,save;
bit flag;
sbit key=P3^2;
       static u8 state;
       


void UartInit()
{
    SCON = 0x5a;
    T2L = BRT;
    T2H = BRT >> 8;
    AUXR = 0x15;
}


void UartSend(char dat)
{
    while (!TI);
    TI = 0;
    SBUF = dat;
}


void main()
{       
       
        P_SW2|=0x80;
        sys_init();
   UartInit();
UartSend();
IapRead();
IapProgram();
IapErase();
IapIdle();


        temp = IapRead(0x0000);
//        if(temp != 0xFF) number = temp;       
       
        while(1)
        {

        switch(state)
        {
                case 0 :PWMA_CCR1 = 0;   break;
                case 1 :PWMA_CCR1 = 5;   break;
                case 2 :PWMA_CCR1 = 25;   break;
                case 3 :PWMA_CCR1 = 70; IapErase(0x0000);IapProgram(0x0000,state); break;
                default:break;
        }

        }
       
       
}

void INT0_Isr(void) interrupt 0
{

delayms(10);
if(INT0==0)
{
state++;
if(state >= 4)
state=0;

}
}



void sys_init(void)
{
        P_SW2=0x80;
       
    P3M0 = 0x00; P3M1 = 0xf8;       P1M0 = 0x00; P1M1 = 0xfe;
       
           PWM_init();
//       Timer0_Init();
       
       
        IT0=1;EX0=1;
        INTCLKO|=0x40;   //EX4=1; 允许INT4外部中断
//        IP2H=0x00;               
        IP2=0x10;

       
        EA=1;                        //打开总中断


}


//// 初始化PWM功能
void PWM_init(void) {
    PWMA_CCER1 = 0x00;                        // 写CCMRx前必须先清零CCERx关闭通道
    PWMA_CCMR1 = 0x60;                        // 设置CC1为PWMA输出模式
    PWMA_PS      = 0x00;                      //
    PWMA_CCER1 = 0x03;                        // 使能CC4通道双极
    PWMA_CCR1 = temp;                              // 初始化CCR4计数值为0
    PWMA_ARR = 100;                           // 设置周期时间为12000个计数周期
    PWMA_ENO = 0x01;                            // 使能PWM4P+N端口输出
    PWMA_PSCR = 0;                              // PWM时钟预分频寄存器设置为0
    PWMA_BKR = 0x80;                            // 使能主输出
    PWMA_CR1 = 0x01;                            // 开始计时
       
}


void Timer0_Isr(void) interrupt 1
{
        flag=1;
}

void Timer0_Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TMOD |= 0x01;                        //设置定时器模式
        TL0 = 0xCD;                                //设置定时初始值
        TH0 = 0xD4;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}


void IapIdle()
{
        IAP_CONTR = 0;                                                 // 关闭 IAP 功能
        IAP_CMD = 0;                                                 // 清除命令寄存器
        IAP_TRIG = 0;                                                 // 清除触发寄存器

        IAP_ADDRH = 0x00;                                        // 清零高地址寄存器
        IAP_ADDRL = 0x00;                                        // 清零低地址寄存器
}

char IapRead(unsigned int addr)
{
        char dat;
        IAP_CONTR = 0x80;                                 // 使能 IAP
        IAP_TPS = 12;                                                 // 设置等待参数 12MHz
        IAP_CMD = 1;                                                         // 设置 IAP 读命令
        IAP_ADDRL = addr;                                 // 设置 IAP 低地址
        IAP_ADDRH = addr >> 8;                 // 设置 IAP 高地址

        IAP_TRIG = 0x5a;                                         // 写触发命令 (0x5a)
        IAP_TRIG = 0xa5;                                         // 写触发命令 (0xa5)
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        dat = IAP_DATA;                                         // 读 IAP 数据
        IapIdle();                                                                 // 关闭 IAP 功能

        return dat;
}
void IapProgram(unsigned int addr, char dat)
{
        IAP_CONTR = 0x80;                                 // 使能 IAP
        IAP_TPS = 12;                                                 // 设置等待参数 12MHz
        IAP_CMD = 2;                                                        // 设置 IAP 写命令
        IAP_ADDRL = addr;                                 // 设置 IAP 低地址
        IAP_ADDRH = addr >> 8;                 // 设置 IAP 高地址

        IAP_DATA = dat;                                         // 写 IAP 数据
        IAP_TRIG = 0x5a;                                         // 写触发命令 (0x5a)
        IAP_TRIG = 0xa5;                                         // 写触发命令 (0xa5)
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        IapIdle();                                                                // 关闭 IAP 功能

}
void IapErase(unsigned int addr)
{
       
        IAP_CONTR = 0x80;                                 // 使能 IAP
        IAP_TPS = 12;                                                 // 设置等待参数 12MHz
        IAP_CMD = 3;                                                         // 设置 IAP 擦除命令
        IAP_ADDRL = addr;                                 // 设置 IAP 低地址
        IAP_ADDRH = addr >> 8;                 // 设置 IAP 高地址

        IAP_TRIG = 0x5a;                                         // 写触发命令 (0x5a)
        IAP_TRIG = 0xa5;                                         // 写触发命令 (0xa5)
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        IapIdle();                                                                 // 关闭 IAP 功能

}


void INT4_Isr(void) interrupt 16
{
IAP_CONTR=0x60;                       
}

void delayms(u16 ms)
        {u16 i;
        do{
                i = MAIN_Fosc /10000;
                while(--i);
        }                while(--ms);
}
       




vb2002 发表于 2024-8-1 22:04:12

wnagming 发表于 2024-8-1 21:28
我一般是哪个完整的代码删减,删到程序现象出异常为止,就找到可用代码的精简版了 ...


现在可以把串口助手调通了.
问题出在波特率,默认是9600
我改成115200就好了
现在慢慢吃读取,写入.


vb2002 发表于 2024-8-1 23:15:51

又搞了点东西出来了.
现在每次断电,再打开,可以自动加1 了

lezjin 发表于 2024-8-2 08:00:47

很厉害

小坤 发表于 2024-8-2 08:46:02

lezjin 发表于 2024-8-2 08:00
很厉害

都是这么过来的,慢慢摸索吧

乘风飞扬 发表于 2024-8-2 09:04:41

烧录时的IRC频率设置需要跟程序里面定义从时钟参数一致才能正常工作,串口波特率参数也可以在定义里面修改
页: [1]
查看完整版本: 这eeprom看不见,摸不着,好难哦,不像pwm那样可以看见调试