迪文科技论坛

 找回密码
 立即注册
搜索
查看: 248|回复: 5

【提问】Read_Dgusii_Vp和Write_Dgusii_Vp_byChar函数在主循环中失效

[复制链接]

1

主题

19

回帖

344

积分

中级会员

Rank: 3Rank: 3

积分
344
发表于 2024-8-8 09:57:07 | 显示全部楼层 |阅读模式
这里通过两个按键返回控件,主要的功能是设置好倒计时以后,通过保存按键,来开启定时器1中断进行倒计时,在倒计时的过程中也可以通过取消按键,来终止倒计时同时停止中断。经过测试以后,发现一个问题,开始倒计时以后,点击取消按钮却不管用,但是倒计时计数还会继续更新,但是主循环里面却读取不到键值,从而无法取消。


void Read_Dgusii_Vp(unsigned int addr,unsigned char *buf,unsigned int len){
        
        unsigned char i;
        
        EA = 0;
        i = (unsigned char)(addr & 0x01);
        addr = addr / 2;
        ADR_H = 0x00;
        ADR_M = (unsigned char)(addr >> 8);
        ADR_L = (unsigned char)(addr);
        ADR_INC = 0x01;
        RAMMODE = 0xAF;
        while(APP_ACK == 0);
        while(len > 0){
                APP_EN = 1;
                while(APP_EN == 1);
                if((i==0)&&(len>0)){
                        *buf++ = DATA3;
                        *buf++ = DATA2;
                        i = 1;
                        len--;
                }
                if((i == 1) && (len > 0)){
                        *buf++ = DATA1;
                        *buf++ = DATA0;
                        i = 0;
                        len--;
                }
        }
        EA = 1;
        RAMMODE=0x00;
}

void Write_Dgusii_Vp_byChar(unsigned int addr,unsigned char *buf,unsigned int len){
        unsigned char i;
//        bit EA_Bak;
//        EA_Bak = EA;
        EA = 0;
        i = (unsigned char)(addr & 0x01);
        addr = addr / 2;
        ADR_H = 0x00;
        ADR_M = (unsigned char)(addr >> 8);
        ADR_L = (unsigned char)(addr);
        ADR_INC = 0x01;
        RAMMODE = 0x8F;
        while(APP_ACK == 0);
        if(i && len > 0){
                if(len == 1){
                        RAMMODE = 0x82;
                        DATA1 = *buf++;
                        APP_EN = 1;
                        while(APP_EN == 1);
                        len--;
                } else {
                        RAMMODE = 0x83;
                        DATA1 = *buf++;
                        DATA0 = *buf++;
                        APP_EN = 1;
                        while(APP_EN == 1);
                        len -= 2;
                }
        }
        RAMMODE = 0x8F;
        while(len >= 4){
                DATA3 = *buf++;
                DATA2 = *buf++;
                DATA1 = *buf++;
                DATA0 = *buf++;
                APP_EN = 1;
                while(APP_EN == 1);
                len -= 4;
        }
        
        if(len == 3){
                RAMMODE = 0x8E;
                DATA3 = *buf++;
                DATA2 = *buf++;
                DATA1 = *buf++;
                APP_EN = 1;
                while(APP_EN == 1);
        } else if(len == 2){
                RAMMODE = 0x8C;
                DATA3 =* buf++;
                DATA2 =* buf++;
                APP_EN = 1;
                while(APP_EN == 1);
        } else if(len == 1){
                RAMMODE = 0x88;
                DATA3 = *buf++;
                APP_EN = 1;
                while(APP_EN == 1);
        }
        RAMMODE = 0x00;
        EA = 1;
}
u8 zero[2] = {0x00,0x00};




void  CheckCancelButtonPressed(void)//检测取消按钮
{        
                u8 buf[2];
        u16 value;
         
                Read_Dgusii_Vp(0x2038,buf,2);
               
                value =  (buf[0] << 8) | buf[1];
        
                if(value == 1)
                {
                        Write_Dgusii_Vp_byChar(0x2038,zero,2);
                        Write_Dgusii_Vp_byChar(0x1094,zero,2);
                        Write_Dgusii_Vp_byChar(0x1096,zero,2);
                        Write_Dgusii_Vp_byChar(0x2036,zero,2);                        
                        page_change(66);
                        TR1 = 0; // 停止定时器
                        TR0 = 1;
      initialized = 0; // 重置初始化标志
                        EA = 1;
                }
               
}
void ClockDownSetComplete(void)//检测保存按钮
{
                u8 buf[2];
                u16 value;
                Read_Dgusii_Vp(0x2034,buf,2);
                value = (buf[0] << 8) | buf[1];
                if(value == 1)
                {
                        
                        TR1 = 1;
                        TR0 = 0;
                        Write_Dgusii_Vp_byChar(0x2034,zero,2);
               
                }
        
}
        while(1)
        {
               
                Uart_Handle_all();
               Read_0xF00();//数据自动上传
                Clock();
                                       
                CheckCancelButtonPressed();
                ClockDownSetComplete();

                data_change_sava();//数据改变自动保存
                        
        }






