那个单片机的代码
//一下是单片机的代码(如果网盘不好访问的话):
//注:单片机的编程与硬件的关系较近,高概率没那么通用,但是可以看看大致是什么样的
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define KEY_MATRIX_PORT P1
#define SMG_A_DP_PORT P0
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit BEEP=P2^5;
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
//LED点阵有关
sbit LED_SRCLK=P3^6;
sbit LED_RCLK=P3^5;
sbit LED_SER=P3^4;
#define LEDDZ_COL_PORT P0
u8 code game_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
u8 code ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//延时函数
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//延时函数2
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
//595发送数据的函数
void hc595_write_data(u8 dat)
{
u8 i=0;
for(i=0;i<8;i++)
{
LED_SER=dat>>7;
//左移之后再赋值dat=dat<<1;
dat<<=1;
LED_SRCLK=0;
delay_10us(1);
LED_SRCLK=1;
delay_10us(1);
}
LED_RCLK=0;
delay_10us(1);
LED_RCLK=1;
}
//独立按键函数
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)
{
key=1;
}
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
{
delay_10us(1000);//消抖处理
key=0;
if(KEY1==0)
{return KEY1_PRESS;}
else if(KEY2==0)
{return KEY2_PRESS;}
else if(KEY3==0)
{return KEY3_PRESS;}
else if(KEY4==0)
{return KEY4_PRESS;}
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)
{
key=1;
}
return KEY_UNPRESS;
}
//矩阵按键行列式扫描
u8 key_matrix_ranks_scan(void)
{
u8 key_value=0;
KEY_MATRIX_PORT=0xf7;//第一列为低电平
if(KEY_MATRIX_PORT!=0xf7)
{
delay_10us(1000);//消抖处理
switch(KEY_MATRIX_PORT)
{
case 0x77:key_value=1;break;
case 0xb7:key_value=5;break;
case 0xd7:key_value=9;break;
case 0xe7:key_value=13;break;
}
}
while(KEY_MATRIX_PORT!=0xf7);
KEY_MATRIX_PORT=0xfb;//第二列为低电平
if(KEY_MATRIX_PORT!=0xfb)
{
delay_10us(1000);//消抖处理
switch(KEY_MATRIX_PORT)
{
case 0x7b:key_value=2;break;
case 0xbb:key_value=6;break;
case 0xdb:key_value=10;break;
case 0xeb:key_value=14;break;
}
}
while(KEY_MATRIX_PORT!=0xfb);
KEY_MATRIX_PORT=0xfd;//第三列为低电平
if(KEY_MATRIX_PORT!=0xfd)
{
delay_10us(1000);//消抖处理
switch(KEY_MATRIX_PORT)
{
case 0x7d:key_value=3;break;
case 0xbd:key_value=7;break;
case 0xdd:key_value=11;break;
case 0xed:key_value=15;break;
}
}
while(KEY_MATRIX_PORT!=0xfd);
KEY_MATRIX_PORT=0xfe;//第四列为低电平
if(KEY_MATRIX_PORT!=0xfe)
{
delay_10us(1000);//消抖处理
switch(KEY_MATRIX_PORT)
{
case 0x7e:key_value=4;break;
case 0xbe:key_value=8;break;
case 0xde:key_value=12;break;
case 0xee:key_value=16;break;
}
}
while(KEY_MATRIX_PORT!=0xfe);
return key_value;
}
//独立按键控制LED灯
void key_control_led()
{
u8 keyTemp=0;
keyTemp=key_scan(0);
//if(keyTemp==KEY1_PRESS)
//{LED1=!LED1;}
switch(keyTemp)
{
case KEY1_PRESS:LED1=!LED1;break;
case KEY2_PRESS:LED2=!LED2;break;
case KEY3_PRESS:LED3=!LED3;break;
case KEY4_PRESS:LED4=!LED4;break;
}
}
//独立按键控制显示位置
void key_control_place()
{
static u8 place=8;
u8 keyTemp=0;
keyTemp=key_scan(0);
switch(keyTemp)
{
case KEY1_PRESS:place--;if(place==0){place=8;}break;
case KEY2_PRESS:place++;if(place>8){place=1;}break;
case KEY3_PRESS:break;
case KEY4_PRESS:break;
}
switch(place)
{
case 1:LSC=1;LSB=1;LSA=1;break;
case 2:LSC=1;LSB=1;LSA=0;break;
case 3:LSC=1;LSB=0;LSA=1;break;
case 4:LSC=1;LSB=0;LSA=0;break;
case 5:LSC=0;LSB=1;LSA=1;break;
case 6:LSC=0;LSB=1;LSA=0;break;
case 7:LSC=0;LSB=0;LSA=1;break;
case 8:LSC=0;LSB=0;LSA=0;break;
}
}
//矩阵按键线翻转法
u8 key_matrix_flip_scan(void)
{
u8 key_value=0;
KEY_MATRIX_PORT=0x0f;
if(KEY_MATRIX_PORT!=0x0f)
{
delay_10us(1000);//消抖处理
if(KEY_MATRIX_PORT!=0x0f)
{
//测试列
KEY_MATRIX_PORT=0x0f;
switch(KEY_MATRIX_PORT)
{
case 0x07:key_value=1;break;//第一列有按键按下
case 0x0b:key_value=2;break;
case 0x0d:key_value=3;break;
case 0x0e:key_value=4;break;
}
//测试行
KEY_MATRIX_PORT=0xf0;
switch(KEY_MATRIX_PORT)
{
case 0x70:key_value=key_value;break;
case 0xb0:key_value=key_value+4;break;
case 0xd0:key_value=key_value+8;break;
case 0xe0:key_value=key_value+12;break;
}
while(KEY_MATRIX_PORT!=0xf0);
}
}
return key_value;
}
//矩阵按键控制字符,独立按键控制位置
void zifu_place_control()
{
//矩阵按键的选择
u8 key=0;
//独立按键的选择
u8 keyTemp=0;
//记录位置的变量
u8 place=8;
//数码管初始化
SMG_A_DP_PORT=game_code[0];
while(1)
{
//选择字符
//矩阵按键是行列式扫描
//key=key_matrix_ranks_scan();
//这个就是线翻转扫描了
key=key_matrix_flip_scan();
if(key!=0)
{SMG_A_DP_PORT=game_code[key-1];}
//获取独立按键
keyTemp=key_scan(0);
//独立按键翻译
switch(keyTemp)
{
case KEY1_PRESS:place--;if(place==0){place=8;}break;
case KEY2_PRESS:place++;if(place>8){place=1;}break;
case KEY3_PRESS:SMG_A_DP_PORT=game_code[0];place=8;break;
case KEY4_PRESS:SMG_A_DP_PORT=game_code[16];return;break;
}
switch(place)
{
case 1:LSC=1;LSB=1;LSA=1;break;
case 2:LSC=1;LSB=1;LSA=0;break;
case 3:LSC=1;LSB=0;LSA=1;break;
case 4:LSC=1;LSB=0;LSA=0;break;
case 5:LSC=0;LSB=1;LSA=1;break;
case 6:LSC=0;LSB=1;LSA=0;break;
case 7:LSC=0;LSB=0;LSA=1;break;
case 8:LSC=0;LSB=0;LSA=0;break;
}
}
}
//LED阵列流水灯
void LEDZL_liushui()
{
u8 i=0,j=0;
//独立按键的选择
u8 keyTemp=0;
LEDDZ_COL_PORT=0x00;
while(1)
{
for(i=0;i<8;i++)
{
hc595_write_data(0x00);//消影
hc595_write_data(ghc595_buf[i]);
for(j=0;j<10;++j)
{
//获取独立按键
keyTemp=key_scan(0);
if(keyTemp!=KEY_UNPRESS)
{
switch(keyTemp)
{
case KEY1_PRESS:if(i==0){i=7;}else{i--;}i--;break;
case KEY2_PRESS:if(i==7){i=0;}else{i++;}break;
case KEY3_PRESS:i=-1;break;
case KEY4_PRESS:return;break;
}
}
else
{
delay_10us(5000);
}
}
}
}
}
//主函数
void main()
{
while(1)
{
LEDZL_liushui();
zifu_place_control();
}
}