<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>
    以文本方式查看主題

    -  曙海教育集團論壇  (http://www.hufushizhe.com/bbs/index.asp)
    --  單片機初中級  (http://www.hufushizhe.com/bbs/list.asp?boardid=55)
    ----  單片機鍵盤輸入編程  (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=55&id=2215)

    --  作者:wangxinxin
    --  發布時間:2010-12-7 14:42:44
    --  單片機鍵盤輸入編程

    線接P1.4~P1.7。行列式鍵盤輸入適合于按鍵輸入多的情況,如有16個按鍵輸入,用簡單按鍵輸入用要占用2個輸入口(共16位),而使用行列式鍵盤輸入只需占用一個輸入口(8位)。但行列式鍵盤輸入軟件編寫較復雜,對初學者而言有一定的難度。
      
      以上略談了一下按鍵輸入的情況。在很多狀態下,按鍵輸入的值要同時要在LED數碼管上顯示出來。如一個按鍵設計為輸入遞增(加法)鍵,可以設計成每點按一下,數值遞增加1,同時在LED數碼管上顯示出來;也可設計成持續按下時,數值以一定時間間隔(如0.3秒)累加。但是當欲輸入值較大時(如三位LED數碼管作輸入顯示時的輸入值最大為999),則可能按下鍵的時間太長(最長達300秒),看來這種方式只適用于一位或至多兩位數值(最大99)的輸入。當然你也可多設幾個鍵,每個鍵只負責一位數值的輸入,但這樣會占用較多的口線,浪費寶貴的硬件資源。
      大家可能見到過,一些進口的溫度控制器(如日本RKC INSTRUMENT INC. 生產的REX_C700溫控器)的面板設計為:溫度測量值用4位LED數碼管顯示,輸入設定值顯示也用4位LED數碼管,輸入按鍵只有4個,一個為“模式設定鍵”,一個為“左移鍵”,另兩個為“加法鍵”、“減法鍵”。欲輸入設定值(溫控值)時,按一下“模式設定鍵”,程序進入設定狀態,此時輸入設定值顯示的4位LED數碼管中,個位顯示最亮(穩定顯示),而十、百、千位顯示較暗(有閃爍感),說明可對個位進行輸入。按下“加法鍵”或“減法鍵”,即可輸入個位數的值;點按一下“左移鍵”,變為十位顯示最亮,而個、百、千位顯示較暗,說明可對十位進行輸入。按下“加法鍵”或“減法鍵”,即可輸入十位數的值;……這樣可完成4位數的輸入。完成輸入后,再按一下“模式設定鍵”,程序即退出設定狀態,進入工作運行。用這種輸入方法,不僅輸入4位數用4個鍵即可,再多位(5位至24位)的輸入也用這4個鍵就夠了。
      
    大家了解了這種新穎的按鍵輸入方式后,一定很感興趣,也想掌握設計方法。為了便于大家理解,這里結合筆者設計的一款“節能時控器”,詳細進行講解。“節能時控器”用于定時控制大功率電器工作,因現采用分時計費方法,可起到節約開支的作用,對工業生產成效顯著。
      
    圖3為“節能時控器”硬件構成原理圖。“節能時控器”共有4個輸入按鍵:set--模式設定鍵,left--左移鍵,up—加法鍵,on/off--定時1、2啟動/關閉鍵。單片機IC1(AT89C2051)只有15條I/O線,由于受I/O線數量限制,因此P1口中的P1.0~P1.3既作為驅動4位LED數碼管的數據輸出一部分,同時也用作按鍵的輸入。無疑,這種方式大大節約了硬件的I/O線,但也給編程者提出了更高的技術要求。限于篇幅,我們只對要詳解的按鍵輸入程序進行分析,其它部分只略作介紹。如讀者需“節能時控器”詳細的源程序,可以Email圖片點擊可在新窗口打開查看uyuandz@163.com與作者聯系。

      圖4為主程序狀態流程圖。可見主程序只負責進行走時或調整時間的運算及顯示,而判斷按鍵輸入則放在T1定時中斷(10mS)服務子程序中。T0作為走時的基準被設置為100mS定時中斷。這種設計的優點是大大簡化了主程序設計,并且CPU會定時關心鍵盤,只要定時中斷時間足夠短(如為幾十mS),就不會漏掉每一次的按鍵輸入。
      
    下面為判斷按鍵輸入的T1定時中斷服務子程序,序號為解釋方便而加。

    序號  
    1:void zd1(void) interrupt 3
            
    2:{
            
    3:uchar i,j;i=P1;j=P3;
            
    4:TH1=-(5000/256);
            
    5:TL1=-(5000%256);
            
    6:if(m==1)n++;
            
    7:if(n>=30){n=0;m=0;}
            
    8:P3_7=0;
            
    9:P1=0xff;
            
    10:if(P1!=0xff)
            
    11:{
            
    12:if(n==0)m=1;
            
    13:{if(n==1)
            
    14:{
            
    15:if(P1_0==0){set++;left=0;}
            
    16:if(set>=4)set=0;
            
    17:if(set==1)flag=0x55;
            
    18:if(P1_1==0)left++;
            
    19:if(left>=4)left=0;
            
    20:if(P1_2==0){up++;
            
    21:switch(left)
            
    22:{
            
    23:case 0:{if(up>=10)up=0;}break;
            
    24:case 1:{if(up>=6)up=0;}break;
            
    25:case 2:{if(up>=10)up=0;}break;
            
    26:case 3:{if(up>=3)up=0;}break;
            
    27:default:break;
            
    28:}
            
    29:}
            
    30:if(P1_2==0){
            
    31:switch(set)
            
    32:{case 0:break;
            
    33:case 1圖片點擊可在新窗口打開查看[left]=up;break;
            
    34:case 2:{y[left]=up;if(P1_3==0)o_f1=!o_f1;}break;
            
    35:case 3:{z[left]=up;if(P1_3==0)o_f2=!o_f2;}break;
            
    36:default:break;
            
    37:}
    }
            
    38:else {
            
    39:switch(set)
            
    40:{case 0:break;
            
    41:case 1:up=x[left];break;
            
    42:case 2:{up=y[left];if(P1_3==0)o_f1=!o_f1;}break;
            
    43:case 3:{up=z[left];if(P1_3==0)o_f2=!o_f2;}break;
            
    44:default:break;}
    45   
    :}}
            
    46:}}
            
    47:P1=i圖片點擊可在新窗口打開查看3=j;
            
    48:}
      
    序號1(程序解釋,以下同):聲明定時1中斷函數。
      
    序號2:定時1中斷函數開始。
      
    序號3:定義i、j為無符號字符型局部變量。將當時的P1口、P3口狀態送i、j暫存。
      
    序號4、5:定時器T1重新載入10mS初值。
      
    序號6:如變量m等于1,則變量n遞增。說明:m、n為整個程序開始時定義的無符號字符型全局變量。
      
    序號7:如變量n大于等于30,則m、n清零。
      
    序號8:P3.7置0,準備讀取按鍵輸入。
      
    序號9:P1口置全1,準備讀取按鍵輸入。
      
    序號10:如果P1口不等于全1,說明4個按鍵中有鍵按下。
      
    序號11:進入if(P1!=0xff)語句范圍。
      
    序號12:如果n等于0,進入if(n==0)語句,m置1。
      
    序號13:如果n等于1,進入if(n==1)語句,同時進行下面的具體判斷按鍵語句。作用效果為:開始時m、n均賦0,一旦有鍵按下,第一次中斷產生時m賦1;第二次中斷產生時n遞增。當n等于1時(第二次中斷產生)進入下面的具體判斷按鍵語句。若持續按下鍵,則第三次中斷產生~第三十一次中斷產生時,程序不進入具體的判斷按鍵語句過程(因這時n不等于1)。由于中斷每10mS產生一次,這樣可實現每0.31秒(31x10=0.31秒)進行一次加法或移位的操作,與人眼的視覺特性相吻合。
      
    序號14:進入具體判斷按鍵語句范圍。
      
    序號15:如果P1.0等于0(即電路中的set鍵按下),變量set遞增,變量left清0。說明:set、left是為了判斷模式設定及左移而在整個程序開始時定義的無符號字符型全局變量。
      
    序號16:如果set大于等于4,則set清0。說明:set值只能在0~3間變化,只有4種工作模式(走時及輸出控制模式、走時調整模式、定時1調整模式、定時2調整模式)。
      
    序號17:在set等于1時,向RAM區標志變量flag寫入55H。說明:flag是在整個程序開始時定義的無符號字符型全局變量,用作判斷RAM區是否受干擾的依據。


    主站蜘蛛池模板: 国亚洲欧美日韩精品| 亚洲人成网站日本片| 又爽又黄有又色的视频| 八戒网站免费观看视频| 国产午夜爽爽窝窝在线观看| 国产大片黄在线播放| 国产亚洲综合激情校园小说| 国产乱了真实在线观看| 动漫做羞羞的视频免费观看| 人妻无码一区二区三区免费| 亚洲综合丁香婷婷六月香| 亚洲欧美日韩在线观看看另类| 亚洲精品动漫人成3d在线| 亚洲av之男人的天堂| 久在线精品视频| 乱人伦中文字幕电影| 久久久久国产精品免费免费搜索| 一男一女的一级毛片| eeuss影院www天堂免费| 黄色一级视频免费观看| 视频aavvmm国产野外| 看黄软件免费看在线观看| 正在播放国产夫妻| 欧洲熟妇色xxxx欧美老妇多毛 | 国产成人综合久久久久久| 四虎影院永久免费观看| 亚洲综合久久1区2区3区| 久久精品国产亚洲AV水果派| 一本色道久久88精品综合| 97人人模人人爽人人喊6| 黄网视频在线观看| 精品久久久久久无码中文字幕| 欧美夫妇交换俱乐部在线观看 | 最新中文字幕在线| 日本高清乱理论片| 毛片在线免费观看网站| 波多野结衣不打码视频| 日本精品少妇一区二区三区| 在线观看无码的免费网站| 国产在线精品一区二区在线看| 免费人成黄页在线观看国产|