可控制的坤坤代码--基于51单片机设计

使用器件:普中51单片机,LED点阵屏,矩阵按键

功能:

①自动模式:不按暂停键的时候实现坤坤的自动铁山靠

②手动模式:按下暂停键之后,手动对坤坤铁山靠进行控制

代码比较长,没有进行优化,但是很好理解。每个状态都有两步可走,实现对鸽鸽的操控。

手动

自动

main.c

#include <REGX52.H>
#include <Matrix_LED.h>
#include <Matrix_Key.h>

//鸽鸽动作:下中,下右,下中,上中,上右,上中
unsigned char gege[] = {
	0x00,0x00,0x19,0x3E,0x7C,0x54,0x03,0x00, //下中
	0x00,0x00,0x01,0x02,0x1C,0x1C,0x7B,0x58,//下右
	0x00,0x00,0x19,0x3E,0x7C,0x54,0x03,0x00, //下中
	0x00,0x00,0x23,0x7C,0xF8,0xB6,0x01,0x00, //上中
	0x00,0x00,0x01,0x02,0x24,0x78,0xFF,0xB0, //上右
	0x00,0x00,0x23,0x7C,0xF8,0xB6,0x01,0x00 //上中
};


void main()
{
	unsigned char count = 0,i=0,flag = 1,key_number; // flag是动静标志位,1是动,正常状态,0是静止
	Matrix_LED_Init();
	while (1)
    {
		key_number = Matrixkey(); //接收按键
		if(key_number==0) flag = ~flag; // 动静转换
		
		if(flag == 1)
		{
			All_LED_Matrix(gege[i],gege[i+1],gege[i+2],gege[i+3],
				gege[i+4],gege[i+5],gege[i+6],gege[i+7]);
			
			count++;
			if (count>100)
			{
				count = 0;
				i += 8;
				if(i>40) i = 0;
			}
		}
		else
		{
			All_LED_Matrix(gege[i],gege[i+1],gege[i+2],gege[i+3],
				gege[i+4],gege[i+5],gege[i+6],gege[i+7]);
			if(i==0 || i==16)//下中  上中和下右
			{
				if(key_number==1)  i=24;
				if(key_number==4)  i=8;	
			}
			else if(i==8)//下右  上右和下中
			{
				if(key_number==1)  i=32;
				if(key_number==3)  i=0;
			}
			else if(i==24 || i==40 )//上中  上右和下中
			{
				if(key_number==4)  i=32;
				if(key_number==2)  i=0;
			}
			else if(i==32)//上右 上中和下右
			{
				if(key_number==3)  i=24;
				if(key_number==2)  i=8;
			}
		}
    }
    
}



matix_LED.c

#include <REGX52.H>

sbit RCK = P3^5;
sbit SCK = P3^6;
sbit SER = P3^4;

#define Matrix_LED_Column P0

void delay_ms(unsigned int ms) //延时函数
{
	while(ms--);
}

void Matrix_LED_Init() // LED点阵初始化函数
{
	SCK = 0;
	RCK = 0;
}

void writebyte_74HC595(unsigned char byte) // 写入8位数据
{
	unsigned char i=0;
	for(i;i<8;i++) // 数据是8位,循环8次输入进去
	{
		SER = byte&(0x80>>i); // 每次输入一位进去SER
		SCK = 1;
		SCK = 0;
	}
	RCK = 1; // 并行输出开关
	RCK = 0; // 并行输出清零
}

// 输入列和数据,选择哪一列亮和亮的数据,
void LED_Matrix_show_column(unsigned char column,Data) // column从0开始,[0,7]
{
	
	writebyte_74HC595(Data);//写入数据,得在列选之前!先写入再亮灯
	Matrix_LED_Column = ~(0x80>>column);
	// 0x80=1000 0000,colunmn为右移位数,低电平亮,所以取反
	delay_ms(5);
	Matrix_LED_Column = 0xFF;
}

//直接输入8列的数据,来方便显示整个图像
void All_LED_Matrix(unsigned char Data0,Data1,Data2,Data3,Data4,Data5,Data6,Data7)
{
	
		LED_Matrix_show_column(0,Data0);
		LED_Matrix_show_column(1,Data1);
		LED_Matrix_show_column(2,Data2);
		LED_Matrix_show_column(3,Data3);
		LED_Matrix_show_column(4,Data4);
		LED_Matrix_show_column(5,Data5);
		LED_Matrix_show_column(6,Data6);
		LED_Matrix_show_column(7,Data7);

}	

 key.c

#include <REGX52.H>
#include <Matrix_LED.h>

sbit Co1=P1^3; // 列,O,第几列
sbit Co2=P1^2;
sbit Co3=P1^1;
sbit Co4=P1^0;

sbit Row1=P1^7;// 行,K  第几行
sbit Row2=P1^6;
sbit Row3=P1^5;
sbit Row4=P1^4;

#define max(a, b) ((a) > (b) ? (a) : (b)) // 定义max函数

unsigned char Matrixkey() // 逐渐扫描4列,看有无按下,返回S1~S16
{
    char KeyNumber = -1;
    
    P1 = 0xFF;
    Co1 = 0;//第一列
    if(Row4 == 0) {delay_ms(20);while(Row4==0);delay_ms(20);KeyNumber = 3;} // 左
    P1 = 0xFF;
    Co2 = 0;//第二列
    if(Row3 == 0) {delay_ms(20);while(Row3==0);delay_ms(20);KeyNumber = 1;} //上
    if(Row4 == 0) {delay_ms(20);while(Row4==0);delay_ms(20);KeyNumber = 2;} //下
    P1 = 0xFF;
    Co3 = 0;//第三列
    if(Row4 == 0) {delay_ms(20);while(Row4==0);delay_ms(20);KeyNumber = 4;} //右
    P1 = 0xFF;
    Co4 = 0;//第四列
    if(Row4 == 0) {delay_ms(20);while(Row4==0);delay_ms(20);KeyNumber = 0;} // 动静开关 
    
    return KeyNumber;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值