单片机汇编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); //在液晶上显示被按下的键值}}//液晶的程序我也上传有,你们可以去找一下。

CH452中文手册

CH452中文手册
2.4. 其它杂项
● 内置时钟振荡电路,不需要外部提供时钟或者外接振荡元器件,更抗干扰。 ● 支持低功耗睡眠,节约电能,可以被按键唤醒或者被命令操作唤醒。 ● 可选两种封装:SOP28、DIP24S,引脚与 CH451 芯片兼容。 ● 经过授权采用了 1 项专利技术,低成本,简便易用。
3、封装
4 线串行接口
输出
输入
输出 输出 输入
引脚说明
正电源,持续电流不小于 120mA 公共接地,持续电流不小于 120mA 数码管的段驱动,高电平有效, 键盘扫描输入,高电平有效,内置下拉 数码管的字驱动,低电平有效,
键盘扫描输出,高电平有效 串行接口方式选择,内置上拉电阻, 高电平选 4 线接口,低电平选 2 线接口
CH452 中文手册(一)

数码管驱动及键盘控制芯片 CH452
中文手册 版本: 1
1、概述
CH452 是数码管显示驱动和键盘扫描控制芯片。CH452 内置时钟振荡电路,可以动态驱动 8 位数 码管或者 64 位 LED,具有 BCD 译码、闪烁、移位、段位寻址、光柱译码等功能;同时还可以进行 64 键的键盘扫描;CH452 通过可以级联的 4 线串行接口或者 2 线串行接口与单片机等交换数据;并且可 以对单片机提供上电复位信号。
2.3. 外部接口
● 同一芯片,可选高速的 4 线串行接口或者经济的 2 线串行接口。 ● 4 线串行接口:支持多个芯片级联,时钟速度从 0 到 2MHz,兼容 CH451 芯片。 ● 4 线串行接口:DIN 和 DCLK 信号线可以与其它接口电路共用,节约引脚。 ● 2 线串行接口:支持两个 CH452 芯片并联(由 ADDR 引脚电平设定各自地址)。 ● 2 线串行接口:时钟速度从 500Hz 到 200KHz,兼容两线 I2C 总线,节约引脚。 ● 内置上电复位,可以为单片机提供高电平有效和低电平有效复位输出。

单片机汇编CH452和串口通讯程序

