参加省赛的一天没有准备,只是在比赛的时候写了会程序,不知为啥进了国赛。
今天特意写一篇抱佛脚的文章,所有的驱动机会没有改变,只是增加了一部分。
矩阵键盘、数码管必考不用想必须记住。下面是必须得记住的程序
系统配置
/*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定时中。