⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 38.c

📁 这是我大学4年来做过的竞赛以及老师的科研项目所积累下来的c51源代码
💻 C
字号:
程序三十九 PC键代码
/*
芯片: AT90S4434
频率: 8,000000 MHz
模式: Tiny
*/

#include <90s4434.h>
#include "kb.h" 
#include <delay.h>   

#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
// 全局变量
void main(void)
{
// 局域变量
unsigned char key;

// Port A
PORTA=0x00;
DDRA=0x00;
// Port B
PORTB=0x00;
DDRB=0x00;

// Port C
PORTC=0x00;
DDRC=0x00;
// Port D
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 
TCCR2=0x00;
ASSR=0x00;
TCNT2=0x00;
OCR2=0x00;

// INT0: Oon
// INT1: Off 
GIMSK= 0x40;                           // 开INT0 
MCUCR=0x00;

TIMSK=0x00;

// 模拟初始化
ACSR=0x80;

//lcd初始化            
 lcd_init(16);                             
 InitKeyBoard();                          // 键盘初始化
 
 while(1)
    {
        key = getchar_kb();
        lcd_putchar(key);
        delay_ms(5);   
      
    }

}

//KB.C代码
#include "kb.h"
#include "scancodes.h"

#define BUFF_SIZE 64

unsigned char edge, bitcount;                  // 0 = neg. 1 = pos.

unsigned char kb_buffer[BUFF_SIZE];
unsigned char *inpt, *outpt;
unsigned char buffcnt;


void InitKeyBoard(void)
{
    inpt =  kb_buffer;                        //初始化缓冲
    outpt = kb_buffer;
    buffcnt = 0;

    MCUCR = 2;                             // INT0
    edge = 0;                                // 0 = 降沿  1 = 升沿
    bitcount = 11;               
    #asm("sei")                              //开中断
}

interrupt [EXT_INT0] void INT0_interrupt(void)
{
    static unsigned char data;                   

        if(bitcount < 11 && bitcount > 2)        // Bit 3 to 10. 
        {                                  
            data = (data >> 1);
            if(PIND & 8)
                data = data | 0x80;            // 存储 '1'
        }

        if(--bitcount == 0)                    //所有位接收
        {
            decode(data);
            bitcount = 11;
        }
 }


void decode(unsigned char sc)
{
    static unsigned char is_up=0, shift = 0, mode = 0;
    unsigned char i;
 
    if (!is_up)                             // Last data 是 up-key 
    {
        switch (sc)
        {
          case 0xF0 :                      // up-key 
            is_up = 1;
            break;

          case 0x12 :                      // Left SHIFT
            shift = 1;
            break;

          case 0x59 :                      // Right SHIFT
            shift = 1;
            break;

          case 0x05 :                       // F1
            if(mode == 0)
                mode = 1;                  
            if(mode == 2)
                mode = 3;                  
            break;

          default:
            if(mode == 0 || mode == 3)         // 假如ASCII mode
            {
                if(!shift)                    // 假如没按shift
                {                          // 查 table 
                 for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
if (unshifted[i][0] == sc) 
{
                        put_kbbuff(unshifted[i][1]);
                    }
                } else {                     //假如按shift 
                    for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
if (shifted[i][0] == sc) 
{
                        put_kbbuff(shifted[i][1]);
                    }
                }
            } else{                            // 扫描 code mode
                print_hexbyte(sc);              
                put_kbbuff(' ');

            }
            break;
        }
    } else {
        is_up = 0;                            
        switch (sc)
        {
          case 0x12 :                         // Left SHIFT
            shift = 0;
            break;
            
          case 0x59 :                         // Right SHIFT
            shift = 0;
            break;

          case 0x05 :                         // F1
            if(mode == 1)
                mode = 2;
            if(mode == 3)
                mode = 0;
            break;
          case 0x06 :                         // F2
                                            // clr();
            break;  
            
        } 
    }    
} 

void put_kbbuff(unsigned char c)
{
    if (buffcnt<BUFF_SIZE)                     // 假如buffer 没满
    {
        *inpt = c;                             
        inpt++;                                

        buffcnt++;

        if (inpt >= kb_buffer + BUFF_SIZE)        
            inpt = kb_buffer;
    }
}

int getchar_kb(void)
{
    int byte;
    while(buffcnt == 0);                          // 等data

    byte = *outpt;                               // 得byte
    outpt++;                                  

    if (outpt >= kb_buffer + BUFF_SIZE)           
        outpt = kb_buffer;
    
    buffcnt--;                                    

    return byte;
}

void print_hexbyte(unsigned char i)
{
    unsigned char h, l;
    
    h = i & 0xF0;                                 // High nibble
    h = h>>4;
    h = h + '0';
    
    if (h > '9')
        h = h + 7;

    l = (i & 0x0F)+'0';                             // Low nibble
    if (l > '9')
        l = l + 7;

    put_kbbuff(h);
    put_kbbuff(l);
}

KB.H代码
// Keyboard 通讯
#ifndef __KB_INCLUDED
#define __KB_INCLUDED

#include <90s4434.h>

#define CLOCK   2
#define DATAPIN 3

#define ISC00 0
#define ISC01 1

void InitKeyBoard(void);
interrupt [EXT_INT0] void INT0_interrupt(void);
void decode(unsigned char sc);
void put_kbbuff(unsigned char c);
int getchar_kb(void);  
void print_hexbyte(unsigned char i);
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -