public.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "public.h"
  2. __near_func __interrupt void t3_irq(void);
  3. __near_func __interrupt void t4_irq(void);
  4. __near_func __interrupt void P1INT_Exti_ISR(void);
  5. //32MHZ us延时函数;
  6. #pragma optimize=none
  7. void system_delay_us(unsigned int n)
  8. {
  9. n>>=1;
  10. while(n--)
  11. {
  12. asm("NOP");
  13. asm("NOP");
  14. asm("NOP");
  15. asm("NOP");
  16. asm("NOP");
  17. asm("NOP");
  18. asm("NOP");
  19. asm("NOP");
  20. asm("NOP");
  21. asm("NOP");
  22. asm("NOP");
  23. asm("NOP");
  24. asm("NOP");
  25. asm("NOP");
  26. asm("NOP");
  27. }
  28. }
  29. /****************************************************************************
  30. * 名 称: InitTimer3()
  31. * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
  32. * 入口参数: 无
  33. * 出口参数: 无
  34. ****************************************************************************/
  35. void InitTimer3(void)
  36. {
  37. T3IE = 1; //开总中断和T3中断
  38. //T3CTL (0xCB)–定时器 3 控制 bit7:5 -->111: 标记频率/128
  39. T3CTL |= 0xE0; //128分频,F=16M/128=125000HZ T=1/F=8us 计数一次8us 计满溢出
  40. T3CTL |= 0x08 ; //开溢出中断 bit3 溢出中断屏蔽 0:中断禁止 1:中断使能
  41. // T3CTL &= ~0x03; // 自动重装 00->0xff bit1:0--->00: 自由运行,从0x00到0xFF反复计数
  42. T3CTL &= ~0x01; // //设置为 模模式 从0x00到T3CC0重复计数 bit1:0 -->10
  43. T3CC0 = 250; //设置最大计数值 这里设置250 2ms触发一次中断
  44. T3CCTL0 = 0x04;// bit2 选择定时器3通道0捕获或者比较模式 比较模式
  45. T3CTL |= 0x10; // bit4 启动定时器。正常运行时设置,暂停时清除
  46. //T3CTL bit2 清除计数器。写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。总是读作0。
  47. EA = 1; //开总中断
  48. //T3CNT (0xEA) – 定时器 3 计数器 定时器计数字节。包括8位计数器当前值。
  49. P1DIR=0xff;
  50. }
  51. /****************************/
  52. //定时器3中断函数
  53. /****************************/
  54. #pragma vector=T3_VECTOR
  55. __near_func __interrupt void t3_irq(void)
  56. {
  57. //T3STAT &= ~0x01;
  58. IRCON &= ~0x04; //T3IF clear //清除定时器3通道0中断标志
  59. }
  60. /****************************************************************************
  61. * 名 称: InitTimer4()
  62. * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
  63. * 入口参数: 无
  64. * 出口参数: 无
  65. ****************************************************************************/
  66. void InitTimer4(void)
  67. {
  68. T4IE = 1; //开总中断和T4中断
  69. //T3CTL (0xCB)–定时器 3 控制 bit7:5 -->111: 标记频率/128
  70. T4CTL |= 0xE0; //128分频,F=16M/128=125000HZ T=1/F=8us 计数一次8us 计满溢出
  71. T4CTL |= 0x08 ; //开溢出中断 bit3 溢出中断屏蔽 0:中断禁止 1:中断使能
  72. // T3CTL &= ~0x03; // 自动重装 00->0xff bit1:0--->00: 自由运行,从0x00到0xFF反复计数
  73. T4CTL &= ~0x01; // //设置为 模模式 从0x00到T4CC0重复计数 bit1:0 -->10
  74. T4CC0 = 250; //设置最大计数值 这里设置250 2ms触发一次中断
  75. T4CCTL0 = 0x04;// bit2 选择定时器3通道0捕获或者比较模式 比较模式
  76. T4CTL |= 0x10; // bit4 启动定时器。正常运行时设置,暂停时清除
  77. //T3CTL bit2 清除计数器。写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。总是读作0。
  78. EA = 1; //开总中断
  79. //T3CNT (0xEA) – 定时器 3 计数器 定时器计数字节。包括8位计数器当前值。
  80. }
  81. /****************************/
  82. //定时器4中断函数
  83. /****************************/
  84. #pragma vector=T4_VECTOR
  85. __near_func __interrupt void t4_irq(void)
  86. {
  87. //T3STAT &= ~0x01;
  88. IRCON &= ~0x08; //T4IF clear //清除定时器4通道0中断标志
  89. static int cnt=0;
  90. if(++cnt>500)
  91. {
  92. cnt=0;
  93. P1^=0xff;
  94. }
  95. }
  96. /*===============P1端口外部中断初始化函数==================*/
  97. void Init_P1Prot_Exti(void)
  98. {
  99. IEN2 |= 0x10; //端口1中断使能
  100. P1IEN |= 0x04; //端口P1_2外部中断使能 端口P1.7到P1.0中断使能
  101. PICTL |= 0x02; //端口P1_0到P1_3下降沿触发 3到0输入模式下的中断配置。该位为所有端口1的输入选择中断请求条件0: 输入的上升沿引起中断1: 输入的下降沿引起中断
  102. EA = 1; //使能总中断
  103. }
  104. /*================外部中断1服务函数====================*/
  105. #pragma vector = P1INT_VECTOR //外部中断1的向量入口
  106. __near_func __interrupt void P1INT_Exti_ISR(void)
  107. {
  108. /*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
  109. P1IFG &= ~ 0x04; //软件清除P1_2引脚的标志位
  110. P1IF = 0; //软件清除P1端口组的标志位
  111. }