矩阵键盘单个数码管显示C语言程序

合集下载

在数码管上动态显示矩阵键盘数字

在数码管上动态显示矩阵键盘数字

/**********************************************程序功能:在数码管上动态显示矩阵键盘数字***********************************************/#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define LED_IN_USE 8//共阴极数码管7位段码:0--fuchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar led_Buf[LED_IN_USE]; // LED显示缓冲区,// 存放要显示数据uchar led_Ctrl;//记录显示位数的全局变量uchar key_Pressed; //按键是否被按下:1--是,0--否uchar key_val; //存放键值uchar key_Flag; //按键是否已放开:1--是,0--否//设置键盘逻辑键值与程序计算键值的映射uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};uchar Dispbuf[2];/******************************************************* * 模块初始化*******************************************************/ void init_LED(void){//uchar tmpv;P5DIR = 0xff; //设置P5的IO方向为输出P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器P5OUT = 0x00;//设置P5的输出初值led_Ctrl = 0; // led_Ctrl用于控制哪个LED可显示//for(tmpv=0;tmpv<LED_IN_USE;tmpv++)//{ // 初始化缓冲区,可放入主函数//led_Buf[tmpv] = 0;// }}void led_Display(){//P5DIR = 0xff; //设置P5的IO方向为输出//P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出//P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器//P5OUT = 0x00;//设置P5的输出初值P5OUT = scandata[Dispbuf[led_Ctrl]]; // 设置显示值P3OUT |= 0x10; // 打开数据锁存器P3OUT &= 0xef; // 关闭数据锁存P5OUT = ~(1 << (led_Ctrl)); // 设置哪只LED显示P3OUT |= 0x08; // 打开控制锁存P3OUT &= 0xf7; // 关闭控制锁存led_Ctrl++;if(led_Ctrl == 2) led_Ctrl = 0; // 设置下一个要显示的LED}/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/void Init_Keypad(void){P1DIR = 0xf0; //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态P1OUT |= 0xf0; // P1.4~P1.7输出高电平key_Flag = 0;key_Pressed = 0;key_val = 0;}/********************************************** Check_Key(),检查按键,确认键值*********************************************//*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无********************************************/void Check_Key(void){uchar row ,col,tmp1,tmp2;tmp1 = 0x80;for(row = 0;row < 4;row++) //行扫描{P1OUT = 0xf0; //P1.4~P1.7输出全1P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0tmp1 >>=1;if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0{tmp2 = 0x01; // tmp2用于检测出那一位为0for(col = 0;col < 4;col++) // 列检测{if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是{key_val = key_Map[row * 4 + col]; // 获取键值return; // 退出循环}tmp2 <<= 1; // tmp2左移1位}}}}/*******************************************函数名称:delay功能:延时约15ms,完成消抖功能参数:无返回值:无********************************************/void delay(){uint tmp;for(tmp = 12000;tmp > 0;tmp--);}/*******************************************函数名称:Key_Event功能:检测按键,并获取键值参数:无返回值:无********************************************/void Key_Event(void){uchar tmp;P1OUT &= 0x00; // 设置P1OUT全为0,等待按键输入tmp = P1IN; // 获取p1INif ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下{key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值}else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放{key_Pressed = 0; // 清除key_Pressed标识key_Flag = 1; // 设置key_Flag标识}else{_NOP();}}/********************主函数********************/void main(void){WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次IE1 |= WDTIE; // 使能看门狗中断init_LED();_EINT(); //打开全局中断Init_Keypad();while(1){Key_Event();if(key_Flag == 1){key_Flag = 0;Dispbuf[0] = key_val / 10;Dispbuf[1] = key_val % 10;}}// _BIS_SR(GIE);//_BIS_SR(LPM3_bits + GIE); //CPU进入LPM3低功耗模式,同时打开全局中断//_BIS_SR(CPUOFF+ GIE); //进入LPM0//_BIS_SR(LPM0_bits + GIE); //进入LPM0 }/*******************************************函数名称:watchdog_timer功能:看门狗中断服务函数,在这里输出数码管的段选和位选信号参数:无返回值:无********************************************/#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){led_Display();}。

51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言

51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言

