資源簡(jiǎn)介
用單片機(jī)控制鍵盤的程序,利用中斷獲得鍵盤掃描碼并轉(zhuǎn)換為ASCII碼,在1602液晶上顯示字符。C語言編寫,KEIL環(huán)境下編譯,鍵盤驅(qū)動(dòng)寫得相當(dāng)好。
CSDN系統(tǒng)自動(dòng)把下載積分改成10分了。現(xiàn)在能修改所需積分,改回1分意思一下。

代碼片段和文件信息
/*============================================================
????????使用1602液晶顯示和PS/2鍵盤的示例??
????????-------------------------------------------------
???????????
==============================================================
SMC1602A(16*2)模擬口線接線方式
連接線圖:
???????---------------------------------------------------
???????|LCM-----51???| LCM-----51???| LCM------51??????|
???????--------------------------------------------------|
???????|DB0-----P1.0?| DB4-----P1.4?| RW-------P2.1????|
???????|DB1-----P1.1?| DB5-----P1.5?| RS-------P2.0????|
???????|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ā)方式為低電平
[注:AT89x51使用12M或11.0592M晶振實(shí)測(cè)使用11.059M
[Keil?uV2?7.01編譯運(yùn)行通過?程序中沒有做鍵盤數(shù)據(jù)的奇偶校驗(yàn)]
=============================================================*/
#include?
#include?“scancodes.h“
#define?LCM_RW??P2_1?//定義LCD引腳
#define?LCM_RS??P2_0
#define?LCM_E???P2_2
#define?LCM_Data??P0
#define?Key_Data?P3_4?//定義Keyboard引腳
#define?Key_CLK??P3_3
#define?Busy????0x80?//用于檢測(cè)LCM狀態(tài)字中的Busy標(biāo)識(shí)
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?WCLCMBuysC);
unsigned?char?ReadDataLCM(void);
unsigned?char?ReadStatusLCM(void);
unsigned?char?code?cdle_net[]?=?{“??www.pp51.com??“};
unsigned?char?code?email[]?=?{“pp51com@163.com“};
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)識(shí),Shift是Shift鍵按下標(biāo)識(shí)
static?unsigned?char?BF?=?0;?//標(biāo)識(shí)是否有字符被收到
void?main(void)
{
unsigned?char?TempCyc;
Delay400Ms();?//啟動(dòng)等待,等LCM講入工作狀態(tài)
LCMInit();?//LCM初始化
Delay5Ms();?//延時(shí)片刻(可不要)
DisplayListChar(0?0?cdle_net);
DisplayListChar(0?1?email);
ReadDataLCM();//測(cè)試用句無意義
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();?//檢測(cè)忙
LCM_Data?=?WDLCM;
LCM_RS?=?1;
LCM_RW?=?0;
LCM_E?=?0;?//若晶振速度太高可以在這后加小的延時(shí)
LCM_E?=?0;?//延時(shí)
LCM_E?=?1;
}
//寫指令
void?WriteCommandLCM(unsigned?char?WCLCMBuysC)?//BuysC為0時(shí)忽略忙檢測(cè)
{
if?(BuysC)?ReadStatusLCM();?//根據(jù)需要檢測(cè)忙
LCM_Data?=?WCLCM;
LCM_RS?=?0;
LCM_RW?=?0;
LCM_E?=?0;
LCM_E?=?0;
LCM_E?=?1;
}
//讀數(shù)據(jù)
unsigned?char?ReadDataLCM(void)
{
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件??????14653??2008-04-27?13:04??PS2Key\PS2Key.M51
?????文件???????6942??2005-05-28?20:23??PS2Key\PS2Key.c
?????文件????????504??2008-04-27?13:10??PS2Key\PS2Key.plg
?????文件???????1506??2004-03-03?21:00??PS2Key\scancodes.h
????.......??????1660??2005-05-28?20:23??PS2Key\PS2Key_Uv2.Bak
?????文件???????1942??2008-04-27?13:04??PS2Key\PS2Key.Uv2
????.......???????829??2005-05-28?20:24??PS2Key\PS2Key_Opt.Bak
?????文件????????858??2008-04-27?13:04??PS2Key\PS2Key.Opt
?????文件??????15118??2008-04-27?13:04??PS2Key\PS2Key.LST
?????文件??????14123??2008-04-27?13:04??PS2Key\PS2Key.OBJ
?????文件??????12019??2008-04-27?13:04??PS2Key\PS2Key
?????文件???????3158??2008-04-27?13:04??PS2Key\PS2Key.hex
?????目錄??????????0??2008-04-27?13:03??PS2Key
-----------?---------??----------?-----??----
????????????????73312????????????????????13
評(píng)論
共有 條評(píng)論