dianzi

更新时间:2024-02-03 17:39:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

?

摘要:介绍一种新型的键盘显示驱动芯片CH451的性能特点和工作原理,给出了CH451键盘显示驱动芯片和MCS-51单片机的接口方法和相应的软件驱动程式。

关键词:键盘显示控制;单片机;CH451

单片机在研发过程中,常常会因为资源不足而不得不大量扩展接口芯片以满足应用系统的需要,其中原因之一是人机界面中的键盘显示占用了系统太多资源,从而造成系统庞大,同时降低了系统的可靠性。在单片机应用系统中,键盘显示通常可采用以下几种方式:

(1)采用并行接口的键盘显示专用芯片8279。但8279所需外围元件多(显示驱动、译码等)、占用电路板面积大、综合成本高,在中小系统中常常大材小用;

(2)采用通用并行I/O芯片扩展(如用8155等),但此方案同样需要驱动显示,同时键盘显示扫描还需占用CPU大量时间;

(3)采用专用显示控制器,并用CPU的I/O引脚完成键盘输入(如MC14499、PS7219、MAX7219、ICM7218、TLC5921等,大多是串行接口并有显示驱动能力,I/O占用少)。这种接口方式省去了显示的扫描,而且电路大多也非常简单,通常在系统需要的按键较少时比较适用;

(4)采用带I2C总线的键盘显示芯片(如显示用SAA1064,键盘用PCF8574),不过这种方式对于无I2C总线接口的CPU来说,编程显得有些不便;

(5)采用串行接口的键盘显示专用芯片,如BC7280/81、HD7279、CH451等。这类芯片占用CPU的资源少,传输速度较快,外围器件需求也较少,在中小系统中都可得到广泛的应用。BC7280/81和HD7279中已有介绍,本文着重介绍CH451的主要特性及接口应用方法。

1 CH451的功能和引脚介绍

CH451是个整合了数码管显示驱动和键盘扫描控制及μP监视的多功能外围芯片。CH451内置RC振荡电路,能直接动态驱动8位数码管或64位LED,具有BCD译码或不译码功能,可实现数据的左移、右移、左循环、右循环、各数字独立闪烁等控制功能。CH451内置大电流驱动级,段电流不小于30mA,字电流不小于160mA,并有16 级亮度控制功能;在键盘控制方面,该器件内置64键键盘控制器,可实现8×8矩阵键盘扫描,并内置去抖动电路,可提供按键中断和按键释放标志位等功能;在外部接口方面,CH451可选择简洁的1线串行接口或高速4线串行接口,且内置上电复位,可提供高电平有效复位和低电平有效复位两种输出,同时内置看门狗电路Watch-Dog。CH451提供有28引脚的DIP28和SOP28封装及DIP24S封装形式,28脚和24脚在功能上稍有差别,他们的引脚定义见表1所列。

表1 CH451的引脚说明 28脚引脚号 24脚引脚号 23 9 25 26 2 15 4 5 引脚名称 VCC GND LOAD DIN 类 型 电源 电源 输入 输入 引 脚 说 明 正电源,持续电流不小于200mA 接地,持续电流不小于200mA 4线串行接口的数据加协,带上拉 4线串行接口的数据输入,带上拉 27 24 22~15 6 3 DCLK DOUT 输入 输出 串行接口听数据时钟,带上拉,可同时用于看门狗的清除输入 串行接口的数据输出键盘中断 数码管的段驱动,高电平有效,键盘扫描输入,高电平有效,带下拉 数码管的字驱动,低电平有效,键盘扫描输入,高电平有效,带下拉 上电复位和看门狗复位,高电平有效 上电复位和看门狗复位,低电平有效 上电复位门限调整或手工复位输入 段电流上限调整,带强下拉 外接阻容振荡 CLK引脚时钟信号的二分频输出 不连接,禁止使用 1、24~18 DIG7~SEG0 三态输出及输入 1~8 12 13 28 14 10 11 7~14 不支持 不支持 不支持 不支持 不支持 不支持 17 DIG7~DIG0 RST RST RSTI ADJ CLK CLKO NC 输出 输出 输出 输入 输入 输入 输出 2 CH451的操作命令

CH451的操作命令均为12位,其中高4位为标识码,低8位为参数,各操作命令如下: ●空操作:0000xxxxxxxxB(x可为任意值,下同)

