/*============================================================
使ç¨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çå¤é¨ä¸æï¼è§¦åæ¹å¼ä¸ºä½çµå¹³
[注:AT89x51使ç¨12Mæ11.0592Mæ¶æ¯,å®æµä½¿ç¨11.059M
[Keil uV2 7.01ç¼è¯è¿è¡éè¿ ç¨åºä¸æ²¡æåé®çæ°æ®çå¥å¶æ ¡éª]
=============================================================*/
#include <at89x51.h>
#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 //ç¨äºæ£æµLCMç¶æåä¸çBusyæ è¯
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.89s51.com "};
unsigned char code email[] = {"
[email protected]"};
unsigned char code Cls[] = {" "};
static unsigned char IntNum = 0; //ä¸æ次æ°è®¡æ°
static unsigned char KeyV; //é®å¼
static unsigned char DisNum = 0; //æ¾ç¤ºç¨æé
static unsigned char Key_UP=0, Shift = 0;//Key_UPæ¯é®æ¾å¼æ è¯ï¼Shiftæ¯Shifté®æä¸æ è¯
static unsigned char BF = 0; //æ è¯æ¯å¦æå符被æ¶å°
void main(void)
{
unsigned char TempCyc;
Delay400Ms(); //å¯å¨çå¾
ï¼çLCM讲å
¥å·¥ä½ç¶æ
LCMInit(); //LCMåå§å
Delay5Ms(); //延æ¶çå»(å¯ä¸è¦)
DisplayListChar(0, 0, cdle_net);
DisplayListChar(0, 1, email);
ReadDataLCM();//æµè¯ç¨å¥æ æä¹
for (TempCyc=0; TempCyc<10; TempCyc++)
Delay400Ms(); //延æ¶
DisplayListChar(0, 1, Cls);
IT1 = 0; //设å¤é¨ä¸æ1为ä½çµå¹³è§¦å
EA = 1;
EX1 = 1; //å¼ä¸æ
do
{
if (BF)
Decode(KeyV);
else
EA = 1; //å¼ä¸æ
}
while(1);
}
//åæ°æ®
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //æ£æµå¿
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //è¥æ¶æ¯é度太é«å¯ä»¥å¨è¿åå å°ç延æ¶
LCM_E = 0; //延æ¶
LCM_E = 1;
}
//åæ令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0æ¶å¿½ç¥å¿æ£æµ
{
if (BuysC) ReadStatusLCM(); //æ ¹æ®éè¦æ£æµå¿
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
//读æ°æ®
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
//读ç¶æ
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //æ£æµå¿ä¿¡å·
return(LCM_Data);
}
void LCMInit(void) //LCMåå§å
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //ä¸æ¬¡æ¾ç¤ºæ¨¡å¼è®¾ç½®ï¼ä¸æ£æµå¿ä¿¡å·
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //æ¾ç¤ºæ¨¡å¼è®¾ç½®,å¼å§è¦æ±æ¯æ¬¡æ£æµå¿ä¿¡å·
WriteCommandLCM(0x08,1); //å
³éæ¾ç¤º
WriteCommandLCM(0x01,1); //æ¾ç¤ºæ¸
å±
WriteCommandLCM(0x06,1); // æ¾ç¤ºå
æ 移å¨è®¾ç½®
WriteCommandLCM(0x0F,1); // æ¾ç¤ºå¼åå
æ 设置
}
//ææå®ä½ç½®æ¾ç¤ºä¸ä¸ªå符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //éå¶Xä¸è½å¤§äº15ï¼Yä¸è½å¤§äº1
if (Y) X |= 0x40; //å½è¦æ¾ç¤ºç¬¬äºè¡æ¶å°åç +0x40;
X |= 0x80; //ç®åºæ令ç
WriteCommandLCM(X, 1); //åå½ä»¤å
WriteDataLCM(DData); //åæ°æ®
}
//ææå®ä½ç½®æ¾ç¤ºä¸ä¸²å符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //éå¶Xä¸è½å¤§äº15ï¼Yä¸è½å¤§äº1
while (DData[ListLength]>0x19) //è¥å°è¾¾å串尾åéåº
{
if (X <= 0xF) //Xåæ åºå°äº0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //æ¾ç¤ºå个å符
ListLength++;
X++;
}
}
}
//5ms延æ¶
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延æ¶
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
void Keyboard_out(void) interrupt 2
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //å é®çæ°æ®æ¯ä½>>é«ï¼ç»åä¸ä¸å¥æ以å³ç§»ä¸ä½
if (Key_Data) KeyV = KeyV | 0x80; //å½é®çæ°æ®çº¿ä¸º1æ¶ä¸º1å°æé«ä½
}
IntNum++;
while (!Key_CLK); //çå¾
PS/2CLKæé«
if (IntNum > 10)
{
IntNum = 0; //å½ä¸æ11次å表示ä¸å¸§æ°æ®æ¶å®ï¼æ¸
åéåå¤ä¸ä¸æ¬¡æ¥æ¶
BF = 1; //æ è¯æå符è¾å
¥å®äº
EA = 0; //å
³ä¸æçæ¾ç¤ºå®ååå¼ä¸æ (注ï¼å¦è¿éä¸ç¨BFåå
³ä¸æç´æ¥è°Decode()åæDecodeä¸æè°ç¨çææå½æ°è¦å£°æ为åå
¥å½æ°)
}
}
void Decode(unsigned char ScanCode) //注æ:å¦SHIFT+G为12H 34H F0H 34H F0H 12Hï¼ä¹å°±æ¯è¯´shiftçéç +Gçéç +shiftçæç +Gçæç
{
unsigned char TempCyc;
if (!Key_UP) //å½é®çæ¾å¼æ¶
{
switch (ScanCode)
{
case 0xF0 : // å½æ¶å°0xF0ï¼Key_UPç½®1表示æç å¼å§
Key_UP = 1;
break;
case 0x12 : // å·¦ SHIFT
Shift = 1;
break;
case 0x59 : // å³ SHIFT
Shift = 1;
break;
default:
if (DisNum > 15)
{
DisplayListChar(0, 1, Cls);//æ¸
LCD第äºè¡
DisNum = 0;
}
if(!Shift) //å¦æSHIFT没æä¸
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //æ¥è¡¨æ¾ç¤º
if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);
DisNum++;
}
else //æä¸SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //æ¥è¡¨æ¾ç¤º
if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);
DisNum++;
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //å½é®æ¾å¼æ¶ä¸å¤çå¤ç ï¼å¦G 34H F0H 34H é£ä¹ç¬¬äºä¸ª34Hä¸ä¼è¢«å¤ç
{
case 0x12 : // å·¦ SHIFT
Shift = 0;
break;
case 0x59 : // å³ SHIFT
Shift = 0;
break;
}
}
BF = 0; //æ è¯å符å¤çå®äº
}
/*--------------------------------------------------------------------------
AT89X51.H
Header file for the low voltage Flash Atmel AT89C51 and AT89LV51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __AT89X51_H__
#define __AT89X51_H__
/*------------------------------------------------
Byte Registers
------------------------------------------------*/
sfr P0 = 0x80;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr P1 = 0x90;
sfr SCON = 0x98;
sfr SBUF = 0x99;
sfr P2 = 0xA0;
sfr IE = 0xA8;
sfr P3 = 0xB0;
sfr IP = 0xB8;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
/*------------------------------------------------
P0 Bit Registers
------------------------------------------------*/
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;
/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_ 0x01
#define STOP_ 0x02
#define PD_ 0x02 /* Alternate definition */
#define GF0_ 0x04
#define GF1_ 0x08
#define SMOD_ 0x80
/*------------------------------------------------
TCON Bit Registers
------------------------------------------------*/
sbit IT0 = 0x88;
sbit IE0 = 0x89;
sbit IT1 = 0x8A;
sbit IE1 = 0x8B;
sbit TR0 = 0x8C;
sbit TF0 = 0x8D;
sbit TR1 = 0x8E;
sbit TF1 = 0x8F;
/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_ 0x01
#define T0_M1_ 0x02
#define T0_CT_ 0x04
#define T0_GATE_ 0x08
#define T1_M0_ 0x10
#define T1_M1_ 0x20
#define T1_CT_ 0x40
#define T1_GATE_ 0x80
#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F
/*------------------------------------------------
P1 Bit Registers
------------------------------------------------*/
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97;
/*------------------------------------------------
SCON Bit Registers
------------------------------------------------*/
sbit RI = 0x98;
sbit TI = 0x99;
sbit RB8 = 0x9A;
sbit TB8 = 0x9B;
sbit REN = 0x9C;
sbit SM2 = 0x9D;
sbit SM1 = 0x9E;
sbit SM0 = 0x9F;
/*------------------------------------------------
P2 Bit Registers
------------------------------------------------*/
sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;
/*------------------------------------------------
IE Bit Registers
------------------------------------------------*/
sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */
sbit ET0 = 0xA9; /* 1=Enable Timer 0 interrupt */
sbit EX1 = 0xAA; /* 1=Enable External interrupt 1 */
sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */
sbit ES = 0xAC; /* 1=Enable Serial port interrupt */
sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */
sbit EA = 0xAF; /* 0=Disable all interrupts */
/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;
sbit RXD = 0xB0; /* Serial data input */
sbit TXD = 0xB1; /* Serial data output */
sbit INT0 = 0xB2; /* External interrupt 0 */
sbit INT1 = 0xB3; /* External interrupt 1 */
sbit T0 = 0xB4; /* Timer 0 external input */
sbit T1 = 0xB5; /* Timer 1 external input */
sbit WR = 0xB6; /* External data memory write strobe */
sbit RD = 0xB7; /* External data memory read strobe */
/*------------------------------------------------
IP Bit Registers
------------------------------------------------*/
sbit PX0 = 0xB8;
sbit PT0 = 0xB9;
sbit PX1 = 0xBA;
sbit PT1 = 0xBB;
sbit PS = 0xBC;
sbit PT2 = 0xBD;
/*------------------------------------------------
PSW Bit Registers
------------------------------------------------*/
sbit P = 0xD0;
sbit FL = 0xD1;
sbit OV = 0xD2;
sbit RS0 = 0xD3;
sbit RS1 = 0xD4;
sbit F0 = 0xD5;
sbit AC = 0xD6;
sbit CY = 0xD7;
/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */
#define TF0_VECTOR 1 /* 0x0B Timer 0 */
#define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */
#define TF1_VECTOR 3 /* 0x1B Timer 1 */
#define SIO_VECTOR 4 /* 0x23 Serial port */
#endif
unsigned char code UnShifted[59][2] = {
0x1C, 'a',
0x32, 'b',
0x21, 'c',
0x23, 'd',
0x24, 'e',
0x2B, 'f',
0x34, 'g',
0x33, 'h',
0x43, 'i',
0x3B, 'j',
0x42, 'k',
0x4B, 'l',
0x3A, 'm',
0x31, 'n',
0x44, 'o',
0x4D, 'p',
0x15, 'q',
0x2D, 'r',
0x1B, 's',
0x2C, 't',
0x3C, 'u',
0x2A, 'v',
0x1D, 'w',
0x22, 'x',
0x35, 'y',
0x1A, 'z',
0x45, '0',
0x16, '1',
0x1E, '2',
0x26, '3',
0x25, '4',
0x2E, '5',
0x36, '6',
0x3D, '7',
0x3E, '8',
0x46, '9',
0x0E, '`',
0x4E, '-',
0x55, '=',
0x5D, '\\',
0x29, ' ',
0x54, '[',
0x5B, ']',
0x4C, ';',
0x52, '\'',
0x41, ',',
0x49, '.',
0x4A, '/',
0x71, '.',
0x70, '0',
0x69, '1',
0x72, '2',
0x7A, '3',
0x6B, '4',
0x73, '5',
0x74, '6',
0x6C, '7',
0x75, '8',
0x7D, '9',
};
unsigned char code Shifted[59][2] = {
0x1C, 'A',
0x32, 'B',
0x21, 'C',
0x23, 'D',
0x24, 'E',
0x2B, 'F',
0x34, 'G',
0x33, 'H',
0x43, 'I',
0x3B, 'J',
0x42, 'K',
0x4B, 'L',
0x3A, 'M',
0x31, 'N',
0x44, 'O',
0x4D, 'P',
0x15, 'Q',
0x2D, 'R',
0x1B, 'S',
0x2C, 'T',
0x3C, 'U',
0x2A, 'V',
0x1D, 'W',
0x22, 'X',
0x35, 'Y',
0x1A, 'Z',
0x45, '0',
0x16, '1',
0x1E, '2',
0x26, '3',
0x25, '4',
0x2E, '5',
0x36, '6',
0x3D, '7',
0x3E, '8',
0x46, '9',
0x0E, '~',
0x4E, '_',
0x55, '+',
0x5D, '|',
0x29, ' ',
0x54, '{',
0x5B, '}',
0x4C, ':',
0x52, '"',
0x41, '<',
0x49, '>',
0x4A, '?',
0x71, '.',
0x70, '0',
0x69, '1',
0x72, '2',
0x7A, '3',
0x6B, '4',
0x73, '5',
0x74, '6',
0x6C, '7',
0x75, '8',
0x7D, '9',
};