欢迎光临散文网 会员登陆 & 注册

那个单片机的代码

2023-03-26 22:08 作者:奇思妙语胡言乱语  | 我要投稿

//一下是单片机的代码(如果网盘不好访问的话):

//注:单片机的编程与硬件的关系较近,高概率没那么通用,但是可以看看大致是什么样的

#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();

}

}


那个单片机的代码的评论 (共 条)

分享到微博请遵守国家法律