空操作命令对CH451不产生所有影响。该命令能在多个CH451级联的应用中透过前级CH451向后级CH451发送操作命令而不影响前级CH451的状态。例如,要将操作命令001000000001B发送给两级级联电路中的后级CH451(后级CH451的DIN引脚连接到前级CH451的DOUT引脚),只要在该操作命令后添加空操作命令000000000000B再发送,那么,该操作命令将经过前级CH451到达后级CH451,而空操作命令留给了前级CH451。另外,为了在不影响CH451的前提下变化DCLK以清除看门狗计时器,也能发送空操作命令。在非级联的应用中,空操作命令可只发送高4位。

● 芯片内部复位:001000000001B

内部复位命令可将CH451的各个寄存器和各种参数复位到默认的状态。芯片上电时,CH451均被复位,此时各个寄存器均复位为0,各种参数均恢复为默认值。

● 字数据移位:0011000000[D1][D0]B

字数据移位命令共有4个:开环左移、右移,闭环左移、右移。D0为0时为开环,为1时为闭环,D1为0时左移,为1时为右移。开环左移时?DIG0引脚对应的单元补00H,此时不译码方式显示为空格,BCD译码方式时显示为0;开环右移时,DIG7引脚对应的单元补00H;而在闭环时?DIG0和DIG7头尾相接,闭环移位。

● 设定系统参数:010000000[WDOG][KEYB][DISP]B

该命令用于设定CH451的系统级参数?如看门狗使能WDOG、键盘扫描使能KEYB、显示驱动使能DISP等。各个参数均可通过1位数据来进行控制,将相应的数据位置为1可启用该功能,否则关闭该功能(默认值)。

● 设定显示参数:0101[MODE][LIMIT][INTENSITY]B

此命令用于设定CH451的显示参数,如译码方式MODE(1位)、扫描极限LIMIT(3位)、显示亮度INTENSITY(4位)等。译码方式MODE为1时选择BCD译码方式,为0时选择不译码方式。CH451默认工作于不译码方式,此时8个数据寄存器中字节数据的位7~

位0分别对应8个数码管的小数点和段G~段A,当数据位为1时,对应的数据段(或发光管)点亮;数据位为0时熄灭。CH451工作于BCD译码方式主要应用于数码管驱动,单片机只要给出二进制数的BCD码,便可由CH451将其译码并直接驱动数码管以显示对应的字符。BCD译码方式是对数据寄存器中字节数据的位4~位0进行兼容BCD的译码,可用于控制段驱动引脚SEG6~SEG0的输出,他们对应于数码管的段G~段A,同时可用字节数据的位7控制段来驱动引脚SEG7的输出以对应数码管的小数点,字节数据的位6和位5不影响BCD译码的输出,他们能是任意值。将位4~位0进行BCD译码可显示以下28个字符,其中00000B~01111B分别对应于“0~F”、10000B~11010B分别对应于“ ”?空格? 、“+”?+或加号? 、“-”?负号或减号? 、“=”?等于号? 、“?"?左方括号? 、“?”?右方括号? 、“_”?下划线? 、“H” 、“L” 、“P” 、“.”?小数点? 、其余值为空格。

扫描极限LIMIT控制位001B~111B和000B(默认值)可分别设定扫描极限1~7和8。显示亮度INTENSITY控制位的0001B~1111B和0000B(默认值)则用于分别设定显示驱动占空比1/16~15/16 和16/16,以实现16级显示亮度控制。

●设定闪烁控制:0110[D7S][D6S][D5S][D4S][D3S][D2S][D1S][D0S]B 设定闪烁控制命令用于设定CH451的闪烁显示属性,其中D7S~D0S 分别对应于8个字驱动DIG7~DIG0。闪烁属性D7S~D0S分别通过1位数据控制,将相应的数据位置为1可使能闪烁显示,否则为正常显示,不闪烁(默认值)。

●加载字数据:1[DIG_ADDR][DIG_DATA]B

加载字数据命令用于将字节数据DIG_DATA(8位)写入DIG_ADDR(3位)指定的数据寄存器中。DIG_ADDR的000B~111B分别用于指定数据寄存器的地址0~7,并分别对应于DIG0~DIG7引脚驱动的8个数码管。DIG_DATA为待写入的字节数据。

●读取按键代码:0111xxxxxxxxB

读取按键代码命令用于获得CH451最近检测到的有效按键的按键代码。该命令是唯一的具有数据返回的命令,CH451通常从DOUT引脚输出按键代码,按键代码总是7位数据,最高位是状态码,位5~位0是扫描码。读取按键代码命令的位数据B7~B0能是任意值,所以控制器能将该操作命令缩短为4位数据B11~B8。例如,CH451检测到有效按键并中断时,如按键代码是5EH,则先向CH451发出读取按键代码命令0111B,然后再从DOUT获得按键代码5EH。