单片机汇编CH452和串口通讯程序

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 7FH ;从CH452中读出的键盘数SUM DATA 7EH ;定义要用的变量A1 DATA 7CHA2 DATA 7BHA3 DATA 7AHA4 DATA 79Hb1 DATA 78Hb2 DATA 77Hb3 DATA 76HMODE DATA 75HGD DATA 74HADH DATA 73HADL DATA 72HIN DATA 71HOUTDATA DATA 70HINADDR DATA 6FHDIS DATA 6EHAUXR DATA 8EH;**************************************************************************; R452 367 1ORG 0000HSTART:MOV A1,#00H ;数值初始化MOV A2,#00HMOV A3,#00HMOV A4,#00HMOV b1,#00HMOV b2,#00HMOV MODE,#03HMOV GD,#03HMOV IN,#00HMOV OUTDATA,#00HMOV INADDR,#00HMOV DIS ,#00HACALL CH451_INIT ;调用初始化程序KEYSHOW:ACALL SCAN1SJMP 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 A,MODEMOV B,#2DIV ABMOV A,BCJNE A,#00H,iuoSJMP mode0;**************************************************************************** ;模式0 下写数据到外部RAM;**************************************************************************** mode0:MOV A,GDMOV B,#04HDIV ABMOV A,BCJNE A,#00H,LOOP1SJMP LOOP0;**************************************************************************** ;DPH 加一H=;**************************************************************************** LOOP0:MOV R5,#22MOV R4,#02HACALL CHANGEMOV R5,#16 ;H=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#01HLCALL CH451_WRITE;****************************************************************************MOV A,ADHADD A,#1 ;DPH加一MOV ADH,ALCALL DISPLAY ;RET/*MOV A,#0abHLCALL DISPLAYRET */LOOP1:;**************************************************************************** ;DPL 加一L=;**************************************************************************** CJNE A,#01H,LOOP2MOV R5,#23MOV R4,#02HACALL CHANGEMOV R5,#16 ;L=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#01HLCALL CH451_WRITE;****************************************************************************MOV A,ADLADD A,#1 ;DPL加一MOV ADL,ALCALL DISPLAY ;RETLOOP2:;**************************************************************************** ;输入的数据加一 D.=;**************************************************************************** CJNE A,#02H,LOOP3MOV R5,#19MOV R4,#02HACALL CHANGEMOV R5,#16 ;L=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#01HLCALL CH451_WRITE;****************************************************************************MOV A,INADD A,#1 ;INDATA加一MOV IN,ALCALL DISPLAYRETiuo:SJMP mode1LOOP3:;**************************************************************************** ;把数据送到指定的外部RAM中,DPTR IN 清零判断是否输入正确;**************************************************************************** MOV B,#06H ;设置为显示闪烁关MOV A,#00HLCALL CH451_WRITEMOV DPH,ADHMOV A,INMOVX @DPTR,AMOVX A,@DPTRCJNE A,73H,OOP1SJMP OOP2;**************************************************************************** ;错误;**************************************************************************** OOP1:MOV R5,#15MOV R4,#02HACALL CHANGEMOV R5,#10MOV R4,#00HACALL CHANGEMOV R5,#23MOV R4,#01HACALL CHANGEMOV R5,#5 ;falseMOV R4,#03HACALL CHANGERET;**************************************************************************** ;正确;**************************************************************************** OOP2:MOV R5,#24MOV R4,#02HACALL CHANGEMOV R5,#25MOV R4,#00HACALL CHANGEMOV R5,#10MOV R4,#01HACALL CHANGEMOV R5,#14 ;tureMOV R4,#03HACALL CHANGELCALL URTMOV DPTR,#0MOV ADH,#0MOV ADL,#0RET;**************************************************************************** ;模式1 ,读外部RAM;**************************************************************************** mode1:MOV A,GDMOV B,#03HDIV ABMOV A,BCJNE A,#00H,FUN1SJMP FUN0;**************************************************************************** ;DPH加一H=;**************************************************************************** FUN0:MOV R5,#22MOV R4,#02HACALL CHANGEMOV R5,#16 ;H=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#01HLCALL CH451_WRITE;**************************************************************************** MOV A,ADHADD A,#1MOV ADH,ALCALL DISPLAY ;RET/*MOV A,#0abHLCALL DISPLAYRET */;**************************************************************************** ;DPL加一L=;**************************************************************************** FUN1:CJNE A,#01H,FUN2MOV R5,#23MOV R4,#02HACALL CHANGEMOV R5,#16 ;L=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#01HLCALL CH451_WRITE;****************************************************************************MOV A,ADLADD A,#1MOV ADL,ALCALL DISPLAY ;RET;**************************************************************************** ;对应地址外部RAM里的数据显示出来 D.=;**************************************************************************** FUN2:MOV B,#06H ;设置为显示闪烁关MOV A,#00HLCALL CH451_WRITEMOV R5,#19MOV R4,#02HACALL CHANGEMOV R5,#16 ;D.=MOV R4,#00HACALL CHANGE;**************************************************************************** MOV DPH,ADHMOV DPL,ADLMOVX A,@DPTRLCALL DISPLAYMOV ADH ,#0MOV ADL,#0MOV A,#0MOV DPTR,#0RET;**************************************************************************** ;对相应的数据加16;**************************************************************************** k2:MOV A,MODEMOV B,#2DIV ABMOV A,BCJNE A,#00H,TOP1SJMP TOP0;**************************************************************************** ;模式0 下写数据;**************************************************************************** TOP0:MOV A,GDMOV B,#04HDIV ABMOV A,BCJNE A,#00H,CANCER1SJMP CANCER0;**************************************************************************** ;DPH加16;**************************************************************************** CANCER0:MOV R5,#22MOV R4,#02HACALL CHANGEMOV R5,#16 ;H=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#02HLCALL CH451_WRITE;**************************************************************************** MOV A,ADHADD A,#16MOV ADH,ALCALL DISPLAY ;RET;**************************************************************************** ;DPL加16;**************************************************************************** CANCER1:CJNE A,#01H,CANCER2MOV R5,#23MOV R4,#02HACALL CHANGEMOV R5,#16 ;L=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#02HLCALL CH451_WRITE;****************************************************************************MOV A,ADLADD A,#10HMOV ADL,ALCALL DISPLAY ;RET;**************************************************************************** ;显示数据D.=;**************************************************************************** CANCER2:CJNE A,#02H,LLLMOV R5,#19MOV R4,#02HACALL CHANGEMOV R5,#16 ;D.=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#02HLCALL CH451_WRITE;****************************************************************************MOV A,INADD A,#10HMOV IN,ALCALL DISPLAYRETLLL: RET;**************************************************************************** ;模式1 读外部RAM;**************************************************************************** TOP1:MOV A,GDMOV B,#03HDIV ABMOV A,BCJNE A,#00H,SAS1SJMP SAS0;**************************************************************************** ;DPH+16;**************************************************************************** SAS0:MOV R5,#22MOV R4,#02HACALL CHANGEMOV R5,#16 ;H=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#02HLCALL CH451_WRITE;**************************************************************************** MOV A,ADHADD A,#16MOV ADH,ALCALL DISPLAY ;RET;**************************************************************************** ;DPL +16;**************************************************************************** SAS1:CJNE A,#01H,LLLMOV R5,#23MOV R4,#02HACALL CHANGEMOV R5,#16 ;L=MOV R4,#00HACALL CHANGEMOV B,#06H ;设置为显示闪烁开MOV A,#02HLCALL CH451_WRITE;****************************************************************************MOV A,ADLADD A,#16MOV ADL,ALCALL DISPLAY ;RETk3:;**************************************************************************** ;选择模式0 (地址高,低,数据,确认是否正确),模式1 (地址高,低,显示数据);**************************************************************************** MOV R5,#21MOV R4,#02HACALL CHANGEMOV R5,#14 ;PE=ACALL CHANGEMOV R5,#16MOV R4,#01HACALL CHANGEMOV B,#06H ;设置为显示闪烁关MOV A,#01HLCALL CH451_WRITE;****************************************************************************MOV A,GDINC AMOV GD,AMOV A,MODEMOV B,#2DIV ABMOV A,BCJNE A,#00H,mode11SJMP mode00;**************************************************************************** ;模式0;**************************************************************************** mode00:MOV A,GDMOV B,#04H ;模式0DIV AB ;4步MOV A,BMOV R5,A ;显示第几步MOV R4,#03HACALL CHANGEAJMP ASmode11:MOV A,GD ;模式1MOV B,#03HDIV AB ;3步MOV A,BMOV R5,A ;显示第几步MOV R4,#03HACALL CHANGEAJMP ASk4:;**************************************************************************** ;选择模式0(写),模式1(读);****************************************************************************MOV R4,#02HACALL CHANGEMOV R5,#20 ;M=MOV R4,#00HACALL CHANGEMOV R5,#16MOV R4,#01HACALL CHANGEMOV B,#06H ;设置为显示闪烁关MOV A,#01HLCALL CH451_WRITE;**************************************************************************** MOV ADH,#0MOV ADL,#0MOV DPTR,#0MOV GD,#11MOV A,MODEINC AMOV MODE,AMOV B,#2DIV ABMOV A,BMOV R5,A ;显示模式0,1MOV R4,#03HACALL CHANGEAJMP ASAS:RET;**************************************************************************** ;串口程序;**************************************************************************** URT:MOV TMOD ,#20HMOV TH1,#0FAHMOV TL1,#0FAHSETB TR1MOV SCON,#40HMOV R1,#73HMOV R6,#3pen:MOV SBUF,@R1JNB TI,$CLR TIDEC R1DJNZ R6,penMOV SCON,#50HMOV R0,#73HMOV R7,#2RET;**************************************************************************** ;显示程序;**************************************************************************** DISPLAY:MOV B,#10HDIV ABMOV A4,ACCMOV A1,BMOV R5,A4 ;MOV R4,#01HACALL CHANGEMOV R5,A1MOV 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 078H ;12CDB 07EH ;13DDB 0f8H ;14EDB 0e8H ;15FDB 090H ;16=DB 080H;17-DB 0DBH;18S.DB 07FH;19D.DB 06eH ;20mDB 0ecH;21 pDB 0e6H ;22 hDB 070H ;23 lDB 068H ;24 TDB 076H ;25 UDB 0e6H ;22 hDB 0e6H ;22 hTAB_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。

