單片機(jī)應(yīng)用PS/2鍵盤的實(shí)例
發(fā)布時(shí)間:2007/9/10 0:00:00 訪問次數(shù):859
SMC1602A(16*2)模擬口線接線方式
連接線圖:
---------------------------------------------------
|LCM-----51 | LCM-----51 | LCM------51 |
--------------------------------------------------|
|DB0-----P1.0 | DB4-----P1.4 | RW-------P2.0 |
|DB1-----P1.1 | DB5-----P1.5 | RS-------P2.1 |
|DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 |
|DB3-----P1.3 | DB7-----P1.7 | VLCD接1K電阻到GND|
---------------------------------------------------
Keyboard接線
PS/2--------51
1 DATA------P3.4
3 GND
4 VCC
5 CLK-------P3.3 接在51的外部中斷,觸發(fā)方式為低電平
本程序源碼只供學(xué)習(xí)參考,不得應(yīng)用于商業(yè)用途,如有需要請聯(lián)系作者。
[注:AT89x51使用12M或11.0592M晶振,實(shí)測使用11.0592M]
[Keil uV2 7.01編譯運(yùn)行通過 程序中沒有做鍵盤數(shù)據(jù)的奇偶校驗(yàn)]
=============================================================*/
#include
#include "scancodes.h"
#define LCM_RW P2_0 //定義LCD引腳
#define LCM_RS P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Key_Data P3_4 //定義Keyboard引腳
#define Key_CLK P3_3
#define Busy 0x80 //用于檢測LCM狀態(tài)字中的Busy標(biāo)識
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void Decode(unsigned char ScanCode);
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
unsigned char code cdle_net[] = {"www.cdle.net--"};
unsigned char code email[] = {"pnzwzw@cdle.net"};
unsigned char code Cls[] = {" "};
static unsigned char IntNum = 0; //中斷次數(shù)計(jì)數(shù)
static unsigned char KeyV; //鍵值
static unsigned char DisNum = 0; //顯示用指針
static unsigned char Key_UP=0, Shift = 0;//Key_UP是鍵松開標(biāo)識,Shift是Shift鍵按下標(biāo)識
static unsigned char BF = 0; //標(biāo)識是否有字符被收到
void main(void)
{
unsigned char TempCyc;
Delay400Ms(); //啟動等待,等LCM講入工作狀態(tài)
LCMInit(); //LCM初始化
Delay5Ms(); //延時(shí)片刻(可不要)
DisplayListChar(0, 0, cdle_net);
DisplayListChar(0, 1, email);
ReadDataLCM();//測試用句無意義
for (TempCyc=0; TempCyc<10; TempCyc++)
Delay400Ms(); //延時(shí)
DisplayListChar(0, 1, Cls);
IT1 = 0; //設(shè)外部中斷1為低電平觸發(fā)
EA = 1;
EX1 = 1; //開中斷
do
{
if (BF)
Decode(KeyV);
else
EA = 1; //開中斷
}
while(1);
}
//寫數(shù)據(jù)
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在這后加小的延時(shí)
LCM_E = 0; //延時(shí)
LCM_E = 1;
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時(shí)忽略忙檢測
{
if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LC
SMC1602A(16*2)模擬口線接線方式
連接線圖:
---------------------------------------------------
|LCM-----51 | LCM-----51 | LCM------51 |
--------------------------------------------------|
|DB0-----P1.0 | DB4-----P1.4 | RW-------P2.0 |
|DB1-----P1.1 | DB5-----P1.5 | RS-------P2.1 |
|DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 |
|DB3-----P1.3 | DB7-----P1.7 | VLCD接1K電阻到GND|
---------------------------------------------------
Keyboard接線
PS/2--------51
1 DATA------P3.4
3 GND
4 VCC
5 CLK-------P3.3 接在51的外部中斷,觸發(fā)方式為低電平
本程序源碼只供學(xué)習(xí)參考,不得應(yīng)用于商業(yè)用途,如有需要請聯(lián)系作者。
[注:AT89x51使用12M或11.0592M晶振,實(shí)測使用11.0592M]
[Keil uV2 7.01編譯運(yùn)行通過 程序中沒有做鍵盤數(shù)據(jù)的奇偶校驗(yàn)]
=============================================================*/
#include
#include "scancodes.h"
#define LCM_RW P2_0 //定義LCD引腳
#define LCM_RS P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Key_Data P3_4 //定義Keyboard引腳
#define Key_CLK P3_3
#define Busy 0x80 //用于檢測LCM狀態(tài)字中的Busy標(biāo)識
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void Decode(unsigned char ScanCode);
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
unsigned char code cdle_net[] = {"www.cdle.net--"};
unsigned char code email[] = {"pnzwzw@cdle.net"};
unsigned char code Cls[] = {" "};
static unsigned char IntNum = 0; //中斷次數(shù)計(jì)數(shù)
static unsigned char KeyV; //鍵值
static unsigned char DisNum = 0; //顯示用指針
static unsigned char Key_UP=0, Shift = 0;//Key_UP是鍵松開標(biāo)識,Shift是Shift鍵按下標(biāo)識
static unsigned char BF = 0; //標(biāo)識是否有字符被收到
void main(void)
{
unsigned char TempCyc;
Delay400Ms(); //啟動等待,等LCM講入工作狀態(tài)
LCMInit(); //LCM初始化
Delay5Ms(); //延時(shí)片刻(可不要)
DisplayListChar(0, 0, cdle_net);
DisplayListChar(0, 1, email);
ReadDataLCM();//測試用句無意義
for (TempCyc=0; TempCyc<10; TempCyc++)
Delay400Ms(); //延時(shí)
DisplayListChar(0, 1, Cls);
IT1 = 0; //設(shè)外部中斷1為低電平觸發(fā)
EA = 1;
EX1 = 1; //開中斷
do
{
if (BF)
Decode(KeyV);
else
EA = 1; //開中斷
}
while(1);
}
//寫數(shù)據(jù)
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在這后加小的延時(shí)
LCM_E = 0; //延時(shí)
LCM_E = 1;
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時(shí)忽略忙檢測
{
if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LC
熱門點(diǎn)擊
- AVR單片機(jī)在蓄電池剩余電量測試儀中的應(yīng)用
- 基于單片機(jī)系統(tǒng)采用DMA塊傳輸方式實(shí)現(xiàn)高速數(shù)
- BS2系統(tǒng)編程與應(yīng)用實(shí)例
- ASM5無參數(shù)化調(diào)用C51函數(shù)的實(shí)現(xiàn)
- 便攜式動態(tài)心電信號數(shù)據(jù)采集器的設(shè)計(jì)
- 單片機(jī)控制的雙路有源濾波器設(shè)計(jì)
- SmartLock并口單片機(jī)軟件狗加密技術(shù)
- 單片機(jī)應(yīng)用PS/2鍵盤的實(shí)例
- 單片機(jī)查表程序的自動生成技術(shù)
- TMS320LF/LC240X系列DSP與微
推薦技術(shù)資料
- 硬盤式MP3播放器終級改
- 一次偶然的機(jī)會我結(jié)識了NE0 2511,那是一個(gè)遠(yuǎn)方的... [詳細(xì)]
- CV/CC InnoSwitch3-AQ 開
- URF1DxxM-60WR3系
- 1-6W URA24xxN-x
- 閉環(huán)磁通門信號調(diào)節(jié)芯片NSDRV401
- SK-RiSC-SOM-H27X-V1.1應(yīng)
- RISC技術(shù)8位微控制器參數(shù)設(shè)
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究