yjdmwjmi 发表于 2025-3-29 16:52:57

第十一集



实验箱原理图
P06P07检测行;P00P01P02P03检测4列;
当没有按键按下时P06P07为高电平把列设成低电平,当按下时按下的行为低电平。
扫描P06P07的低电平表示列按下。假设是P07为0就将P07设为0同时列设为高在扫描4列哪一个为0就是列按下在将行和列结合判断便可判断第几个按下
int key;
void le_low()
{
    P00=P01=P02=P03=0;
}

void hang_low()
{
    P06=P07=0;
}

void read_hang()
{
    if(P06==0)
    {delay_10ms();
         if(P06==0)
          {
               key|=0x10;
          }
    }
   if(P07==0)
    {delay_10ms();
         if(P02==0)
          {
               key|=0x20;
          }
    }
}


void read_le()
{
    if(P00==0)
    {delay_10ms();
         if(P00==0)
          {
               key|=0x01;
          }
    }
   if(P01==0)
    {delay_10ms();
         if(P01==0)
          {
               key|=0x02;
          }
    }
   if(P03==0)
    {delay_10ms();
         if(P03==0)
          {
               key|=0x03;
          }
    }
   if(P04==0)
    {delay_10ms();
         if(P04==0)
          {
               key|=0x04;
          }
    }
}


yjdmwjmi 发表于 2025-3-29 21:42:56

第十二集

WDT_FLAG:看门狗溢出标志发生溢出置一需要软件清零

EN_WDT:看门狗使能位 启动位
CLR_WDT:看门狗定时器清零在溢出时间内要清零否则复位
WDT_PS:看门狗定时器时钟分频系数


软件复位写入0x60可进入下载模式

void main()
{
    P_SW2 |= 0x80;
   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
    P3M0=P3M1=0x00;
    P3M0&=~0x03;
    P3M1|=0x03;
USBCON=0X00;
USBCLK=0X00;
IRC48MCR=0X00;
Delay1000ms();
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_ispcmd("@STCISP#");
    EA = 1;
    USB_SendData("123",3);
//    WDT_CONTR=0x24;
    while (1)
    {
      if(P32==0)
          IAP_CONTR |=0x60;
//          WDT_CONTR=0x34;
      
      if (bUsbOutReady)
      {
            usb_OUT_done();
      }
      
//      USB_SendData("456",3);
    }
}




yjdmwjmi 发表于 2025-3-29 21:56:41

十三集

中断控制器

有以下中断 https://www.stcaimcu.com/data/attachment/forum/202503/26/162106g7l2r233mumzshru.jpg 等 https://www.stcaimcu.com/data/attachment/forum/202503/26/162209luro1epjfecxazbn.jpg 其中中断服务号由高到低0~73
对于开启中断要清除标制位开启允许位然后开启EA=1总中断
https://www.stcaimcu.com/data/attachment/forum/202503/26/163045gzf5ppm5mmnddnvo.jpg 如TF0为定时器0的标志位ET0为其的允许位,PT0,PT0H设置优先级部分中断无法设置中断优先级如INT2为固定0



IT0控制触发电平IE0中断标值位EX0外部中断启动位EA总中断启动位PX
PXH优先级


void Ext_Init(void)
{
        IT0 = 1;                        //INT0(P3.2)下降沿中断
        EX0 = 1;                        //使能INT0中断
}


void main(void)
{

    EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                     //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间
    gpio_Init();
    Ext_Init();


    while(1)                        
    {      
}



void EXIT0_Isr(void) interrupt 0
{
if(a==0)
{
    P22=0;
    a=1;
}
else
{
    P22=1;
    a=0;
}
}









yjdmwjmi 发表于 2025-3-29 22:33:15

十四集

Ai8051U系列支持所有的I/O中断,且支持4种中断模式:下降沿中断、上升沿中断、低电平中断、高电平中断。每组I/O口都有独立的中断入口地址,且每个I/O可独立设置中断模式。但是不支持双边延检测

使能位
标志位需要软件清零配置模式优先级


void io_exint()
{
P32INTF=0;//标准位软件清零
P32IM0=0
P32IM1=0;//下降延
P3IP=3;
P3IPH=3;//优先级

P32INTE=1;//使能
}



void io_ex(void) interrupt 40
{
if(P32INTF==1)
{
    P32INTF=0;
    P0=!P0;
}
}


页: 1 [2]
查看完整版本: 第一集