很簡單的一個小程式
卻讓我花了兩三天去寫
最後受不了還是讓學長幫幫 ~"~
keyboard -> PS/2 -> 8052 -> LCD
為什麼要用 8052
因為 我的8051 被我燒壞了 ~"~
是看一個datasheet寫出來了 (CR0109 PS2 Controller)
====================================================================
#include <AT89X52.h>
#ifndef uint
#define uint unsigned int
#define uchar unsigned char
#endif
//LCD
#define DB P1
#define RS P3_5
#define RW P3_6
#define EN P3_7
//PS2
#define Data P3_3
/*
Clock = P3_2
Data = P3_3
*/
uchar DR[8]; //Data Register
uchar flag_receive_finish;
uint Key_Data; //Data pin
uint bc; //bit count
uint drc; //Data Register count
uchar package_length;
//function
void initial_interrupt(void);
void Send(uchar ,uchar );
void initial_lcd(void);
void delay1ms(uint i);
void Delay(uint);
void DLY(uchar);
uchar turn (uchar );
void int_EX0(void) interrupt 0 using 1 //INT1 P3_2 (Clock)
{ //Data come with Clock from Device to MCU together
//-------------------------------------
if(Data == 1)
Key_Data = (Key_Data >> 1) | 0x8000;
else
Key_Data = (Key_Data >> 1) | 0x0000;
bc += 1;
if( bc == 11)
{
Key_Data = Key_Data >> 6;
DR[drc] = Key_Data;
drc++;
bc = 0;
Key_Data = 0x0000;
}
//---------------------------------------
if (DR[0] == 0xE0)
{
package_length = 2; //E0 XX
if (DR[1] == 0x12)
{ //E0 12 E0 7C
package_length = 4;
}
if (DR[1] == 0xF0)
{
package_length = 3; //E0 F0 XX
if (DR[2] == 0x7C)
{ //E0 F0 7C E0 F0 12
package_length = 6;
}
}
}
else
{
package_length = 1;
if (DR[0] == 0xE1)
{
package_length = 8;
}
if (DR[0] == 0xF0)
{
package_length = 2; //F0 XX
}
}
//---------------------------------------
if (drc == package_length)
{
drc = 0;
flag_receive_finish = 1;
}
}
void main(void)
{
uint i;
package_length = 1;
bc = 0, drc = 0;
Key_Data = 0;
flag_receive_finish = 0;
delay1ms(2000);
initial_lcd(); //initial lcd
initial_interrupt(); //initial interrupt for INT0
while (1)
{
if (flag_receive_finish == 1)
{
Send(0,0x80);
Send(0,0x01);
Delay(5000);
for (i = 0; i < package_length; i++)
{
Send(1,turn(DR[i] >> 4));
Send(1,turn(DR[i]));
DR[i] = 0x00;
}
flag_receive_finish = 0;
}
}
}
void initial_interrupt(void){
PX0 = 1; //interrupt EX0 is first
EX0 = 1; //enable INT0
IT0 = 1; //negative enable
EA = 1; //Interrupt enable
}
void Send(uchar select,uchar Data){//instruct 0,data 1
RW = 0; //write
RS = select;
DB = Data;
EN = 1;DLY(10);
EN = 0;DLY(10);
}
void initial_lcd(void){
delay1ms(20); //wait the lcd start
Send(0,0x38); //8bit
Delay(5000);
Send(0,0x38); //8bit
Delay(200);
Send(0,0x38); //8bit
delay1ms(5);
Send(0,0x38); //8bit, 2line, 5*7dot
delay1ms(5);
Send(0,0x08); //display off
Send(0,0x01); //clear
Delay(5000);
Send(0,0x06); //curse increment
Send(0,0x0C); //Display On, No curse, No blink
Send(0,0x80); //set the curse at the line1 first
}
uchar turn (uchar the_char){
the_char &= 0x0f;
if (the_char < 0x0A)
the_char |= 0x30;
else
the_char += 0x37;
return the_char;
}
void Delay(uint del) // 延時函數
{
next:
del--;
if (del!=0) goto next;
}
void DLY(uchar dly) // 延時函數 SHORT
{
wait:
dly--;
if (dly!=0) goto wait;
}
void delay1ms(uint i){
uint n;
while(i > 0){
n = 120;
while(n >0)
n--;
i--;
}
}
留言列表