久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1074|回復: 0
打印 上一主題 下一主題
收起左側

鍵盤48顯示,并左移

[復制鏈接]
跳轉到指定樓層
樓主
ID:435876 發表于 2018-11-29 16:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "iom48v.h"
#include "macros.h"
#define uchar unsigned char
#define uint  unsigned int
#define KEY_Press keycode!=0x00

#pragma interrupt_handler T1_refresh: 12

void delay(uint a)
{
  while(a--);
}

const uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                      0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};

uchar segcode[4]={0XFF,0XFF,0XFF,0XFF};    //段碼  (存放譯碼值)
uchar data[4];       //顯示數據
uchar keycode;       //判斷按鍵位置
uchar n=0;           //顯示刷新標志
uchar key=0;         //鍵值  PINB!=0X0F
uchar digit=0;

/***IO口初始化函數***/
void IO_Init(void)
{
        DDRB  = 0xF0;       
        PORTB = 0x0F;        //上拉
        DDRC  = 0xFF;
        PORTC = 0xFF;       
        DDRD  = 0xFF;
        PORTD = 0xFF;       
}


/***定時器T1初始化***/
void T1_Init(void)
{
  TCCR1A = 0x00;      //CTC
  TCCR1B = 0x0B;          // 64分頻
  OCR1A  = 78;        // 5ms
  TIFR1  = 0x02;
  TIMSK1 = 0X02;      //開中斷
}


/***定時器T1中斷服務---數據刷新***/
void T1_refresh(void)
{  
  n=(++n)%4;
  //PORTC |=0X0F;             //關閉位選(必須)
  PORTC =0X0F;
  PORTD = segcode[n];       //傳送數據位                                            
  switch(n)
  {
        case 0: PORTC = ~0x01;        //顯示千位
                break;
        case 1: PORTC = ~0x02;       
                break;          //顯示百位
        case 2: PORTC = ~0x04;
                break;          //顯示十位               
        case 3: PORTC = ~0x08;
                break;          //顯示個位            
             
        default:  break;   
  }                  
  TIFR1  = 0X02;            //清標志
}



/***譯碼函數***/
void decode(uchar *num)
{
  if(digit==1)
  {
    segcode[3]=disp[num[3]];
  }
  else if(digit==2)
  {
    segcode[3]=disp[num[3]];   
    segcode[2]=disp[num[2]];   
  }
  else if(digit==3)
  {
    segcode[3]=disp[num[3]];   
    segcode[2]=disp[num[2]];   
    segcode[1]=disp[num[1]];   
  }
  else if(digit>3)
  {
    segcode[3]=disp[num[3]];    //個位
    segcode[2]=disp[num[2]];    //十位
    segcode[1]=disp[num[1]];    //百位
    segcode[0]=disp[num[0]];    //千位
  }
  else
  ;


  // segcode[0] &= ~0x80;     // 加小數點
}


/***輸入移位函數***/
void Digit_Move(uchar *b)
{
  uchar i,j;
  for(i=0;i<3;i++)
  {
    b[i]=b[i+1];
  }
  b[3]=key;

}

/***按鍵掃描及數據處理***/
void KEY_Scan(void)
{
            //keycode = (~PINB)&0X0F;  //記錄按鍵在第幾行
          PORTB   = ~0X10;         //掃描第一列
          delay(10);
          keycode = (~PINB)&0X0F;
          while(PINB!=~0X10);      //等待按鍵釋放(消抖)
          
          //delay(20000);
      switch(keycode)          //讀取鍵值
      {
             case 0X01: key=0; Digit_Move(data); digit++;decode(data);break;
      case 0X02: key=1; Digit_Move(data); digit++;decode(data);break;
      case 0X04: key=2; Digit_Move(data); digit++;decode(data);break;
      case 0X08: key=3; Digit_Move(data); digit++;decode(data);break;
          default:break;
      }
          
          PORTB = ~0X20;delay(10);
     keycode = (~PINB) & 0X0F;
          while(PINB!=~0X20);
          
        //delay(20000);
      switch(keycode)
      {
      case 0X01: key=4; Digit_Move(data); digit++;decode(data);break;
      case 0X02: key=5; Digit_Move(data); digit++;decode(data);break;
      case 0X04: key=6; Digit_Move(data); digit++;decode(data);break;
      case 0X08: key=7; Digit_Move(data); digit++;decode(data);break;
          default:break;
      }


          PORTB = ~0X40;delay(10);
      keycode = (~PINB) & 0X0F;
          while(PINB!=~0X40);
          
        //delay(20000);
      switch(keycode)
      {
      case 0X01: key=8; Digit_Move(data); digit++;decode(data);break;
      case 0X02: key=9; Digit_Move(data); digit++;decode(data);break;
      case 0X04: key=10;Digit_Move(data); digit++;decode(data);break;
      case 0X08: key=11;Digit_Move(data); digit++;decode(data);break;
          default:break;
      }


      PORTB = ~0X80;delay(10);
      keycode = (~PINB) & 0X0F;
          while(PINB!=~0X80);
          
         //delay(20000);
      switch(keycode)
      {
      case 0X01: key=12;Digit_Move(data); digit++;decode(data);break;
      case 0X02: key=13;Digit_Move(data); digit++;decode(data);break;
      case 0X04: key=14;Digit_Move(data); digit++;decode(data);break;
      case 0X08: key=15;Digit_Move(data); digit++;decode(data);break;
          default:break;
      }
       
}


/***主函數***/
void main(void)
{
  CLI();
  IO_Init();
  T1_Init() ;
  SEI();
  while(1)
  {
    PORTB = 0X0F;
        keycode = (~PINB)&0X0F;  
             
    if(KEY_Press)       //檢測按鍵是否按下
        {
      KEY_Scan();
        }
        delay(30000);
  }
}














/*void delay(uint ms)
{
        uint i,j;
           for(i=0;i<ms;i++)
           {
           for(j=0;j<1141;j++);
       }
}*/


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产 | 亚洲国产第一页 | 国产一区久久久 | 成人欧美| 91在线播| 日日干干夜夜 | 综合一区二区三区 | 中文字幕亚洲欧美 | 国产农村妇女毛片精品久久麻豆 | 国产精品国产a级 | 国产一级片久久久 | 毛片网络| 波多野结衣二区 | 蜜桃传媒av | 国产美女久久久 | 精品91久久久 | 最新国产精品 | 91久久精品视频 | 日韩美香港a一级毛片免费 国产综合av | 国产传媒在线观看 | 午夜国产一区 | 成人午夜免费视频 | aaa在线| 精精国产xxxx视频在线播放7 | 欧美日一区二区 | 午夜av一区二区 | 亚洲国产乱码 | 国产乱xxav| 91精品国产综合久久精品 | 中文字幕一区二区三区精彩视频 | 天堂av免费观看 | 中文字幕一级 | 精品久久久久久久久久久久久久 | 亚洲 中文 欧美 日韩 在线观看 | 欧美一区二区三区视频在线观看 | 成人网av | 91一区 | 亚洲国产精品99久久久久久久久 | 欧美日韩在线视频一区二区 | 国产av毛片 | 亚洲欧美在线观看视频 |