第十一集
实验箱原理图
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;
}
}
}
第十二集
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);
}
}
十三集
中断控制器有以下中断 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;
}
}
十四集
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]