锁存器
蓝桥杯的锁存器可以直接背,这里就不再赘述
数码管的基本原理
共阳数码管:将所有发光二极管的阳极接到一起形成公共阳极的数码管,且公共极接VCC
共阴数码管:将所有发光二极管的阴极接到一起形成公共阴极的数码管,且公共极接GND
简单来说,共阳数码管低电平点亮,共阴数码管高电平点亮
蓝桥杯开发板上使用的是共阳数码管。例如,将第一个数码管的位置点亮,并显示位数字0,则需要给P0口赋值的16进制位0xc0(~0x3f)
dp g f e d c b a 1 1 0 0 0 0 0 0
使用STC-ISP辅助写共阴数码管的段码和位码
// 前面记得定义类型
typedef unsigned char u8;
typedef unsigned int u16; /************* 本地常量声明 **************/
u8 code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e, 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1 u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码 使用延时函数显示静态数码管
只需要在main函数的while(1)当中调用如下函数,注意x需要定义在全局变量的位置
u8 x;
void SmgUseDelay()
{ P2=0xc0;P0=0x00;P2=0x00; P2=0xe0;P0=~t_display[x];P2=0x00; P2=0xc0;P0=T_COM[x];P2=0x00; x++; if (x == 8) x = 0 ; Delay2ms();
}
定时器的基本原理
使用STC-ISP生成定时器
void Timer0Init(void) //100微秒@11.0592MHz
{ AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0xAE; //设置定时初值 TH0 = 0xFB; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 // 下面需要自己加上 ET0 = 1; // 打开定时器0中断 EA = 1; // 打开总中断
}
定时器方法显示静态数码管
静态变量(static )属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束。
全局变量全都是静态变量,局部变量加上关键字static后才是静态变量。
如下为定时器0的中断服务函数,当定时器0触发后,CPU会执行中断服务函数下面的程序
void timer0() interrupt 1 using 1 //中断号 和 寄存器
{ static int smg_cnt = 0, i = 0; smg_cnt ++ ; if (smg_cnt == 2) { smg_cnt = 0; P2=0xc0;P0=0x00;P2=0x00; P2=0xe0;P0=~t_display[i];P2=0x00; P2=0xc0;P0=T_COM[i];P2=0x00; i++; if (i == 8) i = 0 ; }
} 外部中断
外部中断无法用STC-ISP生成,需要手动配置。当然不会配置的同学也可以参考STC-ISP软件中的范例程序。
外部中断配置的函数如下,同时初始化外部中断0和外部中断1
void Int_init(void)
{ IT0 = 1;//配置成下降沿触发 EX0 = 1;//配置外中断0使能 IT1 = 1;//配置成下降沿触发 EX1 = 1;//配置外中断1使能 EA = 1;//打开总中断 }
外部中断0的上升沿和下降沿标志位是INT0,可以通过改变P32口的电平来触发,蓝桥杯板子上P32口连接按键S5.