⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keilc.txt

📁 单片机C语言程序开发:实现定时建建扫描功能。
💻 TXT
字号:
定时按键扫描程序
#include <reg51.h>
#define key_1 0x0e;
#define key_2 0x0d;
#define key_3 0x0b;
#define key_4 0x07;
bit key_enable = 0;
unsigned int current_led = 0;
void delay(int length);
unsigned int key_sequence[4] = {0x0e,0x0d,0x0b,0x07};
unsigned int code dis_list[] = {0xc0,0xf9,0xa4,0xb0,0x99,       //段码表    
                              // 0    1    2    3    4         对应内容    
                               0x92,0x82,0xf8,0x80,0x90,0xbf };
                              // 5    6    7    8    9    -
static unsigned int *Pointer[] = {&dis_list[0],&dis_list[0],&dis_list[0],&dis_list[0]};//Pointe to showing NUM
static unsigned int show_Num = 0;

unsigned int key_scan()//按键扫描函数 
{
        unsigned int key_value;//返回当前按键值
        unsigned int key_scan_first;
        key_scan_first = P1 & 0x0f;//读取当前按键值
        delay(50);//去抖延时num×100ms
        if(key_scan_first == (P1 & 0x0f))//确认后返回当前键值
                {
                                switch(key_scan_first)
                                        {
                                          case 0x0e: key_value = 1;//按键1
                                              break;
                                  case 0x0d: key_value = 2;//按键2
                                            break;
                                case 0x0b: key_value = 3;//Button 3 was pressed;
                                            break;
                                case 0x07: key_value = 4;//Button 4 was pressed
                                             break;
                                default:key_value = 0;//return no button was pressed                                       
                              }
           }        
        else
                {
                        key_value = 0;//return no button was pressed
                }
        return key_value;        
}

void delay(int length)//Delay time lengtn*100ms(os = 11.0592MHz)
{
        int i,j;
        for(i=0;i<length;i++)
        {
                for(j=0;j<120;j++)
                {
                        ;
                }
        }
}
void key_4_act()
{
        key_enable = !key_enable;//Other Key enable while 'key_enable = 1'
        current_led = 0;//clear current value,start at No.1
}

void key_1_act()//Key was pressed,curser get to next led
{
        if(key_enable == 1)
                {
                        current_led ++;
            if(current_led == 4)//go back 
                  {
                           current_led = 0;
                  }
                }        
}

void key_2_act()//当前指针加1
{
        if(key_enable == 1)
                {
                Pointer[current_led]++ ;//指向下一个段码地址
            if(Pointer[current_led] == &dis_list[10])//增加到段码表最后一位后,返回段码首位地址
                  {
                           Pointer[current_led] = &dis_list[0];
                   }
                }
}
//地址加减注意 指针越界,在边界值上进行加减操作,如果在指针指向Pointer[0]自减后,将回不到指定地址位置
void key_3_act()
{
        if(key_enable == 1)
                {
                        if(Pointer[current_led] == &dis_list[0])//减小到段码首地址后 ,指向段码尾地址
                      {
                              Pointer[current_led] = &dis_list[10];
                       }
                    Pointer[current_led]--;//指向上一位段码地址
            
                }
}

void key_action(unsigned int get_key)//Process the value of button pressed
{
        switch(get_key)
        {
                case 1:        //if(get_key == 0x00)
                            //{
                              key_1_act();
                            //}
                              break;
          case 2://        if(get_key == 0x00)
                         // {
                                key_2_act();
                         // }
                        break;
          case 3: //if(get_key == 0x00)
                        ////{
                                key_3_act();
                        //}
                        break;
          case 4: //if(get_key == 0x00)
                        //{
                                key_4_act();
                        //}
                        break;
          default: break;
        }
}

void timer_init(void) 
{
      TMOD = 0x11;         // 定时/计数器0,1工作于方式1    
      TH0 = 0xd8;          // 预置定时常数55536(d8f0),产生10ms时基信号    
      TL0 = 0xf0;    
      TH1 = 0xfc;          // 预置定时常数64536(fc18),产生1ms间隔用于动态显示    
      TL1 = 0x18;    
      ET0 = 0;             // 定时/计数器0允许中断    
      ET1 = 1;             // 定时/计数器1允许中断    
      TR0 = 0;             // 开闭定时/计数器0    
      TR1 = 1;             // 启动定时/计数器1
          EA = 1;              // 开总中断    
}


void statu_show(unsigned int order)///showning the different nunber in different time
{
     switch  (order)
         {
         
     case 0: P2 = 0x10;//F1&&2;//选中第一个数码管,同时关闭其他数码管显示
                   P0 = *(Pointer[0]);//显示具体内容
               break;
           case 1: P2 = 0x20;//F2&&2;//No.second
                   P0 = *(Pointer[1]);
               break;
           case 2: P2 = 0x40;//F4&&2;//No.third
                   P0 = *Pointer[2];
               break;
           case 3: P2 = 0x80;//F8&&P2;//No.fouth
             P0 = *Pointer[3];
               break;
           default : 
                   break;
     }
}


void timer_ISR(void)   interrupt 3//利用定时中断处理分时显示
{
     TR1 = 0;//close the timer 1;
     TH1 = 0xfc;          // 预置定时常数64536(fc18),产生1ms间隔用于动态显示    
     TL1 = 0x18; 
     statu_show(show_Num);
         show_Num++;
         if(show_Num == 4)//四位数码管轮流显示
         {
             show_Num = 0;
         }
         TR1 = 1;//reopen the timer 1
}

void main()
{
   timer_init();//timer 1 init
   while(1)
   {
      key_action(key_scan());//Process funcation
          //delay(50);
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -