看你第二个图的点阵屏,上面引脚全为红点,都是高电平,而下面的引脚全是蓝点,都是低电平,所以全亮。并没有实现按列(或按行)扫描。就是仿真图画得太复杂了,又用了总线加标网络标号,而网络标号又不对。下图,虽然
根据模电的知识,8只led全亮说明二极管加了正向电压导通了。首先你要知道你的单片机是共阴还是共阳极,打开原理图看下就知道了。如果是共阴极,说明那8个引脚都给了高电平。如果你是使用的店家提供的程序,很有可能是没有把
好多的开发板为了在有限空间上做更多的实验,往往有一些跳线,用来切换电路的方向,如果你在做LED实验时,需要把跳线跳到那上面。你的板子是不是这样的情况可以先看一看有这个原因没有?
只所以如此,是因为你点亮后一直没关,而且一看就知道刚刚踏入单片机门槛。修改如下。include
如果键盘灯亮时,按键无反应这种情况:是接口插错了,一盘键盘的PS2接口是紫色,鼠标是绿色的,检查你插对了吗;是断针,PS2接口有6根针,中间是定位点,其中2根是电源,其他4根是数据,你看一下是丌是断针了。
51单片机4×4矩阵键盘,下载程序后LED全亮怎么回事
楼主的电路,P0,又是输出数码,又是控制矩阵键盘。有冲突。改为如下:程序如下:;ORG 0000H ;--- START:MOV P3, #255 CLR P3.0 JNB P2.0, K0 JNB P2.1, K4 MOV P3, #255 CLR P3
KEYVAL EQU 30H KEYTM EQU 31H KEYSCAN EQU 32H DAT EQU 33H SCANLED EQU 37H S_DAT EQU 38H D_DAT EQU 39H R_DATL EQU 3AH R_DATH EQU 3BH CALFLAG EQU 3CH FLAG BIT 00H ORG 0000H LJMP MAIN OR
DJNZ R6,D1 RETDELY10ms:MOV R6,#20 ;延时10毫秒D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 RETTABLE: DB 07H, 04H, 01H ; / 本表格是以键盘为参考 7 8 9 / DB 08H, 05H, 02H ; * 4 5 6 * DB 09H, 06H
DJNZ R7, DLY1 RET TABLE: DB 0C0H, 0F9H, 0A4H, 0B0H DB 99H, 92H, 82H, 0F8H DB 80H, 90H, 88H, 83H DB 0C6H, 0A1H, 86H, 8EH END89c51的,很经典,不懂的可以问我。
PANDUAN: MOV P1,#0FFH CLR P1.4 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ SW1 LCALL DELAY10MS JZ SW1//确认有键按下,但不知道哪个,此时可以之间让蜂鸣器叫 MOV P3.0,#1//蜂鸣器发声(赋1还是赋0取决你用
rt++) ;}void InitialCPU(void){ P0=0xFF; P1=0x0F; P2=0xFF; P3=0xFF;}unsigned char leddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //"0-9"unsigned char ledbai(unsigned
a4=b%10;/*取b的个位*/ if(k==0){shu4=1;shu1=0;shu2=0;shu3=0;P0=yima[a1];} else if(k==1){shu4=0;shu1=1;shu2=0;shu3=0;P0=yima[a4];} else if(k==2){shu4=0;shu1=0;shu2=1;
急求一个由89C51单片机的代码!要求用4*4矩阵键盘控制LED矩阵输出0~9的数字!
4×4矩阵式键盘识别技术实验任务如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示图4.14.1硬件电路原理图
unsigned char code table[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};sbit R1=P2^6;sbit B1=P2^7;sbit buzzer=P0^6;define KEY P3 sbit Wr=P3^6;int count1=0,count2=0;unsigned char old
实验内容:键盘上对应有16个按键,从0到F,按下相应的键会在数码管上显示相应的数字,其中K0到K15是采用4*4的方式连接的 / ;; 0 1 2 3 ---P20 ; 4 5 6 7 ---P21 ; 8 9
} void main() { uchar key_l,key_h; uchar key; while(1) { P1=0xf0; key_l=P1; //读P1端口的值 key_l=key_l&0xf0; //令低4位置位为0 if(key_l!=0xf0) //
case 0xde:num=4;break;case 0xbe:num=9;break;
void display(void)//数码管显示,调试方法:数码管间隔跳动函数中 delay(5);四个,调小 { data_l();P0=ledshow[Thousand];P2_0=0;delay(5);P2_0=1;P0=ledshow[Hundred];P2_1=0;delay(5);P2_1=1;P0=led
那还不简单啊,4行4列嘛,每个交点是一个按键,8根线分别连接处理器的8个IO口,把列的IO属性配成弱上拉,读取键值时首先将第1行通过IO口输出低电平,按顺序读取4列返回的状态,如果有一列被拉低了那就锁定那个键按
求矩阵式键盘系统设计:4*4,16个键盘的输入系统的设计,将对应的建号用LED数码管显示出来!
1:首先设定一个变量i,可以是从0到3循环的变化,2:再检测一个经过消抖处理的按键,按一下,即i+1 3:当i值为各个值时,执行相应的变换花样。流水灯参考程序 include include define uchar unsigned char uchar j,tmp
P1=0x0f; //发0扫描,列线输入 if ((P2 & 0x0f) != 0x0f) //有键按下 { delay(20); //延时去抖动 if ((P1&0x0f)!= 0x0f){ sccode = 0xef; //逐行扫描初值 while((sccode&0x01)!=
//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P
define uchar unsigned charconst tab[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d};const uchar led[]={0x01,0x01,0x04,0x08,0x10,0x20,0x40,0x80};void delay(){ uchar i;for(i=0;i<10;i++){;
用52单片机的4x4矩阵键盘的前八个键分别控制8个LED灯
你用的是静态显示,按下某一銉后,只有列数信号被锁存,因你的行和列数码管共用P0口和同一个锁存器,所以先显示的行数被后面的列数代替,且中间还没有任何延时,所以行数只是一闪而过 即使按住按键不丢,虽行数信号
//连续显示八位,没有延时,看起来,就连成一片了。void Timer0_isr(void) interrupt 3 //---T0,应该是1,不是3 { TH0 = (65536 - 2000) / 256;TL0 = (65536 - 2000) % 256;display();---显示
乘4矩阵键盘输入数码管显示四位数_数学_自然科学_并用数码管显示设定值,可以 通过按键来更换显示内容
要求没汁出4*4矩降键諡寸某一按键按下就在教碣管并示一へ教字。按键从左上角到右下角依次わ1,2,·,16。4(実强原理 按键模抉原理 键盏ね描的実现辻程如下:対チ4X4键盏,通常达接ゐ4行、4列,因此妥沢别按
那就选择数码管吧,假设矩阵键盘连P1口,数码管连P0口,上电后数码管显示0,然后3*3键盘控制显示1~9,程序c语言如下:/***扫描法监测键盘,显示按键数值。我的板子是4*4的,所以没调试,有不对的地方我再给你调我看
1、结构不同:动态数码管由7个或8个LED灯组成,可以显示1至8位的数字。4乘4矩形键盘由16个LED灯组成,可以显示0至9的数字和A至F的字母。2、显示方式不同:动态数码管的显示方式是通过控制每个LED灯的亮灭状态来显示数
动态数码管显示1-8和4×4矩形键盘显示
#include #define uchar unsigned char void delay(unsigned int a) { unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++); } uchar kbscan(void) { unsigned char sccode,recode; P1=0x0f; //发0扫描,列线输入 if ((P2 & 0x0f) != 0x0f) //有键按下 { delay(20); //延时去抖动 if ((P1&0x0f)!= 0x0f) { sccode = 0xef; //逐行扫描初值 while((sccode&0x01)!=0) { P1=sccode; if((P1&0x0f)!=0x0f) { recode=(P1&0x0f)|0xf0; return((~sccode)+(~recode)); } else sccode=(sccode<<1)|0x01; } } } P0=0xff; return 0; //无键按下,返回0 } main() { unsigned char key; while(1) { key=kbscan(); switch(key) { case 0x11:P0=0xfe;break; case 0x12:P0=0xfd;break; case 0x14:P0=0xfb;break; case 0x18:P0=0xf7;break; //+ case 0x21:P0=0xef;break; case 0x22:P0=0xdf;break; case 0x24:P0=0xbf;break; case 0x28:P0=0x7f;break; //- default:break; } } }[已完成!]电路图如下, #include #include unsigned char code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};void delay_ms(unsigned int ct) //延时{unsigned int t,i;for(i=0;i<ct;i++){t=115;while(--t);}} void main(void){// Write your code hereunsigned char ct=100;while (1) //主循环{switch(P1) //P1口作为独立按键输入端,检测端口电平并做如下判断{case 0xfe:P0=dofly_table[1];LED0=0;break;//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P0=table[3];LED2=0; break;case 0xf7:P0=table[4];LED3=0;break;case 0xef:P0=table[5];LED4=0;break;case 0xdf:P0=table[6];LED5=0;break;case 0xbf:P0=table[7];LED6=0;break;case 0x7f:P0=table[8];LED7=0;break;default:break; //如果都没按下,直接跳出}//主循环中添加其他需要一直工作的程序}} //如果帮到你的话,点一个赞吧!硬件电路工程师-帝国卫兵Tt
#include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar temp; uint num,num1; void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } uint keyscan(); void display(uchar,uchar,uchar); void main(){ dula=1; P0=0; dula=0; wela=1; P0=0xc0; wela=0; while(1) { num1=keyscan(); display(num1/100,num1%100/10,num1%10); } } void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six){ dula=1; P0=table[one]; //送段数据 dula=0; P0=0xff; //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器 wela=1; P0=0xfe; wela=0; delay(1); dula=1; P0=table[two]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(1); dula=1; P0=table[three]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(1); } uint keyscan() { P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:num=1; break; case 0xde:num=4; break; case 0xbe:num=9; break; case 0x7e:num=16; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfd; temp=P3; temp=temp&0xf0; while(temp!=0xf0){ delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp){ case 0xed:num=25;break; case 0xdd:num=36;break; case 0xbd:num=49;break; case 0x7d:num=64;break; } while(temp!=0xf0){ temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:num=81; break; case 0xdb:num=100; break; case 0xbb:num=121; break; case 0x7b:num=144; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xf7; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7:num=169; break; case 0xd7:num=196; break; case 0xb7:num=225; break; case 0x77:num=256; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } return num; }
仿真图没问题,除了键盘没画完
#define LCD1602_FLAG#define LCD1602_PORT P0#include#include#define uchar unsigned char sbit lcd1602_rs=P2^0;sbit lcd1602_e=P2^2;sbit lcd1602_rw=P2^1;sbit lcd1602_busy=P0^7; uchar str[]="This is Key Test";uchar keyval,keystr[16]; void delay(uchar a){uchar i;while(a--)for(i=0;i<120;i++);} /************************************** 函数名称:lcd1602_CheckBusy()* 函数功能:状态查询*************************************/ void lcd1602_CheckBusy(){do{lcd1602_busy=1;lcd1602_rs=0;lcd1602_rw=1;lcd1602_e=0;lcd1602_e=1;}while(lcd1602_busy);} /***************************************** 函数名称: lcd1602_WriteCmd()* 函数功能:写命令* 入口参数:命令字* 出口参数:无****************************************/ void lcd1602_WriteCmd(const uchar cmd){lcd1602_CheckBusy();lcd1602_rs=0;lcd1602_rw=0;lcd1602_e=1;LCD1602_PORT=cmd;lcd1602_e=0;} /********************************************* 函数名称:lcd1602_WriteData()* 函数功能:写数据* 入口参数:c--待写数据* 出口参数:无**********************************************/ void lcd1602_WriteData(const uchar c){lcd1602_CheckBusy();lcd1602_rs=1;lcd1602_rw=0;lcd1602_e=1;LCD1602_PORT=c;lcd1602_e=0;} /************************************************* 函数名称:lcd1602_Init()* 函数功能:初始化LCD* 入口参数:无* 出口参数:无************************************************/ void lcd1602_Init(){lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,lcd1602_WriteCmd(0x06); //flag move to right,screen don't movelcd1602_WriteCmd(0x01); //clear screen} /************************************************** 函数名称:lcd1602_Display()* 函数功能: 字符显示* 入口参数:ptr--字符或字符串指针* 出口参数:无* 说 明:用户可通过以下方式来调用:* 1)lcd1602_Display("Hello,world!");* 2) INT8U 存储类型 txt[]="要显示的字符串";* 或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'};* INT8U *ptr;* ptr=&txt;* lcd1602_Display(ptr);* 或 lcd1602_Display(txt);* 或 lcd1602_Display(&txt);*************************************************/ void lcd1602_Display(const uchar *ptr,uchar line){uchar data i=0;uchar *data q; q=ptr;switch(line){case 0:lcd1602_WriteCmd(0x80);while(q!=NULL && (*q!='\0') && i<16){lcd1602_WriteData(*q);q++;i++;}break;case 1:lcd1602_WriteCmd(0xc0);while(q!=NULL && (*q!='\0') && i<16){lcd1602_WriteData(*q);q++;i++;}break;}} uchar kbscan(void){unsigned char sccode,recode;P3=0x0f; //发0扫描,列线输入if ((P3 & 0x0f) != 0x0f) //有键按下{delay(20); //延时去抖动if ((P3&0x0f)!= 0x0f){sccode = 0xef; //逐行扫描初值while((sccode&0x01)!=0){P3=sccode;if((P3&0x0f)!=0x0f){recode=(P3&0x0f)|0xf0;while((P3&0x0f)!=0x0f);//等待键抬起return((~sccode)+(~recode));}elsesccode=(sccode<<1)|0x01;}}}return 0; //无键按下,返回0}uchar getkey(void){uchar key;key=kbscan();if(key==0){keyval=0xff;return(0);}switch(key){case 0x11:keyval=7;break;case 0x12:keyval=4;break;case 0x14:keyval=1;break;case 0x18:keyval=10;break;case 0x21:keyval=8;break;case 0x22:keyval=5;break;case 0x24:keyval=2;break;case 0x28:keyval=0;break;case 0x41:keyval=9;break;case 0x42:keyval=6;break;case 0x44:keyval=3;break;case 0x48:keyval=11;break;case 0x81:keyval=12;break;case 0x82:keyval=13;break;case 0x84:keyval=14;break;case 0x88:keyval=15;break;default:keyval=0xff;break;}if(keyval!=0xff)return(1);else return(0);} main(){uchar num;lcd1602_Init();lcd1602_Display(str,0);while(1){if(getkey()){keystr[num]=keyval+0x30;lcd1602_Display(keystr,1);num++;num%=16;} }}
用4×4矩阵键盘画计算器仿真图,用LCD1602显示的,proteus中有一个现成的计算器用的4×4键盘,见下图。