在前面几部分学习的基础上,我们可以进行基础部分的程序整合:
主程序
#include<STC15F2K60S2.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
uchar yi,er,san,si,wu,liu,qi,ba;
uchar num;
bit S7,S6,S5,S4;
void Allinit(void);
void Delayms(int ms);
void Display1(uchar yi,uchar er);
void Display2(uchar san,uchar si);
void Display3(uchar wu,uchar liu);
void Display4(uchar qi,uchar ba);
//void KEY_Scan(void);
void KEY_Scan16(void);
void main(void)
{
Allinit();
while(1)
{
//KEY_Scan();
KEY_Scan16();
yi=num;
Display1(yi,er);
Display2(san,si);
Display3(wu,liu);
Display4(qi,ba);
}
}
1.其中bit S7,S6,S5,S4与头文件intrins.h相对应
2.#define为宏定义,之后可以用uchar代替unsigned char。
3.由于子函数放在了主函数的下边,所有我们需要对使用到的子函数进行声明(比赛中只能使用一种按键方式,上面以及下面的程序中,矩阵键盘和独立按键二选一)
延时函数
void Delayms(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
初始化函数
void Allinit(void)
{
P2=0XA0; //打开控制蜂鸣器的573锁存器
P0=0X00; //关闭蜂鸣器继电器
P2=0XC0; //打开控制数码管位选的573锁存器
P0=0XFF; //选中所有的数码管
P2=0XE0; //打开控制数码管段选的573锁存器
P0=0XFF; //关闭所有的数码管
P2=0X80; //打开控制LED的573锁存器
P0=0XFF; //关闭所有的LED
}
数码管显示函数
void Display1(uchar yi,uchar er)
{
//第1个数码管
P2=0XC0;
P0=0X01;
P2=0XE0;
P0=tab[yi];
Delayms(1);
//第2个数码管
P2=0XC0;
P0=0X02;
P2=0XE0;
P0=tab[er];
Delayms(1);
}
void Display2(uchar san,uchar si)
{
//第3个数码管
P2=0XC0;
P0=0X04;
P2=0XE0;
P0=tab[san];
Delayms(1);
//第4个数码管
P2=0XC0;
P0=0X08;
P2=0XE0;
P0=tab[si];
Delayms(1);
}
void Display3(uchar wu,uchar liu)
{
//第5个数码管
P2=0XC0;
P0=0X10;
P2=0XE0;
P0=tab[wu];
Delayms(1);
//第6个数码管
P2=0XC0;
P0=0X20;
P2=0XE0;
P0=tab[liu];
Delayms(1);
}
void Display4(uchar qi,uchar ba)
{
//第7个数码管
P2=0XC0;
P0=0X40;
P2=0XE0;
P0=tab[qi];
Delayms(1);
//第8个数码管
P2=0XC0;
P0=0X80;
P2=0XE0;
P0=tab[ba];
Delayms(1);
}
独立按键程序(二选一)
void KEY_Scan(void)
{
if(P30==0) //S7
{
Delayms(5); //消抖
if(P30==0)
{
S7=1;yi=7;
}
while(!P30);
}
else if(P31==0) //S6
{
Delayms(5); //消抖
if(P31==0)
{
S6=1;yi=6;
}
while(!P31);
}
else if(P32==0) //S5
{
Delayms(5); //消抖
if(P32==0)
{
S5=1;yi=5;
}
while(!P32);
}
else if(P33==0) //S4
{
Delayms(5); //消抖
if(P33==0)
{
S4=1;yi=4;
}
while(!P33);
}
}
矩阵键盘程序(二选一)
void KEY_Scan16(void)
{
uchar temp;
//第1列
P44=0;P42=1;P3=0X7F;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
Delayms(5); //消抖
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0X7E:num=1;break;
case 0X7D:num=2;break;
case 0X7B:num=3;break;
case 0X77:num=4;break;
}
}
}
//第2列
P44=1;P42=0;P3=0XBF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
Delayms(5); //消抖
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XBE:num=5;break;
case 0XBD:num=6;break;
case 0XBB:num=7;break;
case 0XB7:num=8;break;
}
}
}
//第3列
P44=1;P42=1;P3=0XDF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
Delayms(5); //消抖
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XDE:num=9;break;
case 0XDD:num=10;break;
case 0XDB:num=11;break;
case 0XD7:num=12;break;
}
}
}
//第4列
P44=1;P42=1;P3=0XEF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
Delayms(5); //消抖
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XEE:num=13;break;
case 0XED:num=14;break;
case 0XEB:num=15;break;
case 0XE7:num=0;break;
}
}
}
}