51下面是51单片机使用4×4矩阵键盘的汇编程序,并在数码管的最后一位显示一个字符:```ORG 0 ;程序从地址0开始MOV P1,#0FFH ;P1口设置为输入口MOV P0,#0FH ;P0口设置为输出口LOOP:MOV A,P1 ;读取P1口的值CJNE A,#0FFH,KEY_PRESSED ;判断是否有按键按下SJMP LOOP ;如果没有按键按下,继续循环KEY_PRESSED:MOV R0,A ;保存按键的值CLR P0.0 ;选定行0MOV A,P1ANL A,#0F0H ;按位与运算,保留列位的值CJNE A,#0F0H,COL0 ;判断是否有按键按下在第0列MOV A,#'0' ;如果在第0列按下按键,则A的值为0JMP DISP ;跳转到显示程序COL0:CLR P0.1 ;选定行1MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL1 ;判断是否有按键按下在第1列MOV A,#'1' ;如果在第1列按下按键,则A的值为1JMP DISP ;跳转到显示程序COL1:CLR P0.2 ;选定行2MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL2 ;判断是否有按键按下在第2列MOV A,#'2' ;如果在第2列按下按键,则A的值为2JMP DISP ;跳转到显示程序COL2:CLR P0.3 ;选定行3MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL3 ;判断是否有按键按下在第3列MOV A,#'3' ;如果在第3列按下按键,则A的值为3JMP DISP ;跳转到显示程序COL3:CLR P0.4 ;选定行4MOV A,P1ANL A,#0F0H4MOV A,#'4' ;如果在第4列按下按键,则A的值为4 JMP DISP ;跳转到显示程序COL4:CLR P0.5 ;选定行5MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL5 ;判断是否有按键按下在第5列 MOV A,#'5' ;如果在第5列按下按键,则A的值为5 JMP DISP ;跳转到显示程序COL5:CLR P0.6 ;选定行6MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL6 ;判断是否有按键按下在第6列 MOV A,#'6' ;如果在第6列按下按键,则A的值为6 JMP DISP ;跳转到显示程序COL6:CLR P0.7 ;选定行7MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL7 ;判断是否有按键按下在第7列 MOV A,#'7' ;如果在第7列按下按键,则A的值为7 JMP DISP ;跳转到显示程序COL7:MOV A,#00HJMP EXIT ;如果没有按下任何键,退出程序DISP: ;数码管显示程序MOV R1,#100B ;延时计数器初始化MOV P2,A ;把按键值存入P2口MOV A,#07HANL A,P0 ;从P0口读取选定的行值MOV P0,A ;根据选定的行值输出相应的值ACALL DELAY ;调用延时程序MOV P0,#0FH ;关闭所有行DJNZ R1,$ ;当延时计数器不为0时,继续延时MOV A,#0FHMOV P0,A ;清除所有显示JMP LOOP ;跳转回主程序EXIT:MOV P2.7,1 ;在数码管的最后一位显示字符1SJMP EXIT ;无限循环DELAY: ;延时程序MOV R2,#75DMOV R3,#200D DELAY3:DJNZ R3,$DJNZ R2,DELAY2 RET```。

矩阵键盘单个数码管显示C语言程序

