很簡單的一個小程式

卻讓我花了兩三天去寫

最後受不了還是讓學長幫幫  ~"~

keyboard -> PS/2 -> 8052 -> LCD

為什麼要用 8052

因為 我的8051 被我燒壞了 ~"~

 

是看一個datasheet寫出來了 (CR0109 PS2 Controller)

 

ps2

 

====================================================================

#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--;
    }
}

arrow
arrow
    全站熱搜

    ffyy99 發表在 痞客邦 留言(0) 人氣()