使用器件:普中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;
}