嵌入式-CH452-按键-真正2线-模拟IIC

嵌入式-CH452-按键-真正2线-模拟IIC

CH452_SDA_SET; /*发送起始条件的数据信号*/ CH452_SDA_D_OUT; /* 设置 SDA 为输出方向 */ CH452_SCL_SET; //CH452_SCL_D_OUT; DELAY_1US; CH452_SDA_CLR; /*发送起始信号*/ DELAY_1US; CH452_SCL_CLR; /*钳住 I2C 总线,准备发送或接收数据 */ DELAY_1US; }
// 空操作 // 复位 // 开启键盘,关闭显示,INTM 为 1 // 开启键盘,关闭显示,INTM 为 0 // 加载光柱值,需另加 7 位数据 // 段位清 0,需另加 6 位数据
#define CH452_SET_BIT 0x01C0
#define CH452_SLEEP
0x0202
#define CH452_LEFTMOV 0x0300
#define
DELAY_10US
{int x=700;while(--x>0);}//System_Clock72000000
1us->14
/* 2 线接口的连接,与实际电路有关 */
//sbit CH452_SCL=PB6; // 时钟接到 STM32 的 PB6 接口
//sbit CH452_SDA=PB7; // 如果使用真正的 2 线接口,那么 SDA 接中断引脚 P3^3/INT1,用 SDA 直接做中断输出
#include "PIN.H"
// 修改该文件以适应硬件环境/单片机型号等
#include "ch452cmd.h" // CH452 常量定义
#include "stm32f10x.h"

