蓝桥杯之临时抱佛脚(1)

    xiaoxiao2021-04-15  346

    参加省赛的一天没有准备,只是在比赛的时候写了会程序,不知为啥进了国赛。

    今天特意写一篇抱佛脚的文章,所有的驱动机会没有改变,只是增加了一部分。

    矩阵键盘、数码管必考不用想必须记住。下面是必须得记住的程序

    系统配置

    /*system.h相关代码*/ #ifndef __SYSTEM_H #define __SYSTEM_H #include<stc15.h> #include<intrins.h> typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; void allinit(); void delay(u16 i); #endif /*system.c相关代码。。。进行初始化*/ #include"system.h" void allinit() { P2=(P2&0x1f)|0x80; P0=0xff;//led的初始化 P2=(P2&0x1f)|0xe0; P0=0xff;//初始化关闭数码管 P2=(P2&0x1f)|0xa0; P0=0x00;初始化蜂鸣器 P2&=0x1f; } void delay(u16 i) { while(i--); }

    矩阵键盘

    /*arr_key.h相关程序*/ #ifndef __ARR_KEY_H #define __ARR_KEY_H #include "system.h" sbit key_out_1=P3^0; sbit key_out_2=P3^1; sbit key_out_3=P3^2; sbit key_out_4=P3^3; sbit key_in_4=P3^4; sbit key_in_3=P3^5; sbit key_in_2=P4^2; sbit key_in_1=P4^4; void keydriver(); void keyscan(); void keyaction(u8 keycode); #endif /*arr_key.c的主程序*/ #include "arr_key.h" extern bit set = 1;//应用在mian.c中的标志位,在mian.c中再定义一次 u8 keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}}; u8 keycodemap[4][4]= { {0,1,2,15}, {3,4,5,14}, {6,7,8,13}, {9,10,11,12} }; void keydriver() { u8 i,j; static backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}}; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(keysta[i][j]!=backup[i][j]) { if(backup[i][j]!=0) { keyaction(keycodemap[i][j]); } backup[i][j]=keysta[i][j]; } } } } void keyscan() { u8 i; static u8 keybuff[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}}; static u8 keyout=0; switch(keyout) { case 0:key_out_1=0;key_out_4=1;break; case 1:key_out_2=0;key_out_1=1;break; case 2:key_out_3=0;key_out_2=1;break; case 3:key_out_4=0;key_out_3=1;break; default:break; } keybuff[keyout][0]=(keybuff[keyout][0]<<1)|key_in_1; keybuff[keyout][1]=(keybuff[keyout][1]<<1)|key_in_2; keybuff[keyout][2]=(keybuff[keyout][2]<<1)|key_in_3; keybuff[keyout][3]=(keybuff[keyout][3]<<1)|key_in_4; for(i=0;i<4;i++) { if(((keybuff[keyout][i])&0x0f)==0x0f) { keysta[keyout][i]=1; } else if(((keybuff[keyout][i])&0x0f)==0x00) { keysta[keyout][i]=0; } else {} } keyout++; keyout&=0x03; } void keyaction(u8 keycode)//执行相应的操作 { if(keycode==0) { set = 1; } else if(keycode==1) { set = 0; } else if(keycode==2) { set = 1; } else if(keycode==3) { set = 0; } else if(keycode==4) { set = 1; } else set = 0; }

    数码管扫描

    /*led.h的相关函数*/ #ifndef __LED_H #define __LED_H #include "system.h" void ledscan(); void shownumber(u32 dat); void ledshow(); #endif /*led.c的相关函数*/ #include "led.h" u8 ledchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; u8 ledbuff[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; extern u8 yi,er,san,si,wu,liu,qi,ba; void ledscan() { static u8 index=0; P2=(P2&0x1f)|0xe0; P0=0xff; P2=(P2&0x1f)|0xc0; P0=0x80>>index; P2=(P2&0x1f)|0xe0; P0=ledbuff[index]; P2&=0x1f; index++; index&=0x07; } void shownumber(u32 dat)//显示多位数据 { char i; u8 buf[8]; for(i=0; i<8; i++) { buf[i] = dat % 10; dat /= 10; } for(i=7; i>0; i--) { if(buf[i] == 0) ledbuff[i] = 0xFF; else break; } for( ; i>=0; i--) { ledbuff[i] = ledchar[buf[i]]; } } void ledshow()//每位显示 { ledbuff[0]=ledchar[1];ledbuff[1]=ledchar[2]; ledbuff[2]=ledchar[3];ledbuff[3]=ledchar[4]; ledbuff[4]=ledchar[5];ledbuff[5]=ledchar[6]; ledbuff[6]=ledchar[7];ledbuff[7]=ledchar[8]; }

    以上的scan程序都需要放到定时器0的2ms定时中。


    最新回复(0)