#include <atmelAT89X52.H> #include <stdio.h>
#define T0_LOW 0x3A #define T0_HIGH 0xFE
idata led_coder[10] = {0xbf,0x8c,0xdb,0xde,0xec,0xf6,0xf7,0x9c,0xff,0xfe}; unsigned char led_bit = 0;
void led_disp(void) { switch(led_bit) { case 0: P2 = 0xff; P1 = led_coder[0]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x0;
break; case 1: P2 = 0xff; P1 = led_coder[1]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x1; break; case 2: P2 = 0xff; P1 = led_coder[2]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x2; break; case 3: P2 = 0xff; P1 = led_coder[3]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x3; break; case 4: P2 = 0xff; P1 = led_coder[4]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x4; break; case 5: P2 = 0xff; P1 = led_coder[5]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x5; break; case 6: P2 = 0xff; P1 = led_coder[6]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x6; break; case 7: P2 = 0xff; P1 = led_coder[7]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x7; break; case 8: P2 = 0xff; P1 = led_coder[8]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x8; break; case 9: P2 = 0xff; P1 = led_coder[9]; P1_7 = 0; P2 = 0xff; P1_7 = 1; P2 = 0x9; break; default: break;
} if(led_bit == 9) led_bit = 0; else led_bit++; }
void ISRTimer0() interrupt 1 { TL0 = T0_LOW; TH0 = T0_HIGH; led_disp(); }
void InitCPU(void) { IP = 0x0;//-- PS1 PT2 PS0 PT1 PX1 PT0 PX0 //PT2 定时器2 中断优先级 //PS 串行通信中断优先级 //PT1 定时器1 中断优先级 //PX1 外部中断1 优先级 //PT0 定时器0 中断优先级 //PX0 外部中断0 优先级 // 中断优先级为外部中断0最高,其次外部中断1,其次定时器0,串口中断 IE = 0x82; //0 外部中断0 1 定时器0 溢出 2 外部中断1 3 定时器1 溢出 4 串行口中断 5 定时器2 溢出 // EA=0,中断关闭 EA ES1 ET2 ES ET1 EX1 ET0 EX0 // ET1=0,允许定时中断1 // EX0=1,允许外中断0 // EX1=0,不允许外中断1 // ET0=1,允许定时中断0 // ES=1,允许串口中断 TMOD = 0x10; // 定时器0,采用方式1,16位计数 // GATE=0,由TR0控制 // C/T=0,做为定时器 // (M1,M0)=01,16位定时器 // 定时器1,采用方式1,16位计数 // GATE=0,由TR1控制 // C/T=0,做为定时器 // (M1,M0)=10,8位自动重载定时器 //T0用来做延时,T1用来产生串口通信的波特率。 TL0 = T0_LOW; TH0 = T0_HIGH; TR0 = 1; }
void main(void) { InitCPU(); while(1) { ; } } 我用汇编编写了一段调试程序,已经达到效果,然后我再kile c的环境下编写这段c程序,仿真我都觉得通过了,烧录上去没有任何反应,我查看生成的汇编代码,发现程序代码是从0x4190处开始执行的(定时器0的代码)我很奇怪为什么会这样,朋友们帮我分析下 |