- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2024-03-21 12:06:51
新手上路
- 积分
- 48
|
#include "stc8a8k64d4.h"
#define MAIN_Fosc 45000000 //定义主时钟
#define Timer0_Reload (MAIN_Fosc / 1000) //Timer 0 中断频率, 1000次/秒
#define BacklightDelayDefaultValue 10
#define LCD_LED P50
int time1s = 0;
int BacklightDelay;
//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-3-9
// 备注:
//========================================================================
void delay1ms(u16 ms)
{
u16 i;
do
{
i = MAIN_Fosc / 10000;
while(--i); //10T per loop
}
while(--ms);
}
void GPIO_Init()
{
LCD_LED = 0;
P0M0 = 0x80;
P0M1 = 0x66; //P01、P02、P05、P06模拟输入 P07推挽输出
P1M0 = 0x01;
P1M1 = 0x08; //P13模拟输入 P10推挽输出
P2M1 = 0x00;
P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00;
P3M0 = 0x00; //设置为准双向口
P4M0 = 0x00;
P4M1 = 0x00; //P43推挽输出
P5M0 = 0x01;
P5M1 = 0x00; //P50推挽输出,设置为准双向口
P6M1 = 0x00;
P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00;
P7M0 = 0x00; //设置为准双向口
}
//========================================================================
// 函数: void Timer0_init(void)
// 描述: timer0初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer0_init(void)
{
TR0 = 0; //停止计数
#if (Timer0_Reload < 64) // 如果用户设置值不合适, 则不启动定时器
#error "Timer0设置的中断过快!"
#elif ((Timer0_Reload/12) < 65536UL) // 如果用户设置值不合适, 则不启动定时器
ET0 = 1; //允许中断
// PT0 = 1; //高优先级中断
TMOD &= ~0x03;
TMOD |= 0; //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
// TMOD |= 0x04; //对外计数或分频
TMOD &= ~0x04; //定时
// INT_CLKO |= 0x01; //输出时钟
INTCLKO &= ~0x01; //不输出时钟
#if (Timer0_Reload < 65536UL)
AUXR |= 0x80; //1T mode
TH0 = (u8)((65536UL - Timer0_Reload) / 256);
TL0 = (u8)((65536UL - Timer0_Reload) % 256);
#else
AUXR &= ~0x80; //12T mode
TH0 = (u8)((65536UL - Timer0_Reload / 12) / 256);
TL0 = (u8)((65536UL - Timer0_Reload / 12) % 256);
#endif
TR0 = 1; //开始运行
EA =1;
#else
#error "Timer0设置的中断过慢!"
#endif
}
//========================================================================
// 函数: void SetWakeUpTime(u16 SetTime)
// 描述: 唤醒定时器设置时间值函数。
// 参数: SetTime: 要设置的时间值(睡眠的时间), 单位为ms.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-7-15
// 备注:
//========================================================================
void SetWakeUpTime(u16 SetTime)
{
if(SetTime >= 16000) SetTime = 15999; //限制最大值
SetTime = (u16)(((u32)SetTime * 32768) / 16000); //重装值 = Fwkt/16 * SetTime/1000 = Fwkt * SetTime / 16000
if(SetTime > 0) SetTime--;
WKTCL = (u8)SetTime;
WKTCH = (u8)(SetTime >> 8) | 0x80;
}
/******************** 主函数 **************************/
void main(void)
{
GPIO_Init();
BacklightDelay = BacklightDelayDefaultValue;
Timer0_init();
LCD_LED = 1;;//点亮背光
while(1)
{
if(BacklightDelay)
{
if(!LCD_LED)
{
LCD_LED = 1;
}
}
else
{
if(LCD_LED)
{
LCD_LED = 0;
}
SetWakeUpTime(10000); //时间值 ms, 小于16000
while(!P32); //等待外中断为高电平
delay1ms(10); //delay 10ms
IE0 = 0; //外中断0标志位
IT0 = 1; //INT0 下降沿中断
EX0 = 1; //INT0 Enable
EA = 1; //Enable all interrupt
PCON |= 0x02; //Sleep
_nop_();
_nop_();
_nop_();
_nop_();
EX0 = 0; //INT0 Disable
BacklightDelay = BacklightDelayDefaultValue;
}
}
}
/********************* INT0中断函数 *************************/
void INT0_int (void) interrupt 0 //进中断时已经清除标志
{
}
//========================================================================
// 函数: void timer0_int (void) interrupt TIMER0_VECTOR
// 描述: timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer0_int(void) interrupt 1
{
time1s++;
if (time1s>=1000)
{
time1s=0;
if(BacklightDelay)
BacklightDelay--;
}
}
|
|