#include <reg52.h>
#include <math.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
#define LED_PORT P2
sbit LSA=P2^2; //定义位选端口
sbit LSB=P2^3; //同上
sbit LSC=P2^4; //同上
sbit wela=P2^7;
//定义独立按键K4控制脚
sbit KEY4=P3^3;
sbit KEY3=P3^2;
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x39,0x5e,0x79,0x71};//数组
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//目标:先亮0123456,再亮最后一位//
void smg_display(void)
{
u8 i=0;
u8 j=0;
for(i=0;i<7;i++)
{
switch(i)
{
case 0: LSC=1;LSB=1;LSA=1;break;
case 1: LSC=1;LSB=1;LSA=0;break;
case 2: LSC=1;LSB=0;LSA=1;break;
case 3: LSC=1;LSB=0;LSA=0;break;
case 4: LSC=0;LSB=1;LSA=1;break;
case 5: LSC=0;LSB=1;LSA=0;break;
case 6: LSC=0;LSB=0;LSA=1;break;
case 7: LSC=0;LSB=0;LSA=1;
for(j=0;j<10;j++)
{
SMG_A_DP_PORT=gsmg_code[j];
delay_10us(640000);
}
}
SMG_A_DP_PORT=gsmg_code[i];
delay_10us(100);
SMG_A_DP_PORT=0x00;
}
}
void LED()
{
u8 i=0;
SMG_A_DP_PORT=0x00; //消除开始时的数码管的显示
for(i=0;i<7;i++)
{
LED_PORT=0xfe<<i;
delay_10us(640000);
}
for(i=0;i<8;i++)
{
LED_PORT=~(0xff>>i);
delay_10us(640000);
}
LED_PORT=0xff;
delay_10us(640000);
}
void exti1_init(void)
{
IT1=1;//跳变沿触发方式(下降沿)
EX1=1;//打开INT1的中断允许
EA=1;//打开总中断
}
void exti0_init(void)
{
IT0=1;//跳变沿触发方式(下降沿)
EX0=1;//打开INT0()的中断允许
EA=1;//打开总中断
}
void main()
{
exti1_init();//外部中断1配置
exti0_init();
while(1)
{
smg_display();
LED();
}
}
void INT_1() interrupt 2 //外部中断1中断函数
{
while(1)
{
delay_10us(10);
if(KEY3==0)
{
KEY3=!KEY3;
}
else
if(KEY4==0)
{
break;
}
}
}