CH451按键及显示完整程序
根据提供的文件信息,本文将详细解析“CH451按键及显示完整程序”中的关键知识点。这段代码展示了如何使用CH451芯片与单片机进行通信和控制,特别是介绍了如何利用中断处理按键输入,而不是传统的I/O查询方法。 ### 一、CH451简介 CH451是一款多功能的串行接口键盘/LED驱动器,适用于各种基于微控制器的系统设计。它集成了键盘扫描、字符LED显示等多种功能,并且可以通过简单的串行接口与微控制器连接,大大简化了系统的硬件设计。 ### 二、代码分析 #### 1. 变量定义与初始化 代码首先定义了几个与CH451相关的引脚: - `sbitch451_dclk`: 数据时钟引脚。 - `sbitch451_din`: 数据输入引脚。 - `sbitch451_load`: 加载信号引脚。 - `sbitch451_dout`: 数据输出引脚(用于读取按键值)。 接着定义了一个无符号整型变量`K`,用于存储读取到的按键值。 #### 2. 主函数分析 主函数`main()`执行以下操作: - 初始化CH451:通过调用`ch451_write()`函数发送初始化命令`0x0403`来设置系统模式,发送命令`0x500`使能显示功能,以及发送命令`0x83f`设置显示模式为8位显示。 - 设置外部中断1(`EX1`)为开启状态,并开启全局中断(`EA`)。 - 进入无限循环等待事件发生。 #### 3. 外部中断服务函数 当检测到按键按下时,外部中断服务函数`intr_int0()`被触发。该函数执行以下操作: - 关闭全局中断以防止中断嵌套。 - 发送命令`0x300`选择第1个显示位。 - 发送命令`0x700`进入读取模式。 - 读取按键值并通过`ch451_read()`函数返回。 - 根据读取到的按键值更新显示内容。 - 重新开启全局中断。 #### 4. 写数据函数 `ch451_write()`函数用于向CH451写入命令或数据。其具体步骤如下: - 禁用外部中断1。 - 将加载信号置低,准备写入数据。 - 循环12次,每次发送一位数据,然后移位并等待时钟信号确认。 - 最后释放加载信号,并重新启用外部中断1。 #### 5. 读数据函数 `ch451_read()`函数用于从CH451读取数据。它的工作原理是: - 禁用外部中断1。 - 发送命令选择读取模式。 - 将加载信号置高,通知CH451开始传输数据。 - 读取7位按键数据,每次读取一位,然后移位并等待时钟信号确认。 - 根据读取到的按键编码转换成对应的按键值。 ### 三、按键中断处理机制 本代码中的按键处理采用了中断触发的方式,即当按键被按下时,通过外部中断的方式触发相应的中断服务程序。这种方法相比于传统的I/O查询方式有以下优势: - **响应速度快**:中断机制可以确保在按键被按下时立即响应,避免了不必要的延时。 - **节省资源**:由于无需频繁查询按键状态,因此可以节省CPU资源,提高系统的整体效率。 - **易于扩展**:通过中断处理可以轻松地增加更多的按键而不会显著增加程序复杂度。 ### 四、总结 本代码提供了一个完整的示例,展示了如何使用CH451芯片实现按键扫描和LED显示的功能。通过合理的中断机制和高效的通信协议,实现了对单片机资源的有效利用,为实际应用提供了良好的参考。
sbit ch451_dclk=P1^7; //串行数据时钟上升延激活
sbit ch451_din=P1^6; // 串行数据输出,接CH451的数据输入
sbit ch451_load=P1^5; //串行命令加载,上升延激活
sbit ch451_dout=P3^3; //INT1,键盘中断和键值数据输入,接CH451的数据输出
unsigned int K;
void ch451_write(unsigned int command);
unsigned char ch451_read();
void main()
{ch451_write(0x0403); //设定系统参数
ch451_write(0x500); //设定显示参数
ch451_write(0x83f); //调程序时测试用的,最后一位显示0,可不用它
EX1=1;
EA=1;
while(1); //等待按键
}
void intr_int0() interrupt 2
{
unsigned char m;
EA=0;
ch451_write(0x300); //左移1位
ch451_write(0x700);
m=ch451_read(); //接收并判断键码,将键码结果放入t中
ch451_write(0x800|m); //根据键码判断结果,发送显示命令
EA=1;
}
//输出命令子程序
//定义一无符号整型变量存储12字节的命令字。
void ch451_write(unsigned int command)
- LYuer_2018-12-25不知道好不好,下完才发现是89C51的程序,而我用的是stm32
- men84738262012-10-15还不错 要是 有I/O查询方式的就好啦
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助