Monthly Archives: July 2005

单片机驱动标准PC机键盘的C51程序

功能:实现pc机键盘(p/s2接口)与8位单片机连接使用原理:键盘时钟接在p3.2口,既8051的外部中断int0上,键盘数据接到p1.0上每次按键,键盘会向单片机发脉冲使单片机发生外部中断,数据有p1.0口一位一位传进来传回的数据格式为:1位开始位(0),8位数据位(所按按键的通码,用来识别按键),1位校验位(奇校验)1位结束位(1)实现:将键盘发回的数据放到一个缓冲区里(数组),当按键结束后发生内部中断来处理所按的按键缺点:由于51单片机的容量有限所以缓冲区不可以开的太大,这就导致可以记录键盘的按键次数过少,也就是容错性一般。不过如果正常使用键盘是不会出错的 //#include”reg51.h”#include “intrins.h”#include “ku.h” //按键通码与ascii对照表sbit sda= p1^0; //键盘数据线unsigned char dat=0,dat1=0,dat2=0; //接收键盘数据变量? 存储通码变量 接受连续通码变量unsigned char count=0,num=9,temp[5],shu=0; //中数次数 中断控制变量 缓冲区数组 缓冲区指针unsigned char key=0; //按键最终值void zhongduan() interrupt 0 //外部中断0 用来接受键盘发来的数据{dat>>=1; //接受数据 低->高if(sda) dat|=0×80;count++;if(count==num){if(count==9){dat1=dat; //中断9次后为键盘所按按键的通码(开始位始终为0在第一次中断时右移中忽略)num=20; //使中断可以继续中断11次}if(count==20){dat2=dat; //取回第二个通码if(dat1==0xe0 || dat2==0xf0) //第一个通码是0xe0则证明所按按键为功能键,第二个通码是0xf0证明按键结束{temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //将所按按键存到缓冲区中ie=0×82; //关闭外部中断并打开内部中断来处理所按按键tr0=1;}else{temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; … Continue reading

Posted in 单片机 | 1 Comment

PC机键盘按键通码与ASCII对照表

unsigned char code noshift[80][2]={22 ,49,// { 1 }30 ,50,// { 2 }38 ,51,// { 3 }37 ,52,// { 4 }46 ,53,// { 5 }54 ,54,// { 6 }61 ,55,// { 7 }62 ,56,// { 8 }70 ,57,// { 9 }69 … Continue reading

Posted in 单片机 | Leave a comment

放这先,未验证正确与否

#include #define uchar unsigned char sbit TMDAT = P3^4; uchar TMP;  uchar f;  //0”为正温,“1”为负温。  ////////////////////////////////////////延时部分//////////////////////////void dmsec (unsigned int count)       //{         // unsigned int i;              //  while (count)       // {        //  i = 115;      //  while (i>0) i–;     //  count–;      //    }         //}         … Continue reading

Posted in 单片机 | Leave a comment

与门问题

电路要求:CPU输出2位控制编码,3个执行单元,换句话说就是2-4编码器的问题,但是缺德的是不让用芯片,需要用最简单的分立器件作出来。。。 弄了好多天,我快晕了,后来将执行单元并行排列,然后把CPU的程序改动了一下才行,MD,被与门给迷惑了,其实早想到改程序了,不过这几天仿真器不在手上,懒了! 终于在抽掉半盒烟的情况下,决定先把程序改过来,不用仿真器验证了,估计问题不大,嘿嘿~ 等几天在重头验证好了,先把整理出的电路图画出来吧!

Posted in 工作 | Leave a comment