单片机汇编CH452键盘显示程序

合集下载

数码管驱动及键盘控制芯片CH452

数码管驱动及键盘控制芯片CH452

CH452 中文手册(一)

2.2. 键盘控制
● 内置 64 键键盘控制器,基于 8×8 矩阵键盘扫描。 ● 内置按键状态输入的下拉电阻,内置去抖动电路。 ● 键盘中断,可以选择低电平有效输出或者低电平脉冲输出。 ● 提供按键释放标志位,可供查询按键按下与释放。 ● 支持按键唤醒,处于低功耗节电状态中的 CH452 可以被部分按键唤醒。
4 线串行接口的数据输出, 键盘中断输出,低电平有效
4.3. 2 线接口引脚
28 脚封装 的引脚号
25
24 脚封装 的引脚号
4
引脚名称 ADDR
26
5
SDA
27
6
SCL
24
3
INT#
类型
输入 内置上拉 开漏输出
及输入 输入 内置上拉 开漏输出
引脚说明 2 线串行接口的地址选择,内置上拉电阻
2 线串行接口的数据输入和输出
00111B
0000111B
01000B
1111111B
01001B
1101111B
01010B
1110111B
01011B
1111100B
01100B
1011000B
01101B
1011110B
01110B
1111001B
01111B
1110001B

显示的字符 0 1 2 3 4 5 6 7 8 9 A b c d E F
2.3. 外部接口
● 同一芯片,可选高速的 4 线串行接口或者经济的 2 线串行接口。 ● 4 线串行接口:支持多个芯片级联,时钟速度从 0 到 2MHz,兼容 CH451 芯片。 ● 4 线串行接口:DIN 和 DCLK 信号线可以与其它接口电路共用,节约引脚。 ● 2 线串行接口:支持两个 CH452 芯片并联(由 ADDR 引脚电平设定各自地址)。 ● 2 线串行接口:时钟速度从 500Hz 到 200KHz,兼容两线 I2C 总线,节约引脚。 ● 内置上电复位,可以为单片机提供高电平有效和低电平有效复位输出。

单片机键盘显示程序

单片机键盘显示程序
MUL AB
ADD A,R2
;MOV 50H,A
ACALL KEY1
ACALL DISPLAY
PKYR:POP B
POP ACC
POP DPH
POP DPL
POP PSW
RETI
;;;键值处理程序
SETB EX1
SETB IT1
SETB EA
AJMP $
SEG: DB 3FH,06H,5BH,4FH,66H,6DH ;字符0,1,2,3,4,5段码
DB 7DH,07H,7FH,6FH,77H,7CH ;字符6,7,8,9,A,b段码
MOV DPTR,#8000H
LOOP1: MOV A,@R0
MOVX @DPTR,A
INC R0
DJNZ R7,LOOP1
RET
DELAY1:MOV R5,#200 ;延时程序
D11: MOV R6,#100 ;
D21: MOV R7,#248 ;
WEIT: MOVX A,@DPTR ;读状态寄存器
JB ACC.7,WEIT ;判断RAM清除完毕
MOV A,#34H ;置分频系数
MOVX @DPTR,A ;送分频系数
MOV A,#10H ;置显示,键盘命令
MOVX @DPTR,A
MO数据地址不变。
MOVX @DPTR,A ;送读命令字
MOV DPTR,#8000H
MOVX A,@DPTR ;读数据
MOV R1,A
ANL A,#07H
对累加器中压缩的BCD数加一和减一
ADD A,#01H
DA A
ADD A,#99H

ch452