矩阵键盘单个数码管显示C语言程序
case 0x48: P0=0x7c; break; //b
case 0x81: P0=0x39; break; //c
case 0x82: P0=0x5c; break; //d
case 0x84: P0=0x79; break; //e
case 0x88: P0=0x71; break; //f
keyvalue=(~code_h)+(~code_l); //键编码=行扫描值+列扫描值,返回主程序
return (keyvalue) ;
while((P1&0XF0)!=0XF0); //等待按键释放
}
else //该行没按键按下,左移,扫描下一行
code_h=(code_h<<1)|0X01;
}}Biblioteka }return(0x00); //无按键按下,返回0
}
矩阵键盘c语言代码单个数码管c语言矩阵求逆c语言矩阵乘法c语言输入单个字符c语言矩阵相乘c语言矩阵转置c语言矩阵c语言上三角矩阵c语言矩阵的逆
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code_h,code_l; //定义行扫描码,列检测数据
while ((code_h&0X10)!=0XF0) //判断是否为最后一行,否则继续扫描
{P1=code_h; //P1口输出行扫描值
if((P1&0XF0)!=0XF0) //如果P1.4~P1.7不全为1,该行有按键按下
{code_l=(P1&0XF0|0X0F); //保留P1口高4位,低4位变为1,作为列值

矩阵键盘程序c程序,51单片机.

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 *//*******************************************************//*********************************包含头文件********************************/#include<reg51.h>/*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E};/****************************************************************************函数功能:延时子程序入口参数:出口参数:****************************************************************************/ void delay(void){unsigned char i,j;for(i=0;i<20;i++)for(j=0;j<250;j++);}/****************************************************************************函数功能:LED显示子程序入口参数:i出口参数:****************************************************************************/ void display(unsigned char i){P2=0xfe;P0=table[i];}/****************************************************************************函数功能:键盘扫描子程序入口参数:出口参数:****************************************************************************/ void keyscan(void){unsigned char n;//扫描第一行P1=0xfe;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfe;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(3);break;case(0xd0):display(2);break;case(0xb0):display(1);break;case(0x70):display(0);break;}}}//扫描第二行P1=0xfd;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfd;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(7);break;case(0xd0):display(6);break;case(0xb0):display(5);break;case(0x70):display(4);break;}}}//扫描第三行P1=0xfb;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfb;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(11);break;case(0xd0):display(10);break;case(0xb0):display(9);break;case(0x70):display(8);break;}}}//扫描第四行P1=0xf7;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xf7;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(15);break;case(0xd0):display(14);break;case(0xb0):display(13);break;case(0x70):display(12);break;}}}}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){while(1){keyscan();}}。

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。

(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。

在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

操作方完成矩阵式键盘实验。

具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。

完成思考题。

三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。

2.在keil上进行编译后生成“xxx.hex”文件。

3.编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。

51单片机矩阵键盘C语言编程

51单片机矩阵键盘C语言编程

X1
19 X1
P20 P21 P22 P23 P24 P25 P26 P27
21 22 23 24 25 26 27 28
+5V
RES X1
+5V
C3 1uF
R1
C1
1K
X2
18 X2
RES
9 RESET
EA/VPP RD/P37 WR/P36 ALE/PRDG
PSEN
31 17 16 30 29
1
}
/****************************************************************************** 函数名称:void keyscan() 函数功能:键盘扫描及按键处理
******************************************************************************/
//如果有按键闭合
{ keyvalue=(~HSM)+(~(LJC|0x0f));
//计算键盘值
return(keyvalue);
//返回键值
} else HSM=(HSM<<1)|0x01;
//行扫描左移 1 位,准备扫描下一行}} Nhomakorabea}
return(0x00);
}
break;
case 0x12: P0=0x66; //4
break;
case 0x22: P0=0x6d; //5
break;
case 0x42: P0=0x7d; //6
break;
case 0x82: P0=0x07; //7
break;

基于矩阵键盘的加法器并用数码管显示

基于矩阵键盘的加法器并用数码管显示

基于矩阵键盘的加法器并用数码管显示一.任务解析用Verilog语言编写矩阵键盘驱动程序,实现“0~9,+,=”输入,数码管显示“加数”,按“+”键后再显示“被加数”,按“=”键后显示结果“和”。

二.实验方案键盘的识别有两种编程方法:方法一:module keyboard(clk,clr,keyv,C,L,k1);//输入行线[3:0]L input clk,clr; //输出扫描列线[3:0]C;input [3:0]L; //输出键值[3:0]keyv。

output[3:0]C;output k1;output [3:0]keyv;reg [1:0]scan;reg [3:0]C;reg k1;always @(posedge clk or negedge clr)begin//clk大概1000HZ if(!clr) scan=0;else beginscan=scan+2'h1;case(scan)2'H0:C=4'b1110;//列2'H1:C=4'b1101;2'H2:C=4'b1011;2'H3:C=4'b0111;endcaseendendreg [3:0]keyv;always @(negedge clk or negedge clr)begin if(!clr) begin keyv=0;k1=0;endelse begincase(L)4'HE:begin keyv={2'H0,scan};k1=1;end4'HD:begin keyv={2'H1,scan};k1=1;end4'HB:begin keyv={2'H2,scan};k1=1;end4'H7:begin keyv={2'H3,scan};k1=1;enddefault:k1=0;endcaseendendendmodule8 4 09 5 1+ 6 2= 7 3方法二:module key_recognize(clk,reset,row,col,key_value,key_flag);//50MHz clk,复位,行,列,键值input clk,reset;input [3:0]row;output [3:0]col;output [3:0]key_value;output key_flag;reg [3:0]col;reg [3:0]key_value;reg [5:0]count;//delay_20msreg [2:0]state;//状态标志reg key_flag;//按键标志位reg clk_500khz;//500KHZ时钟信号reg [3:0]col_reg;//寄存扫描列值reg [3:0]row_reg;//寄存扫描行值always @(posedge clk or negedge reset)if(!reset) begin clk_500khz<=0; count<=0; endelse beginif(count>=50) begin clk_500khz<=~clk_500khz;count<=0;end else count<=count+1;endalways @(posedge clk_500khz or negedge reset)if(!reset) begin col<=4'b0000;state<=0;endelsebegincase (state)0:begin col[3:0]<=4'b0000;key_flag<=1'b0;if(row[3:0]!=4'b1111) begin state<=1;col[3:0]<=4'b1110;end //有键按下,扫描第一行else state<=0;end1:beginif(row[3:0]!=4'b1111) begin state<=5;end//判断是否是第一行else begin state<=2;col[3:0]<=4'b1101;end//扫描第二行end2:beginif(row[3:0]!=4'b1111) begin state<=5;end//判断是否是第二行else begin state<=3;col[3:0]<=4'b1011;end//扫描第三行end3:beginif(row[3:0]!=4'b1111) begin state<=5;end//判断是否是第三一行else begin state<=4;col[3:0]<=4'b0111;end//扫描第四行end4:beginif(row[3:0]!=4'b1111) begin state<=5;end//判断是否扫描第一行else state<=0;end5:beginif(row[3:0]!=4'b1111) begincol_reg<=col;row_reg<=row;//保存扫描列、行值state<=5;key_flag<=1'b1;//有键按下endelse begin state<=0;endendendcaseendalways @(clk_500khz or col_reg or row_reg)beginif(key_flag==1'b1)begincase({col_reg,row_reg})8'b1110_1110:key_value<=0; 8'b1110_1101:key_value<=1; 8'b1110_1011:key_value<=2; 8'b1110_0111:key_value<=3; 8'b1101_1110:key_value<=4; 8'b1101_1101:key_value<=5; 8'b1101_1011:key_value<=6; 8'b1101_0111:key_value<=7; 8'b1011_1110:key_value<=8; 8'b1011_1101:key_value<=9; 8'b1011_1011:key_value<=10; 8'b1011_0111:key_value<=11; 8'b0111_1110:key_value<=12; 8'b0111_1101:key_value<=13; 8'b0111_1011:key_value<=14; 8'b0111_0111:key_value<=15;endcaseendendendmodule3 2 1 07 6 5 4= + 9 8三.重难点解析原理框图:从上图及以上两种按键识别程序可以看出,必须设置一个按键标志位以获取有效按键。

自己写的单片机矩阵键盘显示程序及仿真

自己写的单片机矩阵键盘显示程序及仿真

Protues 电路连接图如下所示:PS:矩阵键盘说明——4×4矩阵从左到右依次编码为1,,3,4,5,6,7,8,9,10,11,12,13,14,15,16按下某一按键,Led数码管就会显示相应的数字。

Keil C51 程序如下:有点不足望改进。

O(∩_∩)O谢谢!!!/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////#include <reg51.h>#define uchar unsigned char //宏的定义变量类型 uchar 代替 unsigned char#define uint unsigned int //宏的定义变量类型 uint 代替 unsigned intuchar dis_buf; //显示缓存uchar temp;uchar l,h,j; //定义行列void delay0(uchar x); //x*0.14MS// 此表为 LED 的字模 0 1 2 3 4 5 6 78 9uchar code LED7Code[] = {0xc0,0xf9,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};/************************************************************* * ** 延时子程序 ** **************************************************************/void delay(uchar x){ uchar j;while((x--)!=0) //CPU执行x*12次,x=10{ for(j=0;j<50;j++){;}}}/************************************************************* * * * 键扫描子程序 (4*4的矩阵) P1.4 P1.5 P1.6 P1.7为行 * * P1.0 P1.1 P1.2 P1.3为列 ** * *************************************************************/void keyscan(void){ temp=0;P1=0xF0; //高四位输入行为高电平列为低电delay(3); //延时temp=P1; //读P1口temp=temp&0xF0;//屏蔽低四位temp=~((temp>>4)|0xF0); //高四位取反无键按下取反应为0xf0if(temp==1) //0001 [1,1] 被拉低h=1;else if(temp==2) //0010[2,1] 被拉低h=2;else if(temp==4) //0100[3,1] 被拉低h=3;else if(temp==8) //1000[4,1] 被拉低h=4;dis_buf = h;dis_buf = (dis_buf<<4) & 0xf0; //行信息现存在第四位delay(10);P1=0x0F; //低四位输入列为高电平行为低电平delay(3); //延时temp=P1; //读P1口temp=temp&0x0F; //屏蔽高四位temp=~(temp|0xF0); //取反if(temp==1) //1列被拉低l=1;else if(temp==2) //2列被拉低l=2;else if(temp==4) //3列被拉低l=3;else if(temp==8) //4列被拉低l=4;l= l & 0x0f;delay(3);dis_buf= l | dis_buf;}/************************************************************** **判断键是否按下 ** **************************************************************/void keydown(void){P2=0xF0; //显示00P3=0xf0;//将高4位全部置1 低四位全部置0if(P1!=0xF0) //判断按键是否按下如果按钮按下会拉低P1其中的一个端口{keyscan(); //调用按键扫描程序}}void display( ){j=50;while(j){P2= 0x80;P0= LED7Code[0];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display1( ){j=50;while(j){P2= 0x80;P0= LED7Code[2];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display2( ){j=50;while(j){P2= 0x80;P0= LED7Code[3];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display3( ){j=50;while(j){P2= 0x80;P0= LED7Code[4];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display4( ){j=50;while(j){P2= 0x80;P0= LED7Code[5];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;} }void display5( ){j=50;while(j){P2= 0x80;P0= LED7Code[6];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}/************************************************************** ** 主程序 ** **************************************************************/ void main(){P0=0xc0;delay(20); //延时while(1){ keydown(); //调用按键判断检测程序switch( dis_buf){case 0x11 : P2=0x80; P0= LED7Code[1]; break;case 0x12 : P2=0x80; P0= LED7Code[2]; break;case 0x13 : P2=0x80; P0= LED7Code[3]; break;case 0x14 : P2=0x80; P0= LED7Code[4]; break;case 0x21 : P2=0x80; P0= LED7Code[5]; break;case 0x22 : P2=0x80; P0= LED7Code[6]; break;case 0x23 : P2=0x80; P0= LED7Code[7]; break;case 0x24 : P2=0x80; P0= LED7Code[8]; break;case 0x31 : P2=0x80; P0= LED7Code[9]; break;case 0x32 : display();break;case 0x33 : P2 = LED7Code[1]; P0= LED7Code[1]; break;case 0x34 : display1(); break;case 0x41 : display2(); break;case 0x42 : display3();; break;case 0x43 : display4();; break;case 0x44 : display5();; break;}delay(250);}}/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////(注:本资料素材和资料部分来自网络,仅供参考。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
case 0x41: P0=0x7f; break; //8
case 0x42: P0=0x67; break; //9
case 0x44: P0=0x77; break; //a
case 0x48: P0=0x7c; break; //b
case 0x81: P0=0x39; break; //cuchar keysc来自n();/*主函数*/
void main () //键值处理
{
while(1)
{
tmp=keyscan();//调用键盘扫描程序
switch(tmp)
{ case 0x11: P0=0x3f; break; //0
case 0x12: P0=0x06; break; //1
case 0x14: P0=0x5b; break; //2
{delay(); //延时消抖动
if((P1&0XF0)!=0XF0) //重读高4位,若还是不全为1,定有键按下
{code_h=0XFE; //P1.0置为0,开始行扫描
while ((code_h&0X10)!=0XF0) //判断是否为最后一行,否则继续扫描
{P1=code_h; //P1口输出行扫描值
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code_h,code_l; //定义行扫描码,列检测数据
uchar tmp,keyvalue; //定义接收键值
/*函数说明*/
void delay(void);
if((P1&0XF0)!=0XF0) //如果P1.4~P1.7不全为1,该行有按键按下
{code_l=(P1&0XF0|0X0F); //保留P1口高4位,低4位变为1,作为列值
keyvalue=(~code_h)+(~code_l); //键编码=行扫描值+列扫描值,返回主程序
return (keyvalue) ;
{uchar i;
for(i=0;i<200;i++){}
}
/*键盘扫描函数*/
uchar keyscan(void)
{uchar code_h; //行扫描
uchar code_l; //列扫描
P1=0XF0; //P1.0~P1.3置0,准备读列状态
if((P1&0XF0)!=0XF0) //如果P1.4~P1.7不全为1,可能有键按下
case 0x18: P0=0x4f; break; //3
case 0x21: P0=0x66; break; //4
case 0x22: P0=0x6d; break; //5
case 0x24: P0=0x7d; break; //6
case 0x28: P0=0x07; break; //7
while((P1&0XF0)!=0XF0); //等待按键释放
}
else //该行没按键按下,左移,扫描下一行
code_h=(code_h<<1)|0X01;
}
}
}
return(0x00); //无按键按下,返回0
}
case 0x82: P0=0x5c; break; //d
case 0x84: P0=0x79; break; //e
case 0x88: P0=0x71; break; //f
case 0x00: ; break;
default:P0=0x00;
}
delay();
}
}
/*延时函数*/
void delay(void)
相关文档
最新文档