使用 IAR for 51 實(shí)驗(yàn) LED 燈模擬二進(jìn)制加減法
/*
********************************************************
* 第一次使用 IAR 來(lái)搞 51 的程序, 用起來(lái)蛋疼, 搞了一晚上,
* 居然和 Keil 差別挺大. 看來(lái)要慢慢熟悉, 多看文檔和手冊(cè).
* 多使用這些工具, 對(duì)比才能知道不同, 學(xué)習(xí)起來(lái)有意思啊!
* 2012.5.28 proteus 仿真, LED 模擬加減法運(yùn)算. IAR 環(huán)境的
* 一些寄存器定義和聲明看頭文件就知道. 多數(shù)都是以聯(lián)合體中
* 包含位字段形式和 8 位數(shù)據(jù)格式的寄存器名給出. 使用時(shí)要
* 看頭文件.
*********************************************************
*/
#include
#include
/* 自定義變量別名 */
typedef unsigned int INT16U;
typedef signed int INT16S;
typedef unsigned char INT8U;
volatile INT16S ticks = 0xFF; /* 加法運(yùn)算 LED 顯示 */
volatile INT8U second = 0; /* 1s 計(jì)時(shí) */
/*
** 主函數(shù)
*/
int main( void )
{
/* setup timer 0 */
TCON_bit.TF0 = 0;
TCON_bit.TR0 = 1; /* 啟動(dòng)定時(shí)器 0 */
P0 = 0xFF; /* 開(kāi)始時(shí) 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"); /* 嵌入?yún)R編語(yǔ)句 NOP 指令 */
}
}
/*
* 定時(shí)器 0 中斷
* Timer interrupt service routine
*/
#pragma vector = TF0_int
__interrupt void my_Timer1_ISR(void)
{
TCON_bit.TF0 = 0; /* 清零溢出標(biāo)志位, 為下次準(zhǔn)備 */
if (second++ > 10) {
second = 0;
--ticks;
P0 = ticks;
}
if (ticks < 0) { /* 減到 0 即全亮?xí)r, 從新開(kāi)始 */
ticks = 0xFF;
}
}