【实验】按键控制LED流水灯模式&定时器时钟

  1. 控制寄存器TCON(可位寻址)

  1. 工作模式寄存器TMOD(不可位寻址)

按键控制LED流水灯模式

需要模块化代码:Delay.c和.h、key.c和.h、Timer0.c和.h、

#include<REGX52.H>
#include“Timer0.h”
#include“Delay.h”
#include“Key.h”

unsigned char LEDMode,KeyNum;

//Timer0可以编程模块化代码。定时器0初始化
void Timer0_Init(){
    //TMOD = 0x01; //不可位寻址,整体寻址。0000 0001 定时器0的模式1
    //TMOD = 0x01;会把高四位,也就是定时器1清零。
    TMOD&=0xF0;//把TMOD低四位清零,高四位保持不变
    TMOD|=0x01;//把TMOD的最低位置1,高四位保持不变
    TF0 = 0;//位寻址。1产生中断,0不产生中断。一开始不需要中断 
    TR0 = 1;//位寻址,定时器T0的运行控制位,TR0=1允许计数。计数器从0-65535us
    //IE0和IT0先不用配置
    //每隔1us加1,64535离溢出还有1000us,也就是1ms

    //TL0和TH0如果这样计算会有1ms的差别,可以去STC软件里面取配置
    TH0 = 64535/256; //高8位
    TL0 = 64535%255;  //低8位
    ET0 = 1;
    TF0 = 1;
    PT0 = 0;
    
}

void main()
{
    P2=0xFE;
    Timer_Init();
    while(1)
    {
        KeyNum=Key();
        if(KeyNum)
        {
            if(KeyNum==1)
            {
                LEDMode++;  //LED 一直是0101变化
                if(LEDMode>=2)LEDMode=0;
            }
        }

    }

}

//本来程序在while中执行,过了1ms中断过来就执行中断函数,然后在调回主程序中

//定时器中断模板。这部分不易于模块化,但是可以复制到定时器模块化文件中注释掉以便需要时直接赋值。
void Timer0_Runtime(void) interrupt 1{
    static unsigned int T0Count;
    //中断执行一次之后,TH0和TL0变成0,将会65ms中断,需要重新赋值
    TH0 = 64535/256; //高8位
    TL0 = 64535%255;  //低8位
    T0Count++;
    if(T0Count>=1000)
    {
        T0Count = 0;
        //P2_0 = ~P2_0;
        if(LEDMode==0)
            P2 = _crol_(P2,1);  //左移
        if(LEDMode==1)
            P2 = _cror_(P2,1); //右移
    }
    


}

定时器时钟

需要模块化代码:LCD1602、Delay、Timer0、

#include

unsigned char Sec,Min,Hour;

void main()
{
    LCD_init();
    Timer0Init();

    LCD_ShowString(1,1,"Clock:");
    LCD_ShowString(2,1,"  :  :  ");

    while(1)
    {
        LED_ShowNum(2,1,Hour,2);
        LED_ShowNum(2,2,Min,2);
        LED_ShowNum(2,7,Sec,2);
        
    }
}

void Timer0_Runtime(void) interrupt 1{
    static unsigned int T0Count;
    //中断执行一次之后,TH0和TL0变成0,将会65ms中断,需要重新赋值
    TH0 = 64535/256; //高8位
    TL0 = 64535%255;  //低8位
    T0Count++;
    Sec++;

    if(Sec>=60)
    {
        Sec=0;
        Min++;
        if(Min>=60)
        {
            Min=0;
            Hour++;
            if(Hour>=24)
            {
                Hour=0;
            }
        }
    }
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码字神经元

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值