找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5504|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)PS/2協(xié)議的應(yīng)用——PS/2的鍵盤程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71259 發(fā)表于 2014-12-30 23:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
/*

     PS/2協(xié)議的應(yīng)用:(常見的有PS/2接口鼠標(biāo)、鍵盤等)用PS/2的鍵盤控制單片機(jī),用字符型液晶顯示器1602簡單

                                        顯示鍵盤的輸入值

                                     由于at89s52單片機(jī)的工作頻率過低,不易掃描更多鍵值


*/

  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit psda=P3^0;
  5. uchar keyvalue;
  6. uint keynum;
  7. uchar BIT;
  8. uchar temp;
  9. uint j=0;
  10. uchar  table1[3];
  11. sbit lcden=P2^6;
  12. sbit lcdrs=P2^4;
  13. sbit lcdrw=P2^5;
  14. sbit dula=P3^7;
  15. uchar num;
  16. uchar code table2[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'`',        //0-15
  17.       0,0,0,0,0,'Q','1',0,0,0,'Z','S','A','W','2',0,        //16-31
  18.       0,'C','X','D','E','4','3',0,0,0x20,'V','F','T','R','5',0,      //32-47
  19.       0,'N','B','H','G','Y','6',0,0,0,'M','J','U','7','8',0, //48-63
  20.       0,',','K','I','O','0','9',0,0,'.','/','L',';','P','-',0,//64-79
  21.       0,0,0,0,'[','=',0,0,0,0,0,']',0,'|',0,0,               //80-95
  22.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                //96-111
  23.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,         //112-127
  24.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,              //128-143
  25.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,           //144-159
  26.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,          //160-175
  27.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,         //176-191
  28.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,       //192-207
  29.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,          //208-223
  30.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,        //224-239
  31.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0          //240-255
  32.      };
  33. void delay(uint z)
  34. {
  35. uint x,y;
  36. for(x=z;x>0;x--)
  37.   for(y=11;y>0;y--);
  38. }
  39. void write_com(uchar com)
  40. {
  41. lcdrs=0;
  42. P0=com;
  43. delay(5);
  44. lcden=1;
  45. delay(10);
  46. lcden=0;
  47. delay(10);

  48. }
  49. void write_data(uchar _data)
  50. {
  51. lcdrs=1;
  52. P0=_data;
  53. delay(5);
  54. lcden=1;
  55. delay(10);
  56. lcden=0;
  57. delay(10);
  58. }
  59. void _init_()
  60. {
  61. IT0=1;//外部中斷下降沿觸發(fā)
  62. EX0=1;//開外部0中斷
  63. EA=1;//開總中斷
  64. dula=1;
  65. lcdrw=0;
  66. write_com(0x01);
  67. write_com(0x38);//指令(001 DL N F 00)表示:DL=1,8數(shù)據(jù)位;N=1,位移寬度為2倍;F=1,5*10;F=0,5*7;
  68. write_com(0x0f);//指令(00001DCB)表示:D=1,開顯示;C=1,顯示光標(biāo);B=1,光標(biāo)閃爍
  69. write_com(0x06);//指令(000001[I/D]S)表示:N=1,地址加一;[I/D]=0,地址減一;S=1,開整屏移動(dòng)
  70. write_com(0x80);//第一行:0x80+(字符序號(hào)【0--f】);第二行:0xc0+(字符序號(hào)【0--f】)

  71. }void main()
  72. {
  73. _init_();
  74. while(1)
  75. {
  76.   if(keynum==3)
  77.   {
  78.    keynum=0;
  79.    temp=table1[0];
  80.    if((j%32>0)&&(j%16==0))
  81.    {
  82.     write_com(0xc0);
  83.    }
  84.    if((j%32==0)&&(j%16==0))
  85.    {write_com(0x80);}
  86.    write_data(table2[temp]);
  87.    j++;
  88.   }
  89.   

  90. }
  91. }
  92. void int0 () interrupt 0
  93. {
  94. if((BIT>0)&&(BIT<9))
  95. {
  96.   keyvalue=keyvalue>>1;
  97.   if(psda)
  98.    keyvalue=keyvalue|0x80;
  99. }
  100. BIT++;
  101. if(BIT>10)
  102. {
  103.   BIT=0;
  104.   table1[keynum]=keyvalue;
  105.   keynum++;

  106. }

  107. }
復(fù)制代碼




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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表