按键一学,感觉好玩的就多了 ,尤其是加上函数点调用,我感觉自己能干的就很多了。一、函数调用。让我可以用模块化的思维,去简化复杂问题。如按键和LED(小灯和数码管)的相应程序尤其是我们自己编写的,我们都可以打包作为一个模块去加到程序中。在搞一个复杂的大程序中,我们用一个一个的函数去将要实现的功能分开,思路更清晰。(如视频中的keydriver keyaction函数)
二、按键。我们这个板子用每排的前三个去改变数码管或小灯的变化时,就会附带改变38译码器的输入值。当我们用P00,P01,P02去控制那个位的灯亮时,按键也需要这3个引脚不断的是高电平以读取按键的变化,并且P00,P01,P02全高时不控制某个数码管和小灯。此时只能让P00,P01,P02中至少一个为0,也就代表这一列不能用了。 但我们也可以通过这三列中的两列来控制38 译码器,即两个按键的0和1,共4中状态来选择4个数码管或小灯中的哪个亮,在用最后一列去做一些功能(比如数的加减,数码管的动态显示),也蛮好玩的。
三、小结下函数的调用 1、形参与实参。
第一个函数名后括号中的是形参,即(unsigned char keycode).第二个函数名后括号中的是实参。即(KeyCodeMap[1]).前一个规定参数的格式,后一个说那个数参与运算。 2、参数即i实参可以是常量,也可以是简单或者复杂的表达式,但是要求必须有确定的值,在调用时传递给形参。 3、调用函数要先声明。 感觉记住这3点就行了,用函数调用稳稳的 。 下面是我的一个程序,就是针对函数调用和 键盘上的 上下左右键的小试用 [mw_shl_code=applescript,true]#include<STC12C5A60S2.H>
sbit ENLED = P1^1;
unsigned char code KeyCodeMap[4]={ 0x26,0x25,0x28,0x27};
unsigned char code LedChar[]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
void KeyDriver ();
unsigned char LedBuff=0xC0;
unsigned char index=0;
unsigned char keyout=0;
sbit KEY_OUT_0 = P2^4;
sbit KEY_OUT_1 = P2^5;
sbit KEY_OUT_2 = P2^6;
sbit KEY_OUT_3 = P2^7;
unsigned char keysta[4]={1,1,1,1};
sbit key_INT1 = P2^3;
void main ()
{
ENLED=0;
P2=0x7D;
AUXR=0x80;
TMOD=0x01;
TH0=0x83;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
P0=LedBuff;
while(1)
{
KeyDriver();
}
}
void Keyaction(unsigned char keycode)
{
switch (keycode)
{
case 0x26:index++;if(index>=16){index=0;}
LedBuff=LedChar[index];break;
case 0x25: LedBuff=LedChar[0];break;
case 0x28: LedBuff=LedChar[index=(index-1)];break;
// case 0x27: ;break;
default :break ;
}
}
//void ShowNumber(unsigned char num)
void KeyDriver ()
{
static unsigned char backup[4]={1,1,1,1};
unsigned char i;
for(i=0;i<4;i++)
{
if(keysta!=backup)
{
if(backup==0)
{
Keyaction(KeyCodeMap);
}
backup=keysta;
}
}
}
void KeyScan()
{
static unsigned char keybuff[4]={0xFF,0xFF,0xFF,0xFF};
keybuff[keyout]=(keybuff[keyout]<<1)| key_INT1;
if(( keybuff[keyout] & 0x0F)==0x00)
{
keysta[keyout]=0;
}
else if((keybuff[keyout]&0x0F)==0x0F)
{
keysta[keyout]=1;
}
keyout++;
keyout=keyout&0x03;
switch(keyout)
{
case 1:KEY_OUT_3=1;KEY_OUT_0=0;break;
case 2:KEY_OUT_0=1;KEY_OUT_1=0;break;
case 3:KEY_OUT_1=1;KEY_OUT_2=0;break;
case 0:KEY_OUT_2=1;KEY_OUT_3=0;break;
default:break;
}
}
void LedScan()
{
P0=LedBuff;
}
void InterruptTimer0() interrupt 1
{
TH0=0x83;
TL0=0x00;
LedScan();
KeyScan();
}
[/mw_shl_code] |