登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 函数调用与按键

[复制链接]
发表于 2018-2-5 00:02:40 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 跟着金沙滩走
开始时间: 2018-02-01
结束时间: 2018-02-04
按键一学,感觉好玩的就多了 ,尤其是加上函数点调用,我感觉自己能干的就很多了。一、函数调用。让我可以用模块化的思维,去简化复杂问题。如按键和LED(小灯和数码管)的相应程序尤其是我们自己编写的,我们都可以打包作为一个模块去加到程序中。在搞一个复杂的大程序中,我们用一个一个的函数去将要实现的功能分开,思路更清晰。(如视频中的keydriver keyaction函数)
二、按键。我们这个板子用每排的前三个去改变数码管或小灯的变化时,就会附带改变38译码器的输入值。当我们用P00,P01,P02去控制那个位的灯亮时,按键也需要这3个引脚不断的是高电平以读取按键的变化,并且P00,P01,P02全高时不控制某个数码管和小灯。此时只能让P00,P01,P02中至少一个为0,也就代表这一列不能用了。
1.png
   但我们也可以通过这三列中的两列来控制38译码器,即两个按键的01,共4中状态来选择4个数码管或小灯中的哪个亮,在用最后一列去做一些功能(比如数的加减,数码管的动态显示),也蛮好玩的。 2.png
三、小结下函数的调用
1、形参与实参。 4.png 3.png
    第一个函数名后括号中的是形参,即(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]
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表