⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch452w4.asm

📁 CH452的资料和例程,主要是用在单片机系统里的LED显示和键盘驱动,很好用而且低价格的国产芯片(希望大家多支持国产IC)
💻 ASM
字号:
; CH452
; 4-Wire Interface Program for MCS-51
;
; Website:  http://winchiphead.com
; Email:    tech@winchiphead.com
; Author:   W.ch 2003.03
;
;  CH452 的4 线接口,不含按键中断为3 个I/O 引脚,含按键中断为4 个I/O,兼容SPI 时序
;    四线制方式,参照CH451,其中对CH451的选择4线串行接口初始化子函数可以省去。
;
;****************************************************************************
;需要主程序定义的参数
;CH452_DCLK		BIT   P1.7             ;串行数据时钟,上升沿激活
;CH452_DIN		BIT   P1.6             ;串行数据输出,接CH452的数据输入
;CH452_LOAD		BIT   P1.5             ;串行命令加载,上升沿激活
;CH452_DOUT		BIT   P3.2             ;INT0,键盘中断和键值数据输入,接CH452的数据输出
;CH452_KEY		DATA  7FH              ;存放键盘中断中读取的键值
;****************************************************************************
;
;对外接口子程序
;
;  1. CH452_INIT     初始化子程序
;
;  2. CH452_WRITE    输出命令子程序
;       入口: B-ACC 待写的12位数据, 低8位在ACC中, 高4位在B的低4位中
;       使用: ACC, B, R7
;
;  3. CH452_READ     输入键值子程序
;       出口: ACC 键值数据
;       使用: ACC, R7
;
;  4. CH452_INTER    键盘中断子程序
;       使用: 堆栈4字节
;
;  如果使用CH452的键盘中断, 强烈建议在子程序CH452_WRITE和CH452_READ中
;  添加屏蔽键盘中断的代码, 以防止在子程序运行过程中被键盘中断
;
;****************************************************************************
;主程序的例子
;				ORG   0000H            ;复位后单片机入口
;				LJMP  START
;				ORG   0003H            ;键盘中断
;				LJMP  CH452_INTER
;
;START:			...
;				CALL  CH452_INIT       ;初始化
;				...
;				SETB  EA               ;允许中断
;				...
;				MOV   B,#04H           ;设置系统参数命令
;				MOV   A,#03H           ;禁止看门狗,使能键盘功能,使能显示驱动
;				CALL  CH452_WRITE      ;发出命令
;				...
;				MOV   B,#09H           ;加载字数据到DIG1对应的数据寄存器
;				MOV   A,#5BH           ;字数据,如果是数码管,则第二个数码管显示"2"
;				CALL  CH452_WRITE      ;发出命令
;				...
;WAIT_KEY:		MOV   A,#0FFH          ;无效按键代码
;				XCH   A,CH452_KEY      ;取键盘中断获取的键值,同时置为无效值
;				MOV   R6,A             ;键值
;				XRL   A,#0FFH          ;有键按下?
;				JZ    WAIT_KEY         ;还没有检测到有效按键,继续等待
;				CJNE  R6,??,...        ;判别按键
;				...
;
;;				CALL  CH452_READ       ;重新读取最近一次有效按键的键值
;				...
;
;
;****************************************************************************
;
;
; 初始化子程序
CH452_INIT:		SETB  CH452_DOUT       ;置为输入
; 下述三条指令用于键盘中断
;				CLR   IT0              ;置外部信号为低电平触发
;				SETB  PX0              ;置高优先级或者低优先级
;				CLR   IE0              ;清中断标志
;				SETB  EX0              ;允许键盘中断
				RET
;
;
; 输出命令子程序
; ENTRY: B-ACC 待写的12位数据, 低8位在ACC中, 高4位在B的低4位中
; USE:   ACC, B, R7
CH452_WRITE:	;CLR   EX0              ;禁止键盘中断
				CLR   CH452_LOAD       ;命令开始,此命令可以放在后面
				MOV   R7,#08H          ;将ACC中8位送出
