80c51行列式键盘扫描程序

根据给定的信息,本文将详细解释“80c51行列式键盘扫描程序”的核心概念、编程细节及其在单片机系统中的应用。 ### 一、80c51单片机简介 80c51是基于MCS-51架构的一种8位微控制器,广泛应用于各种嵌入式系统中。它具有丰富的内部资源,如定时器/计数器、串行通信接口等,并支持多种外部中断源。由于其高性价比和易于开发的特点,在教学和工业控制领域非常受欢迎。 ### 二、行列式键盘原理 行列式键盘是一种经济高效的键盘设计方案,通过将按键分布在若干行和列的交叉点上实现。通常,行线被配置为输出线,列线被配置为输入线。当按下某个按键时,对应的行线和列线之间会形成一个闭合电路,从而可以通过软件检测到这个变化。这种方式可以大大减少所需的I/O端口数量。 ### 三、80c51行列式键盘扫描程序详解 #### 3.1 程序结构 程序主要包括了几个关键部分:液晶显示(LCD)初始化、键盘扫描和主循环处理。 - **LCD初始化**:这部分代码用于设置液晶显示器的基本参数,包括数据模式、屏幕开启状态等。 - **键盘扫描**:这是程序的核心部分,负责检测用户按键动作,并根据按键执行相应的功能。 - **主循环**:程序的主要执行流程,不断循环执行键盘扫描和显示更新。 #### 3.2 LCD显示函数 - `LCD_command`:用于向LCD发送命令,如设置地址、清屏等。 - `LCD_data`:向LCD发送显示数据。 - `LCD_set_xy`:设置光标位置。 - `LCD_write_char`:在指定位置写入字符。 - `LCD_write_string`:在指定位置写入字符串。 - `LCD_init`:初始化LCD,设置初始状态。 - `ReadStatus`:读取LCD的状态。 - `delay_400ms`:延时函数,用于控制显示刷新率。 #### 3.3 键盘扫描 - **变量定义**: - `key_hit`:表示是否有键被按下。 - `key_buffer`:记录按下的键值。 - `function_reg`:存储按键对应的命令编号。 - `Flag`:标志位,用于控制程序流程。 - **主循环逻辑**: - 首先初始化LCD并清除屏幕。 - 不断检测是否有键被按下。 - 如果有键按下,则读取键值,并根据键值执行相应操作(例如显示数字)。 ### 四、关键代码解析 ```c sbitkey_scan_0=P2^5; sbitkey_scan_1=P2^6; sbitkey_scan_2=P2^7; ``` 这里定义了三个按键扫描引脚,分别对应P2端口的第5、6、7位。这些引脚用于连接行列式键盘的行线。 ```c if(key_hit)/*м£ֵ*/ { key_hit=0;user_cnt=0; user_reg=key_buffer; for(user_buffer=0;user_buffer<5;user_buffer++) { if(user_reg&0x01){user_cnt++;} else{break;} user_reg>>=1; } ``` 这段代码检测是否有键被按下。如果有键被按下(`key_hit`为真),则清除标志位,并读取按键值(`key_buffer`)。接着通过位运算判断按下的键的具体值,并将结果存储在`user_cnt`中。 ```c if(user_reg&0x40){function_reg=user_cnt+10;} else{ if(user_reg&0x20){function_reg=user_cnt+5;} else{function_reg=user_cnt;} } ``` 根据按键值的不同,将按键映射到不同的命令编号。这种编码方式可以根据实际需求进行调整。 ### 五、总结 本文详细介绍了80c51行列式键盘扫描程序的关键知识点,包括单片机的基本介绍、行列式键盘的工作原理以及程序的具体实现细节。通过理解这些内容,可以帮助开发者更好地掌握和应用这类程序。




























#include <intrins.h>
// lcd disp
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xC0
#define DATA_MODE 0x38
// #define OPEN_SCREEN 0x0f
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLR 0x01
// lcd disp
void delay(unsigned int);
#define uchar unsigned char
#define uint unsigned int
sbit key_scan_0 = P2^5;
sbit key_scan_1 = P2^6;
sbit key_scan_2 = P2^7;
// lcd disp
sbit LCD1602_RS=P3^5; /* Data Command Pin 1 data 0 command pin 4 */
sbit LCD1602_RW=P3^6; /* Read Write Pin 1 read 0 write pin 5 */
sbit LCD1602_EN=P3^7; /* LCD Enable Signal pin 6 */
sbit LCD1602_BUSY_status = P0^7;
void LCD_command(unsigned char command,unsigned char BusyC);
void LCD_data(unsigned char command,unsigned char BusyC);
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_init(void);/* lcd initize function */
unsigned char ReadStatus(void);
void delay_400ms(void); /* delay function */
// lcd disp
uchar data milisecend_10; /*10 毫秒计数器*/
uchar data milisecend_100; /*100毫秒计数器*/
uchar data secend; /*秒计数器*/
uchar data key_cnt; /*按键计数器*/
uchar data disp_buff[6];
uchar data disp_cnt;
uchar data key_buffer; /*键值缓冲器*/
uchar data function_reg;
uchar bdata Flag; /*标志字节1*/
sbit key_hit = Flag ^ 0; /*有键按下标志位*/
sbit flag_100ms = Flag ^ 1;
void main(void)
{
int year00,month00,day00,k,i,disp_num;
uchar user_reg,user_buffer,user_cnt;
delay(1000);
TMOD = 0x11;
剩余7页未读,继续阅读

- 榷垚2016-07-19感谢提供资源~


- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 《软件工程》第一次实验报告.doc
- 交通工程项目管理模式探讨.docx
- 【风力发电领域】基于深度学习的风机齿轮箱故障识别方法研究:混合神经网络与迁移学习提升运维效率(论文复现含详细代码及解释)
- 金属加工行业网站建设策划.doc
- 国家一级设计方案师十年用CAD精髓-连载一二.doc
- 电气自动化仪表工程安装及调试探析.docx
- 光学工程基于深度学习的计算全息图生成算法研究:加速全息图生成并提升再现质量的卷积神经网络模型设计(论文复现含详细代码及解释)
- 电子商务C2B运营模式探讨.doc
- 通信工程中有线传输技术的应用改进.docx
- 云计算数据中心方案建议书.doc
- 迈向大数据时代的大都市治理研究.docx
- 这篇文章详细介绍了基于深度学习的智慧大棚监测系统的开发与实现,涵盖了环境数据预测、植物三维重建、植物表型测量以及系统集成等多个方面的技术细节(论文复现含详细代码及解释)
- 现代信息处理工具——计算机.ppt
- 单片机的6层电梯模拟控制系统研究与设计开发课程研究与设计开发报告.doc
- 光伏电站新能源场站电力监控系统安全防护总体方案.docx
- 谈计算机网络技术与安全管理维护.doc


