那個單片機(jī)的代碼
//一下是單片機(jī)的代碼(如果網(wǎng)盤不好訪問的話):
//注:單片機(jī)的編程與硬件的關(guān)系較近,高概率沒那么通用,但是可以看看大致是什么樣的
#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點(diǎn)陣有關(guān)
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};
//延時函數(shù)
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//延時函數(shù)2
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
//595發(fā)送數(shù)據(jù)的函數(shù)
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;
}
//獨(dú)立按鍵函數(shù)
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;
}
//獨(dú)立按鍵控制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;
}
}
//獨(dú)立按鍵控制顯示位置
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;
}
}
//矩陣按鍵線翻轉(zhuǎn)法
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;
}
//矩陣按鍵控制字符,獨(dú)立按鍵控制位置
void zifu_place_control()
{
//矩陣按鍵的選擇
u8 key=0;
//獨(dú)立按鍵的選擇
u8 keyTemp=0;
//記錄位置的變量
u8 place=8;
//數(shù)碼管初始化
SMG_A_DP_PORT=game_code[0];
while(1)
{
//選擇字符
//矩陣按鍵是行列式掃描
//key=key_matrix_ranks_scan();
//這個就是線翻轉(zhuǎn)掃描了
key=key_matrix_flip_scan();
if(key!=0)
{SMG_A_DP_PORT=game_code[key-1];}
//獲取獨(dú)立按鍵
keyTemp=key_scan(0);
//獨(dú)立按鍵翻譯
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;
//獨(dú)立按鍵的選擇
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)
{
//獲取獨(dú)立按鍵
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);
}
}
}
}
}
//主函數(shù)
void main()
{
while(1)
{
LEDZL_liushui();
zifu_place_control();
}
}