ch452
ShuMaGuan(i,temp[i]);
}
}
void CH452_Init(void)
{
//初始化PD接口DCLK|DIN|LOAD
GPIO_InitTypeDef GPIO_InitStructure;
// printf("\r\nCH452_Init");
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
CH452_WriteCmd(TimeBuffer);
break;
case 5:
TimeBuffer = (Tp << 8) + TIME_DUAN_WU;
CH452_WriteCmd(TimeBuffer);
break;
case 6:
TimeBuffer = (Tp << 8) + TIME_DUAN_LIU;
CH452_WriteCmd(0x0403);
//初始化键盘和数码管
// for(i =0;i<8;i++)
// {
// switch(i)
// {
// case 0:
// Timebuffer[i] = (TIME_WEI_LING << 8) + TIME_DUAN_LING;
CH452_WriteCmd(TimeBuffer);
break;
case 9:
TimeBuffer = (Tp << 8) + TIME_DUAN_JIU;
CH452_WriteCmd(TimeBuffer);

基于CH452A的数码管驱动及键盘控制的系统设计

基于CH452A的数码管驱动及键盘控制的系统设计
个按键和 8 个数码管 显示。就 算按键用行 列扫描方式 , 数码 管用 MC U的 G 1 口来扫描驱动 , P0 那也会 占用 MC U的 3 2个 GI PO口。如此多的 G 1 P0口就大大增加 了 MC U的成本 。在
( 32 H L 脚接地 ) 。由于篇幅问题 , 原理分ቤተ መጻሕፍቲ ባይዱ三部 分阐述 , 用网络
查寻 或 中断方式 。
Z G 20外围还需震荡用的晶振 和电容 , L 79 这不利于成本控制 。 所以本文将尽量用最 低成 本方式 着重介 绍南京 沁恒有 限公
司的 C 5A H42 。
1 C M5 A 突 出特点 T 2
B D译码支持 , C 不需要用 户再用 软件译 码 , 降低软 件工 作量 ; 可独立数码管闪烁 显示 , 速度可控 , 闪烁 降低软件 工作 量; 数码管字数据可左移右移 , 软件工作 量 ; 降低 可任意 段位
d ie,t e k y o d c ruta y tm e in. rv h e b a ic i nd s se d sg r
K y w rs d t b —r e ; e badcnrl C 4 2 S C 1 0E e o d :i a t d vn k y or o t ; H 5 A; T 1 F x i g lu i e o
0 引言
随着市场经济的发展 , 市场对硬件成 本的要求 已变得越
2 硬 件设计
C 42 H 5A支持 I ( 线 制 ) S14线 制 ) 种 接 口方 2 2 C 和 P( 两
式 , 虑 节约 MC 考 U资 源 , 我们 选用 2线 制 的 1C接 口方 式 2
来越苛刻 , 比如键盘和数码管驱 动, 如果设计 一系统 , 包括 6 4

CH452 数码管 按键检测 PIC单片机1

CH452 数码管 按键检测  PIC单片机1

}
CH452_LOAD = 1;
for(i=0;i!=7;i++)
{
Key <<= 1;
if(CH452_DOUT)Key |= 0x01;
CH452_DCLK = 0;
nop();
CH452_DCLK = 1;
}
IOCIE = 1;
return Key;
}
如果你对 PIC 单片机和 CH452 不够了解,那么我们也可以按照你的要求作出完全 满足你要求的
二、CH452 底层软件代码,在这里一 PIC 单片机为列
CH452 是以 IIC 总线通讯,在这里我们以 4 线制为列,列出 CH452 读和写函数以 及按键读取函数
void CH452_Write(unsigned short cmd)
//写
{
uchar i;
CH452_LOAD = 0;
for(i=0;i!=12;i++)
本文章就介绍了利用 CH452 实现的一款工业操作控制系统的系统控制面板 设计,经过检测和长时间使用,在 1 年内没出现过任何问题。受到了用户好评
关于 CH452 的芯片介绍这里就不多介绍,网上很多,而且还是中文的。很方 便,这里重点介绍下此板所具有的功能,以及 CH452 的底层驱动程序。希望能做 到抛砖引玉的效果,让在做同样工作的朋友门少走弯路
{
uchar i,Key=0;
IOCIE = 0;
CH452_LOAD = 0;
for(i=0;i!=4;i++)
{
if(cmd & 0x01) CH452_DIN = 1;
else
CH452_DIN = 0;

CH452驱动4联数码管源程序

CH452驱动4联数码管源程序

CH452驱动4联数码管源程序2008-03-14 18:10/********************************************************************** **CH452的4线接法驱动4联共阴极LED数码管KeilC程序Author: 王虎 2008.3.11单片机:89S52晶振:11.0592MCH45X的4线接口,本电路中未接键盘扫描,接4位数码管,DOUT悬空,不含按键中断为3个I/O引脚。

********************************************************************* *******/#include <regx51.h>#include <ch452cmd.h> // CH452常量定义#include <intrins.h>/***********CH452与单片机接线方式************/sbit CH452_DCLK=P1^7; // 串行数据时钟上升延激活sbit CH452_DIN=P1^6; // 串行数据输出,接CH452的数据输入sbit CH452_LOAD=P1^5; // 串行命令加载,上升延激活//sbit CH452_DOUT=P3^3; / / INT1,键盘中断和键值数据输入,接CH452的数据输出/******** 4线接口的位操作,与单片机有关 *********/#define CH452_DCLK_SET {CH452_DCLK=1;}#define CH452_DCLK_CLR {CH452_DCLK=0;}#define CH452_DIN_SET {CH452_DIN=1;}#define CH452_DIN_CLR {CH452_DIN=0;}#define CH452_LOAD_SET {CH452_LOAD=1;}#define CH452_LOAD_CLR {CH452_LOAD=0;}/******* 延时1uS子程序,主要用于2线接口,与单片机速度有关 ********/ //#define DELAY_1US {} // MCS51<=10MHz#define DELAY_1US {_nop_();} // MCS51<=20MHz//#define DELAY_1US {_nop_();_nop_();} // MCS51<=30MHz/**************写12bit控制字函数*******************/void CH452_Write(unsigned short cmd){unsigned char i;CH452_LOAD_CLR; //命令开始,LOAD=0for(i=0;i!=12;i++) //送入12位数据,低位在前{// if (cmd&1) {CH452_DIN_SET;}// else {CH452_DIN_CLR;} // 输出位数据CH452_DCLK_CLR;CH452_DIN=cmd&1;CH452_DCLK_SET; //上升沿有效cmd=cmd>>1;}CH452_LOAD_SET; //加载数据,LOAD上升沿DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期DELAY_1US;DELAY_1US;}/******************主函数******************************/void main(){CH452_Write(CH452_RESET);CH452_Write(CH452_BCD + 0x40); // 选择BCD译码方式,扫描极限为4个数码管CH452_Write(CH452_SYSON1); // 开启显示while (1){CH452_Write(CH452_DIG3 | 1);CH452_Write(CH452_DIG2 | 2);CH452_Write(CH452_DIG1 | 3);CH452_Write(CH452_DIG0 | 4); // 4位数码管显示字符1234// CH452_Write(CH452_RIGHTCYC);。

CH451或CH452的常见问题解答

CH451或CH452的常见问题解答

CH451或CH452的常见问题解答转载来自官网需要设计参考资料(光盘资料可以参考FILELIST.TXT文档,网上资料更新)数码管LED显示驱动及键盘扫描的产品选型有CH451和CH452两种,都可以直接驱动数码管LED显示和键盘扫描,同时进行显示驱动和键盘扫描。

详细使用说明可以参考各自的使用手册,其中也有可供参考的应用电路图。

CH451比CH452的驱动电流大一倍,所以显示更亮些;CH452比CH451的功能更多些,并且支持兼容I2C的两线接口。

更详细的性能比较及特征说明请参考CH451PLN.PDF文档。

* 关于电源CH451和CH452都可以支持3.3V和5V电源电压,但是CH451用于3.3V时要外接振荡电阻才能避免显示闪烁。

考虑到直接驱动显示时消耗电流较大,布线时应该确保电源和地线有足够的宽度和良好的电源退耦。

* 刚通电数码管就全亮可能是数码管的极性错误,CH45X能够直接驱动共阴数码管,外加反相驱动器后才能驱动共阳数码管。

CH45X向LED供正向电压为亮,供反向电压为灭,复位后CH45X默认使LED灭,所以当极性反时就全亮。

* 显示或者操作无反应检查硬件接线是否正确,可以先试用公司提供的例子程序,确保硬件无误后再进一步开发。

如果连线距离较远,那么可以先在短距离下试用,无误后再加大距离,必要时可以用缓冲器加强信号的驱动能力。

对于支持4线接口和2线接口的CH452芯片,要检查H3L2引脚确保单片机接口程序与CH452是同一接口方式* 全部或者部分按键无反应1、确保发出设置命令启用了按键功能2、如果电源电压超过5V,或者是CH452S芯片直接驱动数码管,那么应该参考CH452手册在共阴数码管的公共端也就是每个DIG引脚上串接二极管,二级管应该串到LED显示电路中而非按键扫描电路中3、有其它优先极更高的键一直在按下,导致优先极较低的键始终无效,键码最小的按键优先极最高* 在实际未按键时,CH45X不断主动产生按键中断,或者总是有某个按键在按下,具有随机性1、只有当前一个按键值被读出后,CH45X的DOUT或者KEY#或者INT#引脚才会恢复默认的高电平2、检查线路板是否有漏电或者短路情况3、所接数码管或者LED发光管存在反向漏电现象。

CH452程序

CH452程序

以下是CH452用于4 X 4 键盘的C8051F020程序,这个程序也是我的同学写的,呵呵//CH452的头文件#ifndef ch452L_H#define ch452L_H#include"C8051F020Init.h"sbit chdout=P2^0;sbit chload=P2^1;sbit chdin =P2^2;sbit chdclk=P2^3;//extern void chwrite(uint16 cmd);//extern uint8 chread();extern uint8 chkeyboard();extern void keylnit();#endif//CH452的C文件#include"ch452L.h"void chwrite(uint16 cmd){uint8 i;chload=0; //上升沿加载chdout=1; //输出禁止for(i=0;i<12;i++){chdin=cmd&0x01;chdclk=0;cmd>>=1;chdclk=1;}chload=1;_delay_us(6);}uint8 chread(){uint8 i,keyw=0,cmd=0x07;chload=0;for(i=0;i<4;i++) //发0111到DIN{chdin=cmd&0x01;chdclk=0;cmd>>=1;chdclk=1;}chload=1;for(i=0;i<7;i++) //扫描过程{keyw<<=1;if(chdout)keyw++;chdclk=0;chdclk=1;}return keyw;}uint8 chkeyboard(){uint8 tempw,keyword=0;tempw=chread();switch(tempw&0x3f)//-0x40{case 0x1B:keyword=16;break;case 0x1A:keyword=15;break;case 0x19:keyword=14;break;case 0x18:keyword=13;break;case 0x13:keyword=12;break;case 0x12:keyword=11;break;case 0x11:keyword=10;break;case 0x10:keyword=9;break;case 0x0B:keyword=8;break;case 0x0A:keyword=7;break;case 0x09:keyword=6;break;case 0x08:keyword=5;break;case 0x03:keyword=4;break;case 0x02:keyword=3;break;case 0x01:keyword=2;break;case 0x00:keyword=1;break;}while(chread()&0x40); //松手判断return keyword;}void keylnit(){ P2|=0x0f;OMP2&=0xfe;chwrite(0x201); // 10,0000,0001 chwrite(0x402);}//主函数的程序#include"ch452L.h"#include"lcd12864.h" //调用液晶的头文件void main(){int k;InitDevice(); //C8051F020的初始化LCDinit(); //液晶初始化keylnit(); //CH452初始化while(1){LCDsendcm(0x80);if(chdout==0) //判断是否有键按下{k=chkeyboard();}LCDinch(k); //在液晶上显示被按下的键值}}//液晶的程序我也上传有,你们可以去找一下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CH451_DCLK BIT P1.7 ;串行数据时钟,上升沿激活CH451_DIN BIT P1.6 ;串行数据输出,接CH451 的数据输入CH451_LOAD BIT P1.5 ;串行命令加载,上升沿激活CH451_DOUT BIT P1.4 ;INT0,键盘中断和键值数据输入,接CH451 的数据输出CH451_KEY DATA 7FHSUM DATA 7EHA1 DATA 7CHA2 DATA 7BHA3 DATA 7AHA4 DATA 79Hb1 DATA 78Hb2 DATA 77Hb3 DATA 76Hb4 DATA 75H;**************************************************************************; R452 367 1ORG 0000HSTART:MOV A1,#00HMOV A2,#00HMOV A3,#00HMOV A4,#00HMOV b1,#65HMOV b2,#65HMOV b3,#65HACALL CH451_INIT ;调用初始化程序MOV R5,#02H ;将要显示的数放入R5中MOV R4,#00H ;将要在第几位上显示放在R4中,最右边是0位KEYSHOW:ACALL SCAN1//ACALL CHANGESJMP KEYSHOWSJMP $;**************************************************************************** ;BCD 数字显示程序;**************************************************************************** /*NUM:CLR AADD A,NLCJNE A,#01,hun1CJNE A,#02,hun2DA AORL A1,AORL A2,ACLR AADD A,NH;CJNE A,#01,hun1;CJNE A,#02,hun2DA AORL A3,AORL A4,Ahun1:MOV A,NHADD A,#01HMOV NH,ACLR AADD A,NLREThun2:MOV A,NHADD A,#02HMOV NH,ACLR AADD A,NLRETRET */k1:MOV R5,#01HMOV R4,#05HACALL CHANGEMOV R5,#02HMOV R4,#04HACALL CHANGEMOV R5,#03HMOV R4,#02HACALL CHANGEMOV R5,#04HMOV R4,#00HACALL CHANGEMOV R5,#05HMOV R4,#01HACALL CHANGEMOV R5,#06HMOV R4,#03HACALL CHANGERETk2:MOV R5,#02HMOV R4,#05HACALL CHANGEMOV R5,#03HMOV R4,#04HACALL CHANGEMOV R5,#04HMOV R4,#02HACALL CHANGEMOV R5,#05HMOV R4,#00HACALL CHANGEMOV R5,#06HMOV R4,#01HACALL CHANGEMOV R5,#07HMOV R4,#03HACALL CHANGERETk3:MOV R5,#03HMOV R4,#05HACALL CHANGEMOV R5,#04HMOV R4,#04HACALL CHANGEMOV R5,#05HMOV R4,#02HACALL CHANGEMOV R5,#06HMOV R4,#00HACALL CHANGEMOV R5,#07HMOV R4,#01HACALL CHANGEMOV R5,#08HMOV R4,#03HACALL CHANGERETk4:MOV R5,#04HMOV R4,#05HACALL CHANGEMOV R5,#05HMOV R4,#04HACALL CHANGEMOV R5,#06HMOV R4,#02HACALL CHANGEMOV R5,#07HMOV R4,#00HACALL CHANGEMOV R5,#08HMOV R4,#01HACALL CHANGEMOV R5,#09HMOV R4,#03HACALL CHANGERET;**************************************************************************** ;子程序调用;**************************************************************************** ; 初始化子程序CH451_INIT:CLR CH451_DIN ;先低后高,输出上升沿通知CH451 选择4 线串行接口SETB CH451_DCLK ;置为默认的高电平SETB CH451_DINSETB CH451_LOADSETB CH451_DOUT ;置为输入CLR IT0 ;置外部信号为低电平触发SETB PX0 ;置高优先级或者低优先级CLR IE0 ;清中断标志SETB EX0 ;允许键盘中断MOV B,#04H ;设置为键盘与显示开MOV A,#03HACALL CH451_WRITERET;**************************************************************************** ;数码管显示程序;**************************************************************************** ;转换程序,在R4位显示R5值CHANGE:MOV A,R5ACALL TTA ;对应M2t1板的数码管转换MOV R2,AMOV A,R4ACALL TTB ;对应m2t1板的数码管位置转换MOV B,AMOV A,R2ACALL CH451_WRITERET;M2T1板数码管对应表TTA: MOV DPTR,#TAB_AMOVC A,@A+DPTRRET;对应m2t1板的数码管位置转换TTB: MOV DPTR,#TAB_BMOVC A,@A+DPTRRETTAB_A:DB 07EH;0DB 006H ;1DB 0BCH;2DB 09EH;3DB 0C6H ;4DB 0DAH;5DB 0FAH;6DB 04EH;7DB 0FEH;8DB 0DEH;9DB 0eeH;10(a)DB 0f2H ;11BDB 090H ;12=DB 080H;13-DB 0DBH;14SDB 07FH;15bDB 78H ;16cDB 00H;17dDB 40H ;12H - 号TAB_B:DB 0AH;0 显示数码管号DB 09H;1DB 0BH;2DB 08H;3DB 0CH;4DB 0DH;5DB 0EH;6DB 0FH;7;**************************************************************************** ;键盘扫描程序;**************************************************************************** SCAN1:MOV C,CH451_DOUTJC SCAN1ACALL CH451_READMOV R1,AC0: CJNE R1,#40H,C1ACALL k1AJMP TESC1: CJNE R1,#41H,C2ACALL k2AJMP TESC2: CJNE R1,#42H,C3ACALL k3AJMP TESC3: CJNE R1,#43H,SCAN1;C4ACALL k4AJMP TES/*C4: CJNE A,#48H,C5MOV R5,#04HAJMP TESC5: CJNE A,#4BH,C6MOV R5,#05HAJMP TESC6: CJNE A,#49H,C7MOV R5,#06HAJMP TESC7: CJNE A,#4AH,SCAN1MOV R5,#07HAJMP TES */TES:RET;**************************************************************************** ;移位程序;**************************************************************************** ;DELAY_1S 延迟1秒DELAY_1S:MOV R7,#20DEL1:MOV R6,#200DEL2:MOV R3,#248DJNZ R3,$DJNZ R6,DEL2DJNZ R7,DEL1RET ;左四位左移位/*LIFT:MOV B,#03HMOV A,#00HACALL CH451_WRITEINC R5ACALL CHANGEACALL DELAY_1SCJNE R5,#09H,LIFTSJMP STARTRET*/;**************************************************************************** ;串口通信读出写入程序;**************************************************************************** CH451_WRITE:CLR EX0 ;禁止键盘中断CLR CH451_LOAD ;命令开始,此命令可以放在后面MOV R7,#08H ;将ACC 中8 位送出CH451_WRITE_8:RRC A ;低位在前,高位在后CLR CH451_DCLKMOV CH451_DIN,C ;送出一位数据SETB CH451_DCLK ;产生时钟上升沿通知CH451 输入位数据DJNZ R7,CH451_WRITE_8 ;位数据未完继续MOV A,BMOV R7,#04H ;将B 中4 位送出CH451_WRITE_4:RRC A ;低位在前,高位在后CLR CH451_DCLKMOV CH451_DIN,C ;送出一位数据SETB CH451_DCLK ;产生时钟上升沿通知CH451 输入位数据DJNZ R7,CH451_WRITE_4 ;位数据未完继续SETB CH451_LOAD ;产生加载上升沿通知CH451 处理命令数据SETB EX0 ;允许键盘中断RET; 输入键值子程序CH451_READ: CLR EX0 ;禁止键盘中断CLR CH451_LOAD ;命令开始MOV A,#07H ;读取键值命令的高4 位0111BMOV R7,#04H ;忽略12 位命令的低8 位CH451_READ_4: RRC A ;低位在前,高位在后CLR CH451_DCLKMOV CH451_DIN,C ;送出一位数据SETB CH451_DCLK ;产生时钟上升沿锁通知CH451 输入位数据DJNZ R7,CH451_READ_4 ;位数据未完继续SETB CH451_LOAD ;产生加载上升沿通知CH451 处理命令数据CLR A ;先清除键值单元以便移位MOV R7,#07H ;读入7 位键值CH451_READ_7:MOV C,CH451_DOUT ;读入一位数据CLR CH451_DCLK ;产生时钟下升沿通知CH451 输出下一位RLC A ;数据移入ACC,高位在前,低位在后SETB CH451_DCLKDJNZ R7,CH451_READ_7 ;位数据未完继续CLR IE0 ;清中断标志,读操作过程中有低电平脉冲SETB EX0 ;允许键盘中断RETEND。

相关文档
最新文档