使用 IAR for 51 实验 LED 灯模拟二进制加减法.

/*
********************************************************
* 第一次使用 IAR 来搞 51 的程序, 用起来蛋疼, 搞了一晚上, 
* 居然和 Keil 差别挺大. 看来要慢慢熟悉, 多看文档和手册.
* 多使用这些工具, 对比才能知道不同, 学习起来有意思啊!
* 2012.5.28 proteus 仿真, LED 模拟加减法运算. IAR 环境的
* 一些寄存器定义和声明看头文件就知道. 多数都是以联合体中
* 包含位字段形式和 8 位数据格式的寄存器名给出. 使用时要
* 看头文件.
*********************************************************
*/
#include <ioAT89C52.h>          /* 包含相关头文件 */
#include <intrinsics.h>

/* 自定义变量别名 */
typedef unsigned int  INT16U;   
typedef signed   int  INT16S;
typedef unsigned char INT8U;

volatile INT16S ticks  = 0xFF;  /* 加法运算 LED 显示 */
volatile INT8U  second = 0;     /* 1s 计时           */

/*
** 主函数
*/
int main( void )
{
    /* setup timer 0 */
    TCON_bit.TF0 = 0;
    TCON_bit.TR0 = 1;          /* 启动定时器 0      */
    P0 = 0xFF;                 /* 开始时 LED 全灭   */
    
    /* 16 bit timer mode */
    TMOD_bit.M00 = 1;
    TMOD_bit.M10 = 0;
    
    /*
    * Set the timer with 16 bits. To get a repeat interval of
    * 50000 cycles we loads TH0:TL0 with 0xFFFF - 1 - 50000 = 0x3CAE.
    */
    TL0 = 0x3C;
    TH0 = 0xAE;
    
    IE_bit.ET0 = 1;         /* Enable timer 0 interrupts */
    __enable_interrupt();   /* Enable interrupts         */
    
    for (;;)
    {
        asm("NOP");         /* 嵌入汇编语句 NOP 指令 */
    }
}

/*
* 定时器 0 中断
* Timer interrupt service routine
*/
#pragma vector = TF0_int
__interrupt void my_Timer1_ISR(void)
{
    TCON_bit.TF0 = 0;     /* 清零溢出标志位, 为下次准备 */
    
    if (second++ > 10) { 
        second = 0;
        --ticks;
        P0 = ticks;
    }
    
    if (ticks < 0) {      /* 减到 0 即全亮时, 从新开始 */
        ticks = 0xFF;
    }
}
如有不足或错误请指出, 我改. 先谢谢了!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值