51单片机—按键控制点阵显示
#include""
#include""
#define led P0 //宏定义
typedef unsigned int u16;
typedef unsigned char u8;
sbit src=P3^6; //移位寄存器时钟输入
sbit rc=P3^5; //存储寄存器时钟输入
sbit ser=P3^4; //串行数据输入
sbit key=P3^2; //按键
u8 duan[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
u8 count=0;
u8 i;
u8 flag=0; //标志位
void delay(u16 x) //延时函数1us
{
while(x--);
}
void tim_init() //定时器初始化
{
EA=1; //中断总允许位
ET0=1; //定时计数器中断允许位
TMOD=0X01; //定时器0的方式1 0000 0001
TH0=0XD8; //高八位
TL0=0XF0; //低八位
TR0=1; //开启定时
}
void int0_init() //中断初始化
{
EX0=1; //外部中断允许位
IT0=1; //下降沿触发
}
void c595(u8 date) //c595芯片初始化
{
u8 a;
src=0; //移位寄存器时钟输入
rc=0; //存储寄存器时钟输入
for(a=0;a<8;a++)
{
ser=date>>7; //选择最高位
date<<=1; //向左移一位
src=1;
_nop_(); //一个机器周期时间(在intrins头文件中)
_nop_();
src=0;
}
rc=1;
_nop_();
_nop_();
rc=0;
}
void main()
{
led=0xcc;
c595(0x00);
tim_init();
int0_init();
while(1);
}
void int0() interrupt 0 //中断服务函数
{
if(key==0)
{
delay(4); //消抖
if(key==0)
{
while(key==0); //判断是否松手
flag=1;
}
}
}
void tim0() interrupt 1
{
TH0=0XD8;
TL0=0XF0;
count++;
if(count==50)
{
if(flag==1)
{
i++;
c595(duan[i]);
led=~led;
delay(100);
if(i==7)
{
i=0;
flag=0;
}
}
count=0;
}
}