CH451所提供的按键代码为7位,位2~位0是列扫描码,位5~位3是行扫描码,位6是状态码(键按下为1,键释放为0)。例如,连接DIG3和SEG4的键被按下时,按键代码为63H,键被释放后,按键代码是23H。单片机能在所有时候读取按键代码,但一般在CH451检测到有效按键而产生键盘中断时读取按键代码,此时按键代码的位6总是1。另外,如果需要了解按键何时释放,单片机能通过查询方式定期读取按键代码,直到按键代码的位6为0。表2是连接在DIG7~DIG0和SEG7~SEG0之间的键被按下时,CH451所提供的按键代码。这些按键代码具有一定的规律,如果需要键被释放时的按键代码,可将表2中的按键代码的位6 置0,也可将表中的按键代码减去40H。应注意的是:CH451不支持组合键,也就是说,同一时刻,不能有两个或更多的键被按下。

表2 CH451的键盘编码表

3 串行接口应用电路

CH451和MCS-51单片机的连接如图1所示,其中DOUT引脚最佳连接到单片机的中断输入引脚,这样可用中断方式响应按键。如果连接到非中断输入引脚,则应该使用查询方式确定CH451是否检测到有效按键,同时还可向单片机提供复位信号RESET并带Watch-Dog功能。CH451的段驱动引脚串接的电阻R1(200Ω)用于限制和均衡段驱动电流。在5V电源电压下,串接200Ω电阻通常对应13mA段电流。CH451具有64键的键盘扫描功能,为了防止键被按下后在SEG信号线和DIG信号线之间形成短路而影响数码管显示,一般应在CH451的DIG0~DIG7引脚和键盘矩阵之间串接限流电阻R2,其阻值能从1kΩ至10kΩ。

将P1.0和DIN连接可用于输入串行数据,串行数据输入的顺序是低位在前,高位在后。另外,在上电复位后,CH451 默认选择1线串行接口,如需选择4线串行接口,则应在DCLK输出串行时钟之前,先在DIN上输出一个低电平脉冲,以通知CH451为4线串行接口。将P1.1和DCLK连接可提供串行时钟,以使CH451在其上升沿从DIN输入数据,并在其下降沿从DOUT输出数据。LOAD用于加载串行数据,CH451一般在其上升沿加载移位寄存器中的12位数据以作为操作命令进行分析并处理。也就是说,LOAD的上升沿是串行数据帧的帧完成标志,此时无论移位寄存器中的12位数据是否有效,CH451都会将其当作操作命令来处理。应注意的是,在级联电路中,单片机每次输出的串行数据必须是单个CH451的串行数据的位数乘以级联的级数。

下面是该电路的驱动程式: ;主程式需要定义的参数

DCLK BIT P1.1 ;串行数据时钟,上升沿激活 DIN BIT P1.0 ;串行数据输入

LOAD BIT P1.2 ;串行命令加载,上升沿激活

DOUT BIT P3.2 ;接INT0,键盘中断和键值数据输出 KEY DATA 7FH ;存放键盘中断时读取的键值 ;******* 初始化子程式 ******* INIT? CLR DIN ;先低后高,输出上升沿通知 CH451选择4线串行接口

SETB DCLK ;置为默认的高电平 SETB DIN SETB LOAD

SETB DOUT ;置为输入

MOV B?#04H ;设置系统参数命令

MOV A?#07H ; Watch-Dog使能,开键盘、显示功能

LCALL WRITE

MOV B?#03H ;设置移位命令 MOV A?#00H ;开环左移 LCALL WRITE

MOV B?#05H ;设置显示参数

MOV A?#00H ;不译码,8位显示,最亮 LCALL WRITE

MOV B?#06H ;设置闪烁控制 MOV A?#00H ;不闪烁 LCALL WRITE

CLR IT0 ;置外部信号为低电平触发 CLR IE0 ;清中断标志 SETB EX0 ;允许键盘中断 SETB EA RET

;******* 输出命令子程式 ******

;入参:B、ACC待写的12位数据? 低8位在ACC中? 高4位在B的低4位中 WRITE? CLR EX0 ;禁止键盘中断 CLR LOAD ;命令开始,此命令能放在后面 MOV R7?#08H ;将ACC中8位送出 WRITE_8?RRC A ;低位在前,高位在后 CLR DCLK

