vb2002 发表于 2024-7-11 23:05:34

INT2外部中断
INT2,3,4 只支持下降沿










记得还有中断优先级可以配置,




在stc8g1k08A里面这样写识别不出来
要写INTCLKO = 0x10;
也不可以像EX1那样直接 EX1=1;

vb2002 发表于 2024-7-11 23:07:18

可以让程序在中断里面执行,这样的好处就是可以不占用主循环.
#include "stc8g.h"
#include "intrins.h"

#define MAIN_Fosc 11059200UL

typedef unsigned char u8;
typedef unsigned int u16;

void delayms(u16 ms);

void INT2_Isr() interrupt 10
{
while(1)
{
        P33=0;delayms(500);
        P33=1;delayms(500);
}

}


int main ()
{
       
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;
       
        INTCLKO=0x10;
        AUXINTIF=0x10;
        IE2=0x04;
        EA=1;
        while(1);

}
void delayms(u16 ms)
        {
        u16 i;
        do{
                i = MAIN_Fosc /10000;
                while(--i);
        }while(--ms);
        }

vb2002 发表于 2024-7-15 12:12:14

一直以为keil里面的大括号可以随便敲
现在搞懂了.把{}放整齐点,可以方便找到相应的程序位置.

vb2002 发表于 2024-7-15 14:11:26

C语言基本的语句,必须学明白,不然单片机不好学

vb2002 发表于 2024-7-15 14:12:20

C语言运算表达.一定要学明白.

angmall 发表于 2024-7-15 17:00:38

vb2002 发表于 2024-7-11 23:07
可以让程序在中断里面执行,这样的好处就是可以不占用主循环.

我可以很负责任的告诉你,你掉坑里了

   初学者易犯的错:
中断处理程序执行时间过长!
在此期间其它比此更低级是中断都将无法响应,被执行!

   为什么尽量在单片机中断函数中不要使用延时?
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。

所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。


vb2002 发表于 2024-7-15 18:58:35

angmall 发表于 2024-7-15 17:00
我可以很负责任的告诉你,你掉坑里了

   初学者易犯的错:


芭比Q了.
真掉坑里面了.
我记住您的说的重点.重点,标志位.我见很多大神程序里面都强调标志位.

{中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。}
页: 1 [2]
查看完整版本: 重新再记录一下自己的学习历程吧.