这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);
}
wnagming 发表于 2024-8-1 21:28
我一般是哪个完整的代码删减,删到程序现象出异常为止,就找到可用代码的精简版了 ...
现在可以把串口助手调通了.
问题出在波特率,默认是9600
我改成115200就好了
现在慢慢吃读取,写入.
又搞了点东西出来了.
现在每次断电,再打开,可以自动加1 了
很厉害 lezjin 发表于 2024-8-2 08:00
很厉害
都是这么过来的,慢慢摸索吧 烧录时的IRC频率设置需要跟程序里面定义从时钟参数一致才能正常工作,串口波特率参数也可以在定义里面修改
页:
[1]