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

名称:按键控制 8X8LED 点阵屏显 示图形

说明:每次按下 K1 时,会使 8X8LED 点阵屏循环显示不同图形。本例同时使用外部中断和定 时中断

#include"reg52.h"
#include"intrins.h"
#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;
	}
}

  • 11
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值