📄 单片机应用ps-2键盘的实例.htm
字号:
<P>Delay400Ms(); //启动等待,等LCM讲入工作状态<BR>LCMInit();
//LCM初始化 <BR>Delay5Ms(); //延时片刻(可不要)</P>
<P>DisplayListChar(0, 0,
cdle_net);<BR>DisplayListChar(0, 1,
email);<BR>ReadDataLCM();//测试用句无意义<BR>for
(TempCyc=0; TempCyc<10;
TempCyc++)<BR>Delay400Ms();
//延时<BR>DisplayListChar(0, 1, Cls); <BR><BR>IT1 =
0; //设外部中断1为低电平触发<BR>EA = 1;<BR>EX1 = 1; //开中断</P>
<P>do<BR>{<BR>if
(BF)<BR>Decode(KeyV);<BR>else<BR>EA = 1;
//开中断<BR>}<BR>while(1);<BR>}</P>
<P>//写数据<BR>void WriteDataLCM(unsigned char WDLCM)
<BR>{<BR>ReadStatusLCM(); //检测忙<BR>LCM_Data =
WDLCM;<BR>LCM_RS = 1;<BR>LCM_RW = 0;<BR>LCM_E = 0;
//若晶振速度太高可以在这后加小的延时<BR>LCM_E = 0; //延时<BR>LCM_E =
1;<BR>}</P>
<P>//写指令<BR>void WriteCommandLCM(unsigned char
WCLCM,BuysC) //BuysC为0时忽略忙检测<BR>{<BR>if (BuysC)
ReadStatusLCM(); //根据需要检测忙<BR>LCM_Data =
WCLCM;<BR>LCM_RS = 0;<BR>LCM_RW = 0; <BR>LCM_E =
0;<BR>LCM_E = 0;<BR>LCM_E = 1; <BR>}</P>
<P>//读数据<BR>unsigned char
ReadDataLCM(void)<BR>{<BR>LCM_RS = 1; <BR>LCM_RW =
1;<BR>LCM_E = 0;<BR>LCM_E = 0;<BR>LCM_E =
1;<BR>return(LCM_Data);<BR>}</P>
<P>//读状态<BR>unsigned char
ReadStatusLCM(void)<BR>{<BR>LCM_Data = 0xFF;
<BR>LCM_RS = 0;<BR>LCM_RW = 1;<BR>LCM_E =
0;<BR>LCM_E = 0;<BR>LCM_E = 1;<BR>while (LCM_Data
& Busy); //检测忙信号<BR>return(LCM_Data);<BR>}</P>
<P>void LCMInit(void) //LCM初始化<BR>{<BR>LCM_Data =
0;<BR>WriteCommandLCM(0x38,0);
//三次显示模式设置,不检测忙信号<BR>Delay5Ms();
<BR>WriteCommandLCM(0x38,0);<BR>Delay5Ms();
<BR>WriteCommandLCM(0x38,0);<BR>Delay5Ms(); </P>
<P>WriteCommandLCM(0x38,1);
//显示模式设置,开始要求每次检测忙信号<BR>WriteCommandLCM(0x08,1);
//关闭显示<BR>WriteCommandLCM(0x01,1); //显示清屏
<BR>WriteCommandLCM(0x06,1); //
显示光标移动设置<BR>WriteCommandLCM(0x0F,1); //
显示开及光标设置<BR>}</P>
<P>//按指定位置显示一个字符<BR>void DisplayOneChar(unsigned
char X, unsigned char Y, unsigned char
DData)<BR>{<BR>Y &= 0x1;<BR>X &= 0xF;
//限制X不能大于15,Y不能大于1<BR>if (Y) X |= 0x40;
//当要显示第二行时地址码+0x40;<BR>X |= 0x80;
//算出指令码<BR>WriteCommandLCM(X, 1);
//发命令字<BR>WriteDataLCM(DData); //发数据<BR>}</P>
<P>//按指定位置显示一串字符<BR>void DisplayListChar(unsigned
char X, unsigned char Y, unsigned char code
*DData)<BR>{<BR>unsigned char ListLength;</P>
<P>ListLength = 0;<BR>Y &= 0x1;<BR>X &=
0xF; //限制X不能大于15,Y不能大于1<BR>while
(DData[ListLength]>0x19) //若到达字串尾则退出<BR>{<BR>if
(X <= 0xF)
//X坐标应小于0xF<BR>{<BR>DisplayOneChar(X, Y,
DData[ListLength]);
//显示单个字符<BR>ListLength++;<BR>X++;<BR>}<BR>}<BR>}</P>
<P>//5ms延时<BR>void Delay5Ms(void)<BR>{<BR>unsigned
int TempCyc = 5552;<BR>while(TempCyc--);<BR>}</P>
<P>//400ms延时<BR>void
Delay400Ms(void)<BR>{<BR>unsigned char TempCycA =
5;<BR>unsigned int
TempCycB;<BR>while(TempCycA--)<BR>{<BR>TempCycB=7269;<BR>while(TempCycB--);<BR>};<BR>}</P>
<P>void Keyboard_out(void) interrupt 2<BR>{<BR>if
((IntNum > 0) && (IntNum < 9))<BR>{
<BR>KeyV = KeyV >> 1;
//因键盘数据是低>>高,结合上一句所以右移一位<BR>if (Key_Data)
KeyV = KeyV | 0x80;
//当键盘数据线为1时为1到最高位<BR>}<BR>IntNum++;<BR>while
(!Key_CLK); //等待PS/2CLK拉高</P>
<P>if (IntNum > 10)<BR>{<BR>IntNum = 0;
//当中断11次后表示一帧数据收完,清变量准备下一次接收<BR>BF = 1;
//标识有字符输入完了<BR>EA = 0; //关中断等显示完后再开中断
(注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)<BR>}<BR>}</P>
<P>void Decode(unsigned char ScanCode)
//注意:如SHIFT+G为12H 34H F0H 34H F0H
12H,也就是说shift的通码+G的通码+shift的断码+G的断码<BR>{<BR>unsigned
char TempCyc; </P>
<P>if (!Key_UP) //当键盘松开时<BR>{<BR>switch
(ScanCode)<BR>{<BR>case 0xF0 : //
当收到0xF0,Key_UP置1表示断码开始<BR>Key_UP =
1;<BR>break;</P>
<P>case 0x12 : // 左 SHIFT<BR>Shift =
1;<BR>break;</P>
<P>case 0x59 : // 右 SHIFT<BR>Shift =
1;<BR>break;</P>
<P>default: <BR>if (DisNum >
15)<BR>{<BR>DisplayListChar(0, 1,
Cls);//清LCD第二行<BR>DisNum = 0; <BR>}<BR>if(!Shift)
//如果SHIFT没按下<BR>{<BR>for (TempCyc =
0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59);
TempCyc++); //查表显示<BR>if (UnShifted[TempCyc][0] ==
ScanCode) DisplayOneChar(DisNum, 1,
UnShifted[TempCyc][1]);<BR>DisNum++;<BR>} <BR>else
//按下SHIFT<BR>{<BR>for(TempCyc = 0;
(Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59);
TempCyc++); //查表显示<BR>if (Shifted[TempCyc][0] ==
ScanCode) DisplayOneChar(DisNum, 1,
Shifted[TempCyc][1]);<BR>DisNum++;<BR>}</P>
<P>break;<BR>}<BR>}<BR>else<BR>{ <BR>Key_UP =
0;<BR>switch (ScanCode) //当键松开时不处理判码,如G 34H F0H
34H 那么第二个34H不会被处理<BR>{<BR>case 0x12 : // 左
SHIFT<BR>Shift = 0;<BR>break;</P>
<P>case 0x59 : // 右 SHIFT<BR>Shift =
0;<BR>break;<BR>}<BR>}<BR>BF = 0; //标识字符处理完了<BR>}
<BR><BR>scancodes.h</P>
<P>unsigned char code UnShifted[59][2] =
{<BR>0x1C, 'a',<BR>0x32, 'b',<BR>0x21,
'c',<BR>0x23, 'd',<BR>0x24, 'e',<BR>0x2B,
'f',<BR>0x34, 'g',<BR>0x33, 'h',<BR>0x43,
'i',<BR>0x3B, 'j',<BR>0x42, 'k',<BR>0x4B,
'l',<BR>0x3A, 'm',<BR>0x31, 'n',<BR>0x44,
'o',<BR>0x4D, 'p',<BR>0x15, 'q',<BR>0x2D,
'r',<BR>0x1B, 's',<BR>0x2C, 't',<BR>0x3C,
'u',<BR>0x2A, 'v',<BR>0x1D, 'w',<BR>0x22,
'x',<BR>0x35, 'y',<BR>0x1A, 'z',<BR>0x45,
'0',<BR>0x16, '1',<BR>0x1E, '2',<BR>0x26,
'3',<BR>0x25, '4',<BR>0x2E, '5',<BR>0x36,
'6',<BR>0x3D, '7',<BR>0x3E, '8',<BR>0x46,
'9',<BR>0x0E, '`',<BR>0x4E, '-',<BR>0x55,
'=',<BR>0x5D, '\\',<BR>0x29, ' ',<BR>0x54,
'[',<BR>0x5B, ']',<BR>0x4C, ';',<BR>0x52,
'\'',<BR>0x41, ',',<BR>0x49, '.',<BR>0x4A,
'/',<BR>0x71, '.',<BR>0x70, '0',<BR>0x69,
'1',<BR>0x72, '2',<BR>0x7A, '3',<BR>0x6B,
'4',<BR>0x73, '5',<BR>0x74, '6',<BR>0x6C,
'7',<BR>0x75, '8',<BR>0x7D, '9',<BR>};</P>
<P>unsigned char code Shifted[59][2] = {<BR>0x1C,
'A',<BR>0x32, 'B',<BR>0x21, 'C',<BR>0x23,
'D',<BR>0x24, 'E',<BR>0x2B, 'F',<BR>0x34,
'G',<BR>0x33, 'H',<BR>0x43, 'I',<BR>0x3B,
'J',<BR>0x42, 'K',<BR>0x4B, 'L',<BR>0x3A,
'M',<BR>0x31, 'N',<BR>0x44, 'O',<BR>0x4D,
'P',<BR>0x15, 'Q',<BR>0x2D, 'R',<BR>0x1B,
'S',<BR>0x2C, 'T',<BR>0x3C, 'U',<BR>0x2A,
'V',<BR>0x1D, 'W',<BR>0x22, 'X',<BR>0x35,
'Y',<BR>0x1A, 'Z',<BR>0x45, '0',<BR>0x16,
'1',<BR>0x1E, '2',<BR>0x26, '3',<BR>0x25,
'4',<BR>0x2E, '5',<BR>0x36, '6',<BR>0x3D,
'7',<BR>0x3E, '8',<BR>0x46, '9',<BR>0x0E,
'~',<BR>0x4E, '_',<BR>0x55, '+',<BR>0x5D,
'|',<BR>0x29, ' ',<BR>0x54, '{',<BR>0x5B,
'}',<BR>0x4C, ':',<BR>0x52, '"',<BR>0x41,
'<',<BR>0x49, '>',<BR>0x4A, '?',<BR>0x71,
'.',<BR>0x70, '0',<BR>0x69, '1',<BR>0x72,
'2',<BR>0x7A, '3',<BR>0x6B, '4',<BR>0x73,
'5',<BR>0x74, '6',<BR>0x6C, '7',<BR>0x75,
'8',<BR>0x7D, '9',<BR>};<BR></P>
<P> </P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top align=middle>
<SCRIPT language=JavaScript src=""></SCRIPT>
</TD></TR></TBODY></TABLE><!-- #EndEditable --></TD>
<TD width=5><IMG height=1 src="单片机应用PS-2键盘的实例.files/zo.gif"
width=1></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD>
<TD> </TD></TR></TBODY></TABLE><!-- #BeginLibraryItem "/Library/页尾.lbi" -->
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD> </TD>
<TD width=760>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#cccc99 colSpan=4 height=1><IMG height=1
src="单片机应用PS-2键盘的实例.files/zo.gif" width=1></TD></TR>
<TR>
<TD height=18> <SPAN class=T12_B1>最佳浏览
800*600 </SPAN>访问量:<SPAN class=T1_B2>
<SCRIPT src="单片机应用PS-2键盘的实例.files/mystat.htm">
</SCRIPT>
</SPAN></TD>
<TD>
<DIV align=right><FONT color=#ffffff>~~~~scangoole~~~~</FONT>
Copyright(C) 2001-2004 <FONT color=#333399>www.<FONT
color=#cc0033>cdle</FONT>.net</FONT> All rights reserved.</DIV></TD>
<TD width=1 bgColor=#cccc99><IMG
src="单片机应用PS-2键盘的实例.files/zo.gif"></TD>
<TD width=18>
<DIV align=center><A
href="http://www.cdle.net/alldata/mywz/04030701_1.htm#TOP"><IMG
height=9 alt="GOTO TOP" src="单片机应用PS-2键盘的实例.files/go1.gif" width=6
align=middle border=0></A></DIV></TD></TR></TBODY></TABLE></TD>
<TD> </TD></TR></TBODY></TABLE><!-- #EndLibraryItem --><!-- #EndTemplate --></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -