2009年2月1日 星期日

農曆春節期間完成的 8051教學範例:實作 PS2 協訂的PC鍵盤實驗

趁著大過年期間,除了陪雙親到處拜拜以外(中國人的習俗),就是掌握屬於自己的時間,多少K一下書及好好的規劃一下今年該做什麼事^^,順便改寫一些韌體的範例。而我會利用時間將這段期間完成的技術心得,陸續貼到這個BLOG上。當然,提到BLOG,我想我將會自己架一個屬於自己的BLOG站台囉......(這也是春節這段期間規劃的)


原本我在MCS-8051實戰應用班的 LAB:8051實作 PS2 協訂的PC鍵盤實驗,僅是利用 PC的PS2鍵盤連接到8051開發板,可以以PS2鍵盤控制8051開發板上的Relay,也就是當按下連在MCS-8051開發板上PS2鍵盤的某按鍵,程式接收到該按鍵後,會觸發Relay接通;當按下Space鍵時,Relay便斷開。而原來的程式也會將按鍵對應的ASCII鍵值,顯示在 LED 上。


現在,我將其改寫成:在PS2鍵盤上可以輸入任何字串,當按下Enter鍵後,該字串會顯示在 LCD 上。第一次輸入的字串顯示在第一行,接著顯示在第二行,當再來的第三個字串輸入後, LCD 變成僅顯示第二次與第三次輸入的字串,也就是 LCD 上的字串將會上捲。


執行畫面如下: 這一張圖是全視圖,將PS2建盤與LCD接到 8051 開發板上,在PS2鍵盤先輸入 "HELLO CYH" 並按下 [Enter] 按鍵,再輸入"HI TCFST"並按下[Enter]按鍵,經由程式 將 Ps2的 make code 轉成 ASCII code 後顯示在 LCD上。第一行顯示 "HELLO CYH",第二行顯示 "HI TCFST":



這一張圖是近照圖,可以看到 LCD 上明確的在第一行顯示 "HELLO CYH",第二行顯示 "HI TCFST":



接著我在鍵盤又輸入 "I AM CYH." 之後按下 [Enter] 鍵,當再來的第三個字串輸入後, LCD 變成僅顯示第二次與第三次輸入的字串,也就是 LCD 上的字串已上捲。各位可以看到LCD目前第一行顯示 "HI TCFST",第二行顯示 "I AM CYH.":



程式如下所示: 


/*
*PS2toLCD.c  - A PS2 Keyboard in 8051 C program.
*Authored by YiHua,Chiang
*EMail: microcyh@seed.net.tw
*CYH' Blog: http://tw.myblog.yahoo.com/yh-chiang
*
*Copyright(C) 2009/02/10 http://tw.myblog.yahoo.com/yh-chiang
*/


#include <REGX51.h>
#include <intrins.h>


void procMakeCode(unsigned char makedata);
#include "myPS2.h"
void delay( unsigned int n1 );
void writeComm( unsigned char commdata );
void writeData( unsigned char showdata );
void initLCD(void);


void main(void)
{
  initLCD();
  writeComm( 0x80 );
  EA=1;
  EX0=1;
  IT0=1;
  charPos = 0;
  while(1)
  {
    if(BF)
      procMakeCode(makecode);
    else
      EA=1;
  }
}
void key_scan() interrupt 0 //外部中斷 0
{
  if((intNum>0)&&(intNum<9))
  {
    makecode=makecode>>1;
    if(key_data)
      makecode=makecode|0x80;
  }
  intNum++;
  while(!key_clk )
    if(intNum>10)
    {
      intNum=0;
      BF=1;
      EA=0;
    }
}
void initLCD(void)
{
  writeComm( 0x38 );
  delay( 1 );
  writeComm( 0x08 );
  delay( 1 );
  writeComm( 0x0C );
  delay( 1 );
  writeComm( 0x06 );
  delay( 1 );
  writeComm( 0x01 ); // clear LCD
  delay( 10 );
}
void writeComm( unsigned char commdata )
{
  En = 0;  RW = 0;   RS = 0;
  delay( 1 );
  DATA = commdata;
  delay( 1 );
  En = 1;
  delay( 1 );
  En = 0;
  delay( 1 );
}
void writeData( unsigned char showdata )
{
  En = 0;  RW = 0;   RS = 1;
  delay( 1 );
  DATA = showdata;
  delay( 1 );
  En = 1;
  delay( 1 );
  En = 0;
  delay( 1 );
}


3 則留言:

  1. 你好,我用keil把你的程式轉成hex檔的時候,出現了一些error,
    我想請問程式內的myPS2.h,可以在那裡找到,謝謝

    回覆刪除
  2. 我的email轉了是cristiano17_5@hotmail.com ,謝謝

    回覆刪除
  3. 請問!!  能不能˙用8051製作一個4*4的  PC鍵盤呢!!

    主要在PC能夠使用 按鍵

    回覆刪除

FPGA Verilog 的學習經驗,提供給要入門的新手

今天簡單說說 FPGA Verilog 的學習經驗,提供給要入門的新手: 1.對自己寫的FPGA Verilog程式,所生成的數位電路要心中有數。 這一點個人認為很重要,就正如寫 C語言,心中要能生成對應的組合語言一樣,我是這樣要求自己的。 雖然 FPGA Verilog語言...