楼主说的问题根本不存在,是楼主没有设置好PCON寄存器。这是用STC8H3K48S2在官方例程基础上改写的测试程序,唤醒后的num值就是休眠前的值。
- #include <STC8H.H>
- #include "intrins.h"
- #define IDL 0x01 //PCON.0
- #define PD 0x02 //PCON.1
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uchar data dis_buf[8];
- uchar i;
- uint j;
- uint num=9990;
- void Delay1ms(void) //@11.0592MHz
- {
- unsigned char data i, j;
- i = 15;
- j = 90;
- do
- {
- while (--j);
- } while (--i);
- }
- void main()
- {
- P0M0 = 0x00;
- P0M1 = 0x00;
- P1M0 = 0x00;
- P1M1 = 0x00;
- P2M0 = 0x00;
- P2M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P4M0 = 0x00;
- P4M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00;
-
- EX0 = 1; //使能INT0中断,用于唤醒MCU
- EA = 1;
- while (1)
- {
- dis_buf[0]=table[num/1000%10];
- dis_buf[1]=table[num/100%10];
- dis_buf[2]=table[num/10%10];
- dis_buf[3]=table[num%10];
- P0=0x00;
- P2&=0xf0;
- P2|=~(0x01<<i);
- P0=dis_buf[i];
- i=++i%4;
- if(++j>=1000)
- {
- j=0;
- if(++num>9999)num=0;
- }
- if(!P33)//key
- {
- P0=0xff;
- P2=0xff;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- // PCON = IDL; //MCU进入IDLE模式
- PCON = PD; //MCU进入掉电模式
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- Delay1ms();
- }
- }
- void INT0_Isr() interrupt 0//P3.2
- {
- // 外部中断唤醒 //测试端口
- }
复制代码 |