MOV DIN?C ;送出一位数据 SETB DCLK ;产生时钟上升沿通知 CH451输入位数据

DJNZ R7? WRITE 8 ;位数据未完,继续 MOV A?B

MOV R7?#04H ;将B中4位送出 WRITE 4?RRC A ;低位在前?高位在后 CLR DCLK MOV DIN?C SETB DCLK

DJNZ R7? WRITE 4

SETB LOAD ;产生加载上升沿通知 CH451处理命令数据 SETB EX0 ;允许键盘中断 RET

?******* 输入键值子程式 ****** ? 出参? ACC键值数据

READ? CLR EX0 ;禁止键盘中断

CLR LOAD ;命令开始

MOV A?#07H ;读取键值命令的高4 位0111B

MOV R7?#04H ;忽略12位命令的低 8位

READ 4? RRC A ;低位在前,高位在后 CLR DCLK MOV DIN?C SETB DCLK

DJNZ R7? READ 4

SETB LOAD ;产生加载上升沿通知 CH451处理命令数据

CLR A ;先清除键值单元以便移位 MOV R7?#07H ;读入7位键值

READ_7? MOV C?DOUT ;读入一位数据 CLR DCLK ;产生时钟下降沿通知 CH451输出下一位

RLC A ;数据移入ACC,高位 在前,低位在后 SETB DCLK

DJNZ R7? READ_7 ;位数据未完继续 CLR IE0 ;清中断标志,读操作 过程中有低电平脉冲

SETB EX0 ;允许键盘中断 RET

4 结束语

用CH451扩展键盘显示接口,具有接口简单、占用CPU资源少、外围器件简单、性能价格比高等好处,可在各种单片机系统中得到广泛的应用。

首先你要确定你的LCD是什么型号,是否有字库 等等, 而后对应找这个型号的datasheet 查看怎么驱动他。一般都会有例子,多逛逛单片机论坛吧 有用的。别老来百度问些不知道怎么回答的问题

下面我给一个单片机驱动1602液晶的部分代码,希望有用。

/******************************************************************************* 1602LCD

*******************************************************************************/ #include #include

#define unit unsigned int #define char unsigned char

sbit rs = P2^1; sbit rw = P2^2; sbit ep = P2^0; char code

ask[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xb0};

/* 0 1 2 3 4 5 6 7 8 9 - */

char code dis1[] = {\ char code dis2[] = {\

//***********************************************// //***********************************************// /////////////////////////////////////////////////// /////////////////////////////////////////////////// delay(char ms)

{ // 延时子程序 char i; while(ms--) {

for(i = 0; i<250; i++) {

_nop_(); _nop_(); _nop_(); _nop_(); } } }

lcd_wcmd(char cmd)

{ // 写入指令数据到LCD delay(1); rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd;

_nop_();

_nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }

lcd_pos(char pos)

{ //pos=0x40; //设定显示位置 lcd_wcmd(pos|0x80); //lcd_wcmd(pos); }

lcd_wdat(char dat)

{ //写入字符显示数据到LCD delay(1); rs = 1; rw = 0; ep = 0; _nop_(); _nop_(); P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }

lcd_init()

{

delay(1); //LCD初始化设定

lcd_wcmd(0x38); //显示模式设置:单行,8字符,5x7点阵 delay(1); delay(1);

lcd_wcmd(0x0c); //开显示,关光标,不闪烁 delay(1); delay(1);

lcd_wcmd(0x06); //设置输入模式:光标增量移动,显示不移位 delay(1); delay(1);

//lcd_wcmd(0x01); //清除LCD显示的内容 //delay(1); }

void main() {

char i; char k;

lcd_init(); // 初始化LCD delay(10);

lcd_pos(0x04); // 设置显示位置为第一行的第5个字符 i = 0;

while(dis1[i]!='\\0')

{ // 显示字符\ lcd_wdat(dis1[i]);

//lcd_wdat(ask[xianshi[i]]); delay(30); i++; }

//lcd_wdat(xianshi[1]); //delay(30);

delay(20); lcd_init(); delay(10);

lcd_pos(0x40); // 设置显示位置为第二行第二个字符 delay(10); i = 0;

while(dis2[i]!='\\0') {

lcd_wdat(dis2[i]); // 显示字符\ \ //lcd_wdat(ask[xianshi[i]]); delay(30); i++; }

本文来源:https://www.bwwdw.com/article/lf5w.html

Top