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

📄 main.c

📁 标准键盘PS2与单片机之间的通信
💻 C
字号:
#include<reg52.h>
#include<lcd12864.h>//包含128X64驱动程序
#include<hzzi.H>    //包含图片和汉字库
sbit Key_Data =P2^1;//定义Keyboard数据端口引脚
sbit Key_CLK=P3^2;	//中断端口,时钟线
static unsigned char KeyV=0X00; //键值
static unsigned char BF = 0; //标识是否有字符被收到
static unsigned char IntNum = 0; //中断次数计数
unsigned char  lie,hang;//lie为列值, hang为行值
bit dx=0;          //大小写标志 dx==1时大写状态
////*************************\\\\\\\\\\\\\\\\\\\\\\\\\\\

void Keyboard_out(void) interrupt 2//键盘中断处理 键值存储在 KeyV 中
{
  if ((IntNum>0) && (IntNum <9))
	{			
		KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
		if (Key_Data==1)  //当键盘数据线为1时   
		 {KeyV = KeyV | 0x80;}  //存储一位
	}
  IntNum++;   //中断次数加一(中断一次接收一位数据)
  if (IntNum > 10) //中断11次后数据发送完毕
	{   
		IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
		BF = 1;    //标识有字符输入完了
		EA = 0;    //关中断等显示完后再开中
	}
}
void Decode() //键值处理
{
	unsigned char data TempCyc;
    signed char data k;
	TempCyc=KeyV;
    if(BF==1)	//接收完一个有效数据时	
	{ 
	 BF=0;  //准备下一次接收
	 switch ( TempCyc ) //键值与显示字符的对应关系
	  {    //键值//        //对应字符//
		case 0x8A: k=0;  break; //0
		case 0x2C: k=1;  break; //1
		case 0x3C: k=2;  break; //2
		case 0x4C: k=3;  break; //3
		case 0x4A: k=4;  break; //4
		case 0x5C: k=5;  break; //5
		case 0x6C: k=6;  break; //6
		case 0x7A: k=7;  break; //7
		case 0x7C: k=8;  break; //8
		case 0x8C: k=9;  break; //9
		case 0x38: k=10; break; //a
		case 0x64: k=11; break; //b
		case 0x42: k=12; break; //c
		case 0x46: k=13; break; //d
		case 0x48: k=14; break; //e
		case 0x56: k=15; break; //f
		case 0x68: k=16; break; //g
		case 0x66: k=17; break; //h
		case 0x86: k=18; break; //i
		case 0x76: k=19; break; //j
		case 0x84: k=20; break; //k
		case 0x96: k=21; break; //l
		case 0x74: k=22; break; //m
		case 0x62: k=23; break; //n
		case 0x88: k=24; break; //o
		case 0x9A: k=25; break; //p 
		case 0x2A: k=26; break; //q
		case 0x5A: k=27; break; //r
		case 0x36: k=28; break; //s
		case 0x58: k=29; break; //t
		case 0x78: k=30; break; //u
		case 0x54: k=31; break; //v
		case 0x3A: k=32; break; //w
		case 0x44: k=33; break; //x
		case 0x6A: k=34; break; //y
		case 0x34: k=35; break; //z
		case 0x98: k=63; break; //;
		case 0xAA: k=65; break; //=
		case 0xF2: k=68; break; //+
		case 0x52: k=-16;break; //空格键
		case 0xB0: k=101;break;  //大小写控制键Caps lock
     } 
	 if(k==101) {dx=!dx;} //按下大小写控制键时 大小写标志取反
	 if(k==-16) //空格键按下时
	  {
		lcd_putchar8x8(lie, hang, -16+'0'); //清除光标
		lcd_putchar8x8(lie+8, hang, 79+'0');//光标移一位
	  }
     if(dx==0) //小写状态时显示
	  {
		lcd_putchar8x8(lie, hang, k+'0');//小写字符			 
        lcd_putchar8x8(lie+8, hang, 79+'0');//光标						
	   }
	  if(dx==1)//大写状态时显示
	   {
		 if(k>9 && k<=35)
			{
			 lcd_putchar8x8(lie, hang, (k+26)+'0');//大写字符
			 lcd_putchar8x8(lie+8, hang, 79+'0');//光标
			}
			if(k>=0 && k<=9) 
			{
			 lcd_putchar8x8(lie, hang, (k-10)+'0');//数字键对应的符号
			 lcd_putchar8x8(lie+8, hang, 79+'0');//光标
			}
		  }
		 if(lie==120)  //写满一行
		 {lie=0;hang=hang+1;//换行
		 lcd_putchar8x8(lie, hang, 79+'0');}//光标下移
	     else {lie=lie+8;}
	     EA=1;
	  }	
}
void delay(int x)   //延时程序
{	int i,j;
	for(i=0;i<600;i++)
	for(j=0;j<x;j++); }	
 
void wlcome()      //开机画面和欢迎界面
{      
		lcd_init();  //初始化液晶驱动硬件
		lcd_clr();   //清屏 
		Disp_Img(yema);//显示一张128X64的点阵的图片
		delay(200);  //延时等待   
        lie=20;//列的值可以是0--127任意一个
        hang=1;//行的值视情况而定
		lcd_clr();   //清屏使残留的点不影响后面的显示
		hz_disp(lie+0, hang, huan);//显示汉字'欢'	
		hz_disp(lie+16,hang, ying);//显示汉字'迎'
		hz_disp(lie+32,hang, shi);//显示汉字'使'
		hz_disp(lie+48,hang, yong);//显示汉字'用'
	    hz_disp(lie+64,hang, DP);//显示字母'DP'	
		hz_disp(lie+80,hang, Y);//显示字母'Y'
		lie=8;hang=4;//换行 一行有8个点阵 一列只有一个
		hz_disp(lie+24,hang, shu );//显示汉字'输'
		hz_disp(lie+40,hang, ru);//显示汉字'入'
		hz_disp(lie+56,hang, xi);//显示汉字'系' 
		hz_disp(lie+72, hang, tong);//显示汉字'统' 	
		delay(200);lcd_clr();
		lie=8; hang=0;
		hz_disp(lie+16,hang, qing);//显示汉字'请'
		hz_disp(lie+32,hang, shu);//显示汉字'输'
		hz_disp(lie+48,hang, ru);//显示汉字'入'
	    hz_disp(lie+64,hang, zi);//显示汉字'字'	
		hz_disp(lie+80,hang, fu);//显示汉字'符'
		for(lie=0;lie<128;lie++)//画一条直线
		{set_point(lie,15);}
}
void main() 
{   
    wlcome() ;	//调用开机画面和欢迎界面子程序
    IT1 = 1;  //设外部中断1为下降沿触发
	EA = 1;   //开总中断
	EX1=1;    //开中断 1
	hang=2; lie=0;//输入的字符从第2行 第0列开始显示
	while(1)
    {       
		Decode();	
		delay(50);
	}
}


⌨️ 快捷键说明

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