求大佬帮忙看看




回复

使用道具 举报

1

主题

19

回帖

344

积分

中级会员

Rank: 3Rank: 3

积分
344
 楼主| 发表于 2024-8-8 09:59:03 | 显示全部楼层
这里是中断1
void T1_ISR_PC(void) interrupt 3 {
    static u16 hours, minutes, seconds;
                static u16 ms_count = 0;
       
        EA = 0;

                                TH1 = T1MS >> 8;
                                TL1 = T1MS;
       
                ms_count++;
       
        if (ms_count >= 1000) { // 每1000ms更新一次
        ms_count = 0;

    if (!initialized) {
        ReadCountdownTime(&hours, &minutes, &seconds);
        initialized = 1;
    }

    if (seconds >0) {
        seconds--;
    } else {
        if (minutes > 0) {
            minutes--;
            seconds = 59;
        } else {
            if (hours > 0) {
                hours--;
                minutes = 59;
                seconds = 59;
            } else {
                // 倒计时结束,更新显示并发送开机命令
                                                          page_change(66);
                UpdateCountdownTime(0, 0, 0);
                //SendPowerOnCommand();
                                                                TR1 = 0;
                                                                TR0 = 1;
                initialized = 0; // 重新初始化
                                                       
                                                                EA = 1;
                return;
            }
        }
    }

    // 更新显示
    UpdateCountdownTime(hours, minutes, seconds);
                                       
}

EA = 1;
}
下面是时间更新函数
void ReadCountdownTime( u16 *hours,u16 *minutes,u16 *seconds)
{
                        u8 buf[2];
                               
            Write_Dgusii_Vp_byChar(0x2036,zero,2);
                        Read_Dgusii_Vp(0x1094,buf,2);//读取小时
                        *hours = (buf[0] << 8 | buf[1]);
       
                        Read_Dgusii_Vp(0x1096,buf,2);//读取分钟
                        *minutes = (buf[0] << 8 | buf[1]);

       
                        Read_Dgusii_Vp(0x2036,buf,2);//读取秒
                        *seconds = (buf[0] << 8 | buf[1]);       
}



void UpdateCountdownTime(u16 hours,u16 minutes,u16 seconds)
{
                        u8 buffer[2] ;
                       
                        buffer[0] = hours>>8;
                        buffer[1] = hours&0xFF;
                        Write_Dgusii_Vp_byChar(0x1094,buffer,2);//更新小时
       
                        buffer[0] = minutes>>8;       
                        buffer[1] = minutes&0xFF;
                        Write_Dgusii_Vp_byChar(0x1096,buffer,2);//更新分钟
                       
                        buffer[0] = seconds>>8;
                        buffer[1] = seconds&0xFF;
                        Write_Dgusii_Vp_byChar(0x2036,buffer,2);//更新秒
}
回复

使用道具 举报

0

主题

12

回帖

65

积分

注册会员

Rank: 2

积分
65
发表于 2024-8-8 10:38:38 | 显示全部楼层
void  CheckCancelButtonPressed(void)//检测取消按钮
{        
                u8 buf[2];
        u16 value;
         
                Read_Dgusii_Vp(0x2038,buf,2);

//buf只有两个字节,这个读函数是读两个字长度,后面的zero数组是同样的道理
回复

使用道具 举报

1

主题

19

回帖

344

积分

中级会员

Rank: 3Rank: 3

积分
344
 楼主| 发表于 2024-8-8 10:40:58 | 显示全部楼层
Rye4869cjxy 发表于 2024-8-8 10:38
void  CheckCancelButtonPressed(void)//检测取消按钮
{        
                u8 buf[2];

感谢大佬,这个应该时用u16对吧
回复

使用道具 举报

0

主题

12

回帖

65

积分

注册会员

Rank: 2

积分
65
发表于 2024-8-8 10:56:54 | 显示全部楼层
是的,加微沟通吧
回复

使用道具 举报

5

主题

37

回帖

182

积分

注册会员

Rank: 2

积分
182
发表于 2024-8-8 21:19:39 | 显示全部楼层
void Write_Dgusii_Vp_byChar(unsigned int addr,unsigned char *buf,unsigned int len)

if(len == 1){
                        RAMMODE = 0x82; //改为RAMMODE = 0x81;
                        DATA1 = *buf++;  //改为 DATA0 = *buf++;
                        APP_EN = 1;
                        while(APP_EN == 1);
                        len--;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 10:04 , Processed in 0.085298 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表