单片机按键程序
#include <reg52.h>//包含头文件 #define uchar unsigned char #define uint unsigned int unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,数码管来显示按下键的值。 uchar keyscan(void); //主要的矩阵键盘扫描函数。 void delay(uint i); void main() { uchar key; P2=0x00;//1数码管亮 按相应的按键,会显示按键上的字符 while(1) { key=keyscan();//调用键盘扫描, switch(key) { case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值 原理就是高四位一列低四位一列的组 //合。0111 1110 7e 0表示按键后为0,1表示没有按键按下的。即P3.7与P3.1连接为低电平,为S1键 //其他类推。 case 0x7d:P0=dofly[1];break;//1 case 0x7b:P0=dofly[2];break;//2 case 0x77:P0=dofly[3];break;//3 case 0 [4];break;//4 case 0 [5];break;//5 case 0 [6];break;//6 case 0xb7:P0=dofly[7];break;//7 case 0 [8];break;//8 case 0 [9];break;//9 case 0 [10];break;//a case 0xd7:P0=dofly[11];break;//b case 0 [12];break;//c case 0 [13];break;//d case 0 [14];break;//e case 0xe7:P0=dofly[15];break;//f } } } uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法 比如:行为低电位,列为高四位 { uchar cord_h,cord_l;//行列值 P3=0x0f; //行线输出全为0 cord_h=P3&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { delay(100); //去抖 if(cord_h!=0x0f) { cord_h=P3&0x0f; //读入列线值 P3=cord_h|0xf0; //输出当前列线值 cord_l=P3&0xf0; //读入行线值 return(cord_h+cord_l);//键盘最后组合码值 } }return(0xff); //返回该值 } void delay(uint i)//延时函数 { while(i--); } P3=0x0f; //行线输出全为0 cord_h=P3&0x0f; //读入列线值 在上面这两句中的P3的数值是不是一样啊
P3=0x0f; //行线输出全为0 cord_h=P3&0x0f; //读入列线值 P3=0x0f; 有两个作用: 1, 是为了把p3口的高四位(p3.4~p3.7也就是行线)也就是行线置为低电平0;把p3口的低四位(p3.0~p3.3)也就是列线置为低电平1,为识别按键做准备。 2, 为读取端口把p3的低四位做准备;因为单片机的I/O口做输入是要先置为高电平。 cord_h=P3&0x0f;有两个作用, 1 读取p3口的值, 2 把p3口的值同0x0f与运算,只取低四位(列线)的值,高四位置0. 当有键按下是,对应的列线就被行线拉为低电平0,跟1与运算还是0,这样根据cord_h中取得的值就可以判定是什么键按下。
答:前面定义的是Current_Level后面引用了Current_Leven,Current_Leven未定义,把Current_Leven全改为Current_...详情>>
答:这是很正常的开机上电自检!没必要紧张!详情>>
问:我的惠普打印机安装WINDOWS打印机软件时搜索了HP Deskjet D240...
答:HP官方驱动下载,只要填上你打印机的型号就能找到合适的驱动。详情>>