锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

3*5矩阵键盘(IO任意定义)

时间:2024-04-18 21:37:09

#include "reg51.h"

#include "intrins.h" typedef unsigned char uint8; // 无符号8位整型变量 typedef signed char int8; // 有符号8位整型变量 typedef unsigned short uint16; // 无符号16位整型变量 typedef signed short int16; // 有符号16位整型变量 typedef unsigned int uint32; // 无符号32位整型变量 typedef signed int int32; // 有符号32位整型变量 typedef float fp32; // 单精度浮点数(32位长度) typedef double fp64; // 双精度浮点数(64位长度) //串口有关的定义 //#define FOSC 18432000L //系统频率 #define FOSC 11059200L #define BAUD 9600 //串口波特率 #define N E_PARITY 0 //无校验 #define ODD_PARITY 1 //奇校验 #define EVEN_PARITY 2 //偶校验 #define MARK_PARITY 3 //标记校验 #define S _PARITY 4 //空白校验 #define PARITYBIT NONE_PARITY //定义校验位 sfr AUXR = 0x8e; //辅助寄存器 sfr P_SW1 = 0xA2; //外设功能切换寄存器1 #define S1_S0 0x40 //P_SW1.6 #define S1_S1 0x80 //P_SW1.7 sbit P22 = P2^2; bit busy; sbit row0 = P1 ^ 1; sbit row1 = P1 ^ 2; sbit row2 = P1 ^ 3; sbit row3 = P1 ^ 4; sbit row4 = P1 ^ 5; sbit col0 = P3 ^ 2; sbit col1 = P3 ^ 3; sbit col2 = P3 ^ 6; void Delay(uint16 count) { uint8 i; while(--count != 0) { for(i = 0; i < 125; i++); // ";" 表示空语句, 空转。 } // i 从0加到125,在12M晶体下CPU大概耗时1毫秒 } uint8 KeyDown(void) { col0=0; col1=0; col2=0; // 列线全部置低 if((row0==0) || (row1==0) || (row2==0) || (row3==0) || (row4 == 0)) // 若有任一行线读回状态为低 { Delay(80); // 延时消抖 if((row0==0) || (row1==0) || (row2==0) || (row3==0) || (row4 ==0)) // 再次读行线状态,若有任一行线读回状态为低 return 1; // 返回1,表明有 按下 else return 0; // 返回0,表明无键盘按下 } else return 0; } uint8 KeyUp(void) { col0=0; col1=0; col2=0; // 列线全部置低 if((row0==1) && (row1==1) && (row2==1) && (row3==1) && (row4 == 1)) // 若全部行线读回状态都为高 { Delay(80); // 延时消抖 if((row0==1) && (row1==1) && (row2==1) && (row3==1) && (row4 == 1)) // 再次读行线状态,若全部行线读回状态都为高 return 1; // 返回1,表明所有键盘都处于弹起状态 else return 0; // 返回0,表明有键盘处于按下状态 } else return 0; } uint8 KeyNum(void) { uint8 KeyTemp; KeyTemp=0; if(KeyDown()==1) // 若键盘被按下 { col1=0; col2=1; col2=1; // 将列线1置低,其他列线置高 if (row0==0) KeyTemp=1; // 若行线0读回状态为低,则表明按键1被按下 if (row1==0) KeyTemp=4; // 若行线1读回状态为低,则表明按键4被按下 if (row2==0) KeyTemp=7; // 若行线2读回状态为低,则表明按键7被按下 if (row3==0) KeyTemp=11; // 若行线3读回状态为低,则表明按键"."被按下 11表示 . if (row4==0) KeyTemp=13; // 若行线4读回状态为低,则表明按键"取消"被按下 13表示 col0=1; col1=0; col2=1; // 将列线1置低,其他列线置高 if (row0==0) KeyTemp=2; // 若行线0读回状态为低,则表明按键2被按下 if (row1==0) KeyTemp=5; // 若行线1读回状态为低,则表明按键5被按下 if (row2==0) KeyTemp=8; // 若行线2读回状态为低,则表明按键8被按下 if (row3==0) KeyTemp=10; // 若行线3读回状态为低,则表明按键0被按下 10表示0 if (row4==0) KeyTemp=14; // 若行线4读回状态为低,则表明按键"功能"被按下 14表示 col0=1; col1=1; col2=0; // 将列线2置低,其他列线置高 if (row0==0) KeyTemp=3; //若行线0读回状态为低,则表明按键3被按下 if (row1==0) KeyTemp=6; //若行线1读回状态为低,则表明按键6被按下 if (row2==0) KeyTemp=9; //若行线2读回状态为低,则表明按键9被按下 if (row3==0) KeyTemp=12; //若行线3读回状态为低,则表明按键"退格"键被按下 退格 12 表示 if (row4==0) KeyTemp=15; //若行线4读回状态为低,则表明按键"确认"键被按下 确认 15 表示 while ( KeyUp()!=1); // 等待按下的键盘被释放 return KeyTemp; // 返回被按下并被释放的键盘的编号 } else return 0; //表示无按键按下 } void Uart() interrupt 4 using 1 { if (RI) { RI = 0; //清除RI位 //P0 = SBUF; //P0显示串口数据 // P22 = RB8; //P2.2显示校验位 } if ( ) { TI = 0; //清除TI位 busy = 0; //清忙标志 } } void SendData(uint8 dat) { while (busy); //等待前面的数据发送完成 赋值累加器 ACC = dat; //获取校验位P (PSW.0) if (P) //根据P来设置校验位 1奇校验 0偶数校验 { #if (PARITYBIT == ODD_PARITY) TB8 = 0; //设置校验位为0 #elif (PARITYBIT == EVEN_PARITY) TB8 = 1; //设置校验位为1 #endif } else { #if (PARITYBIT == ODD_PARITY) TB8 = 1; //设置校验位为1 #elif (PARITYBIT == EVEN_PARITY) TB8 = 0; //设置校验位为0 #endif } busy = 1; SBUF = ACC; //写数据到UART数据寄存器 } void SendString(char *s) { while (*s) //检测字符串结束标志 { SendData(*s++); //发送当前字符 } } void init_ser() { //切换串口位置 C代码 ACC = P_SW1; ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0 P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD) //确定数据与校验位 STC代码 #if (PARITYBIT == NONE_PARITY) SCON = 0x50; //8位可变波特率 #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) SCON = 0xda; //9位可变波特率,校验位初始为1 #elif (PARITYBIT == ACE_PARITY) SCON = 0xd2; //9位可变波特率,校验位初始为0 #endif AUXR = 0x40; //定时器1为1T模式 TMOD = 0x20; //定时器1为模式2(8位自动重载) = (256 - (FOSC/32/BAUD)); //设置波特率重装值 TH1 = (256 - (FOSC/32/BAUD)); TR1 = 1; //定时器1开始工作 ES = 1; //使能串口中断 EA = 1; } void main() { init_ser(); while(1) { SendData(KeyNum()); } }
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章