CH452_WRITE_8:	RRC   A                ;低位在前,高位在后
				CLR   CH452_DCLK
				MOV   CH452_DIN,C      ;送出一位数据
				SETB  CH452_DCLK       ;产生时钟上升沿通知CH452输入位数据
				DJNZ  R7,CH452_WRITE_8 ;位数据未完继续
				MOV   A,B
				MOV   R7,#04H          ;将B中4位送出
CH452_WRITE_4:	RRC   A                ;低位在前,高位在后
				CLR   CH452_DCLK
				MOV   CH452_DIN,C      ;送出一位数据
				SETB  CH452_DCLK       ;产生时钟上升沿通知CH452输入位数据
				DJNZ  R7,CH452_WRITE_4 ;位数据未完继续
				SETB  CH452_LOAD       ;产生加载上升沿通知CH452处理命令数据
;				SETB  EX0              ;允许键盘中断
				RET
;
;
; 输入键值子程序
; EXIT:  ACC 键值数据
; USE:   ACC, R7
CH452_READ:		;CLR   EX0              ;禁止键盘中断
				CLR   CH452_LOAD       ;命令开始
				MOV   A,#07H           ;读取键值命令的高4位0111B
				MOV   R7,#04H          ;忽略12位命令的低8位
CH452_READ_4:	RRC   A                ;低位在前,高位在后
				CLR   CH452_DCLK
				MOV   CH452_DIN,C      ;送出一位数据
				SETB  CH452_DCLK       ;产生时钟上升沿锁通知CH452输入位数据
				DJNZ  R7,CH452_READ_4  ;位数据未完继续
				SETB  CH452_LOAD       ;产生加载上升沿通知CH452处理命令数据
				CLR   A                ;先清除键值单元以便移位
				MOV   R7,#07H          ;读入7位键值
CH452_READ_7:	MOV   C,CH452_DOUT     ;读入一位数据
				CLR   CH452_DCLK       ;产生时钟下升沿通知CH452输出下一位
				RLC   A                ;数据移入ACC,高位在前,低位在后
				SETB  CH452_DCLK
				DJNZ  R7,CH452_READ_7  ;位数据未完继续
;				CLR   IE0              ;清中断标志,读操作过程中有低电平脉冲
;				SETB  EX0              ;允许键盘中断
				RET
;
;
; 键盘中断子程序
; USE:   堆栈4字节
CH452_INTER:	PUSH  PSW              ;现场保护
				PUSH  ACC
				CLR   CH452_LOAD       ;命令开始
				MOV   A,#0F7H          ;读键值命令,忽略12位命令的低8位,高4位用作结束标志
CH452_INTER_4:	SETB  C                ;在高位添0以检测位数据结束
				RRC   A                ;低位在前,高位在后
				CLR   CH452_DCLK
				MOV   CH452_DIN,C      ;送出一位数据
				SETB  CH452_DCLK       ;产生时钟上升沿锁通知CH452输入位数据
				CJNE  A,#0FFH,CH452_INTER_4 ;位数据未完继续,共4位,完成后为0FFH
				SETB  CH452_LOAD       ;产生加载上升沿通知CH452处理命令数据
				MOV   A,#0FCH          ;该数据用以检测位数据结束
CH452_INTER_7:	MOV   C,CH452_DOUT     ;读入一位数据
				CLR   CH452_DCLK       ;产生时钟下升沿通知CH452输出下一位
				RLC   A                ;数据移入ACC,高位在前,低位在后
				SETB  CH452_DCLK
				JC    CH452_INTER_7    ;位数据未完继续,共7位,完成后才移出0
				MOV   CH452_KEY,A      ;保存键值
				POP   ACC
				POP   PSW
				CLR   IE0              ;清中断标志,该指令需根据实际情况作修改
				RETI                   ;中断返回
;
;****************************************************************************
;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -