51单片机—按键控制点阵显示

时间:2025-03-07 10:04:50
#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; } }