ch452按键 程序

ch452按键 程序

CH452_Write(CH452_DIG7 | 5);
CH452_Write(CH452_DIG6 | 5);
CH452_Write(CH452_DIG5 | 5);
CH452_Write(CH452_DIG4 | 5); // 4位数码管显示字符1234
P7 &=0x0f;
P7 |=0xf0;
}
if(keycode==0x60){
CH452_Write(CH452_DIG3 | 5);
CH452_Write(CH452_DIG2 | 5);
CH452_Write(CH452_DIG1 | 5);
CH452_Write(CH452_DIG0 | 5); // 4位数码管显示字符1234
}
load=1; //加载数据,LOAD上升沿
for(j=0;j<100;j++){ }
}
void CH452_Read(void)
{
cmd1=0x07; //读按键的命令字
load=0;
for(i=0;i!=4;i++) // 只需要发出高4位,多发也可以,但应该确保最后留下的4位是该命令码
CH452_Write(CH452_DIG2 | 1);
CH452_Write(CH452_DIG1 | 1);
CH452_Write(CH452_DIG0 | 1); // 4位数码管显示字符1234
CH452_Write(CH452_DIG7 | 1);
CH452_Write(CH452_DIG6 | 1);
#include <c8051F020.h>

数码管及按键控制 CH452

数码管及按键控制 CH452

数码管及按键控制芯片CH452 :
直插,24引脚,2线接口方式图1:CH452 引脚图
2 线接口方式引脚说明:
CH452芯片与单片机连线:
说明:
1.针对数码管
CH452对数码管采用动态扫描驱动。

字驱动,顺序为DIG0 至DIG7,8个数码管,当其中一个引脚吸入电流时,其它引脚则不吸入电流。

段驱动引脚SEG6~SEG0 分别对应数码管的段G~段A,段驱动引脚SEG7 对应数码管的小数点,字驱动引脚DIG7~DIG0分别连接8 个数码管的阴极;
8个8 位的数据寄存器,用于保存8 个字数据;
译码方式:BCD译码,。

BCD 译码方式是指对数据寄存器中字数据的位4~位0进行BCD译码,控制段驱动引脚SEG6~SEG0的输出;
问题:ADDR在pcb板上是悬空的。

对“位”选择的时候,二极管的接法,作用,控制一个3位一个1位
2 针对按键:
(1)扫描,芯片实行两次扫面,两次结果相同才确认
(2)DIG0-DIG7 列扫描; SEG7-SEG0 行扫描,此次用到SEG0 SEG1两行,9个按键
(3)按引脚,依次由DIG0-DIG7 输出高电平,输出时其他为低电平,SEG0-SEG7内置下拉电阻,没按键按下时,被下拉为低电平
芯片CH452引脚工作:
scl 、addr内置上拉电阻,默认高电平;
sda 双向数据,默认高电平;
int 默认高,当有按键按下时,产生低电平中断,单片机产生中断,读取按键代码;
scl 高电平,从PIC 输入数据,数码管显示
低电平,向PIC 输出数据,读按键值
(具体工作参考时序图)。

AVR学习笔记十五、数码管驱动和键盘控制芯片CH452实验

AVR学习笔记十五、数码管驱动和键盘控制芯片CH452实验

A VR学习笔记十五、数码管驱动和键盘控制芯片CH452A实验-------基于LT_Mini_M1615.1数码管驱动和键盘控制芯片CH452A实验15.1.1 实例功能前面我们已经学习了4位数码管显示的例子,但是仅仅4位数码管显示电路就占用了12个I/O口,如果数码管超过4位的话,占用的I/O口数目就会更多,我们知道单片机的I/O口资源是很有限的,那么能不能使用更少的I/O口来控制更多的数码管显示呢?方法是有的,且有很多,比如我们可以使用串口转并口芯片74HC595,74HC164,74HC165等,关于这些芯片的使用,我们会在以后的学习中逐步学习的,今天我们来认识一种更加方便的数码管驱动芯片CH452,这个芯片能够在只占用4个甚至两个I/O口的情况下驱动8位数码管显示,同时这种芯片还能在驱动8位数码管现实的同时实现8X8共计64个按键的识别。

也就是说这个芯片只用单片机的最多4个I/O口就能够同时驱动8位数码管显示和识别64个按键。

本实例共有3个功能模块,分别描述如下:●单片机系统:使用ATmega16单片机的4个I/O口控制CH452芯片,实现8位数码管的显示。

●外围电路:CH452驱动数码管显示电路。

●软件程序:熟悉掌握ATmega16单片机的I/O口输出应用。

通过本实例的学习,掌握相关电路设计,并掌握以下知识点:●了解芯片CH452的功能●掌握单片机I/O口实现时序转换的编程方法。

15.1.2、器件和原理本实例介绍数码管驱动和键盘控制芯片CH452的简单应用。

关于本芯片实现8X8=64个按键的原理和方法,我们在以后的学习中在进行讨论,本实例中只介绍该芯片驱动8位共阴极数码管的功能。

1、器件介绍CH452是数码管驱动和键盘控制芯片,可以动态驱动8位数码管或者64个LED发光二极管,还可以驱动64级光柱。

该芯片与单片机的接口有4线和2线两种接口方式,其中4线接口支持芯片的无限级联,而2线方式兼容I2C总线。

ch452程序代码 (2)

ch452程序代码 (2)

Ch452程序代码/************************************* ************************************* ***********//* FileName: ch452.h *//* Function: *//*---------------History--------------------------------------------------------------*//* Author | Date | Status | Description *//* wang | 2011/8/04 | create | *//* | | | *//************************************* ************************************* ***********/#ifndef _CH452_H#define _CH452_H//#ifndef _CH452A_H_//#define _CH452A_H_/* D efine command */#define CMD_SYSPARA 0x68/////definiton for system parameter command default:0#define DISP 0x01 //0:disable 1:enable#define KEYB 0x02 //0:disable 1:enable #define WDOG 0x04 //0:close 1:open#define DPLR 0x08 //0:low level 1:high level#define SSPD 0x10 //0:low speed 1:high speed#define INTM 0x20 //0:low level 1:low level pulse#define GPOE 0x40 //0:all DIG as driver 1:DIG6 DIG7 as GPIO#define CMD_DISPARA 0x6A/////definiton for display parameter command default:0#define MODE 0x80 //0:No decode 1:BCD decode//#define LIMIT 0x70 //bit6~bit4 range from 000 to 111#define INTENSITY 0x0F//bit3~bit0 range from 0000 to 1111#define CMD_DISPDAT 0x70//加载字数据前八位#define CMD_GETKEY 0x6E//键盘前八位#define CMD_ACKEN 0x6E//2线接口应答前八位/* F unction prototype */void ch452a_two_ack(void);void ch452a_Init (void);void ch452a_sendcmd(unsigned charcmd,unsigned char paradata);//写命令unsigned char ch452a_getkey(void);//读取按键unsigned char CH452_ReadKeyboard();#define KEY_UP 0x59#define KEY_DOWN 0x58#define KEY_LEFT 0x5B#define KEY_RIGHT 0x5A#define KEY_SET 0x48#define KEY_OK 0x40#endif主程序代码:/************************************* ************************************* ************ FileName: ch452.c ** Function: **---------------History--------------------------------------------------------------** Author | Date | Status | Description ** wang | 2011/7/28 | create | ** | | | ************************************** ************************************* ***********/#include "STC_NEW_8051.h"#include "IIC.h"#include "Ch452.h"sbit SCL=P1^0;sbit SDA=P1^1;//////////////////////////////////////////////// ////////////////////////////////////////// FileName:ch452a_two_ack() //// Function:Init_ack ////////////////////////////////////////////////// /////////////////////////////////////void ch452a_two_ack(){unsigned char i,wr_data;wr_data=CMD_ACKEN&0xfe;IIC_start();/* start condition */for(i=0;i<8;i++){if(wr_data&0x80)//判断高位数据SDA=1;elseSDA=0;wr_data<<=1;//让高位数据往左移delays(1);SCL=1;//数据的写要在时钟为高电平时delays(4);SCL=0;delays(5);}/* nine clock */SCL=0;delays(1);SDA=1;delays(4);SCL=1;delays(5);/* send data */for(i=0;i<8;i++){SCL = 0;delays(1);SDA = 0;delays(4);SCL = 1;delays(5);}IIC_stop();}//////////////////////////////////////////////// ////////////////////////////////////////// FileName:ch452a_Init() //// Function:Init ////////////////////////////////////////////////// /////////////////////////////////////void ch452a_Init(void){unsigned char cmddata,cmdadr;ch452a_two_ack();cmddata=CMD_SYSPARA;//系统参数地址cmdadr=DISP| KEYB & (~INTM) & (~DPLR);//系统参数数据IIC_writedata(cmddata,&cmdadr,1);cmddata=CMD_DISPARA;//显示参数地址cmdadr=MODE;IIC_writedata(cmddata,&cmdadr,1);}//////////////////////////////////////////////// ///////////////////// FunctionName: ch452a_sendcmd()// Description: send command to ch452a//////////////////////////////////////////////// ///////////////////void ch452a_sendcmd (unsigned char cmd,unsigned char paradata){unsigned char cmddata,cmdadr;cmddata = cmd;cmdadr = paradata;IIC_writedata(cmddata,&cmdadr,1);}//////////////////////////////////////////////// ///////////////////// FunctionName: ch452a_getkey()// Description: get key value from ch452a //////////////////////////////////////////////// ///////////////////unsigned char ch452a_getkey(){unsigned char cmddata,keycode;// unsigned char* pData=&revdata;cmddata = CMD_GETKEY | 0x01;keycode=IIC_readdata(cmddata); return keycode;}/*unsigned char CH452_ReadKeyboard() {unsigned char recvdata,cmddata;unsigned char ack;// uchar* pRecvData = &recvdata; cmddata = CMD_GETKEY | 0x01;IIC_start(); //启动IIC_send(cmddata); //发送从机地址ack=IIC_re_ack(ack);if(ack==0){recvdata = IIC_accept(cmddata);IIC_wr_ack(0); //主机发送应答给从机IIC_stop();}else{IIC_stop(); //ack条件不满足终止发送数据}return recvdata;}*//*void ch452_flash(unsigned char cmd,unsigned char paradata){unsigned char cmddata,cmdadr;cmddata =0x;cmdadr = paradata;IIC_writedata(cmddata,&cmdadr,1);}*/。

按键模块编程思路

按键模块编程思路

按键模块编程思路良好的人机交互键盘是仪器仪表必不可少的模块,本设计使用4*4共16个按键,操作者可使用规定的按键对仪器的基本参数进行设置,以便仪器合理使用,方便操作者。

对于按键,一般使用单片机的一个IO口,来控制一个按键,这样对于单片机来说编程简单,易于实现.但是本设计采用的主控芯片为TMS320F2812PGFA,其共有54个可用的IO口,由于本设计为了完成基本的控制、显示已经使用掉了很多IO口,所以为了很好的管理要使用到的16个按键,我们使用了按键管理芯片CH452L。

按键管理芯片CH452L是数码管显示驱动控制和按键管理芯片;可以进行64个按键的键盘扫描;可以同过硬件设置为四线接口和二线接口与单片机进行通信。

具体的产品资料和使用方法,芯片应用手册中都有详细的讲解.CH452L的四线与单片机接口,编程简单,易于实现,最重要的是实时性好,方便频繁的按键操作。

原理图如下:首先通过单片机向按键管理芯片写命令,启动按键扫描功能。

按键管理芯片就不间断的对按键进行扫描,一旦检测到有按键按下,按键管理芯片就会向单片机发出信号,一般在单片机中设置为此信号为中断信号。

单片机检测到按键信号后,就从按键管理芯片中读取按键信息,从而检测出那个按键按下;这里需要说明下,CH452L数据输出电平为5V的TTL电平,为了与DSP的3.3VCMOS 电平匹配,在CH452L和F2812之间使用SN74ALVC4245A电平转换芯片,可以实现电平匹配.这个电平转换芯片与液晶模块使用到的电平转换芯片原理和使用方法一样,只是管教略有差异,这里不再详述.下面详细叙述编程思路:在连接好硬件电路之后,.设一个变量’KeyWord',记录按键信息,表示到底哪个按键按下。

在上面提到是用DSP的外部中断来提醒主控芯片有按键按下,所以一定要先设置好DSP的中断相关的寄存器.主程序流程图如下:“按键扫描”过程就是CPU在等待按键中断的过程。

  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。

相关文档
最新文档