📄 zouning.asm
字号:
;********************************************************************************
;* 标题: 电子无忧网uP51cp单片机学习板演示程序 *
;* 文件: uP51cp.asm *
;* 日期: 2005-3-18 *
;* 版本: 1.0 *
;* 作者: david *
;* 邮箱: dz51.com@163.com *
;* 网站: http://www.dz51.com *
;********************************************************************************
;* 程序描述描述: *
;* 程序分两大部分,当开发板上电的时候拨码开关的第一位是闭合(ON)的状态 *
;* 运行LOOP1循环,矩阵键盘有效,数码管显示按键值,同时将按键值通过串口发*
;* 送出去。 *
;* 当开发板上电的时候拨码开关第一位是打开的(OFF)的状态,则独立键盘有效 *
;* 按下K1则逆时针点亮数码管的每一段,按下K2键则顺时针点亮数码管的每一段 *
;* 同时将当前点亮数码管的数据通过RS232串口发送出去。 *
;* *
;* 矩阵键盘定义: *
;* P1.0-P1.3为列线,P1.4-P1.7为行线 *
;* *
;* 独立按键键盘定义: *
;* P14为K1键盘 *
;* P15为K2键盘 *
;* P16为K3键盘 *
;* P17为K4键盘 *
;* 更详细的定义连接请参考uP51cp原理图 *
;********************************************************************************
;********************************************************************************
BEEP EQU P3.2 ;蜂鸣器
AN1 BIT P1.4 ;独立按键1
AN2 BIT P1.5 ;独立按键2
leddata data 30H ;定义几个变量
KEY_S data 31H
KEY_V data 32H
;------------------------------------------------------
ORG 0000H
JMP MAIN
;------------------------------------------------------
MAIN: MOV SP,#60H
CLR BEEP
MOV R5,#15
CALL DELAY
SETB BEEP
MOV R5,#50
CALL DELAY ;//刚刚上电的时候蜂鸣器鸣响一下
;//初始化串行口
MOV TMOD,#20H ; 定时器1工作于8位自动重载模式,用于产生波特率
MOV TH1,#0FDH
MOV TL1,#0FDH ; 波特率9600
MOV SCON,#50H ; 设定串行口工作方式
ANL PCON,#0EFH ; 波特率不倍增
SETB TR1 ; 启动定时器1
MOV IE,#0 ; 禁止任何中断
MOV A,P2 ;把拨码开关读入
JNB ACC.4,LOOP11 ;//根据拨码开关第1位选择运行的程序
;当拨码开关第一位设置为ON时为独立键测试程序
;当拨码开关第一位设置为OFF时为矩阵键测试程序,数码管显示按键的值
;----------------------------------------------
;当拨码开关第一位ON的时候,loop2循环,测试独立按键,并且将将按键值通过RS232发送出去
LOOP22:
MOV leddata,#0FEH ; 初始点亮LED P00
MOV P0,leddata ; 初始点亮LED P00
MOV KEY_V,#03H ; 初始键值
LOOP2: NOP
CLR P2.3 ;第一个数码管亮
CALL KEY_CHKSW
JMP LOOP2
;------------------------------------------------
;当拨码开关第一位OFF的时候,loop1循环,测试矩阵按键,并且将将按键值通过RS232发送出去
LOOP11: MOV 30H,#00H
LOOP1: NOP
CALL KEY_IN
CALL KEY_PLAER
JMP LOOP1
;-----------------------------------------------------
;矩阵键盘扫描程序
KEY_IN: MOV P1,#0F0H ;置列线为0,行线为1
MOV A,P1
ANL A,#0F0H
MOV B,A
MOV P1,#0FH ;置列线为1,行线为0
MOV A,P1
ANL A,#0FH
ORL A,B ;高四位与低四位重新组合
CJNE A,#0FFH,KEY_IN1 ;0FFH为末按键
RET
KEY_IN1: MOV B,A
MOV DPTR,#KEYTABLE
MOV R3,#0FFH ;
KEY_IN2: INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY_IN3
MOV A,R3 ;找到,取顺序码
MOV 30H,A
CALL SEND_CHAR
CALL BEEP_BL
RET
KEY_IN3: CJNE A,#0FFH,KEY_IN2 ;末完,继续查
RET ;0FFH为结束码
;----------------------------------------------
;蜂鸣器响一声子程序
;----------------------------------------------
BEEP_BL:
MOV R6,#100
BL1: CALL DEX1
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY
RET
DEX1: MOV R7,#180
DEX2: NOP
DJNZ R7,DEX2
RET
DELAY: ;延时R5×10MS
MOV R6,#50
DELAY1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
DJNZ R5,DELAY
RET
;-----------------------------------------------------
KEYTABLE:
DB 0EEH,0EDH,0EBH,0E7H,0DEH ;0,1,2,3,4, 顺序码
DB 0DDH,0DBH,0D7H,0BEH,0BDH ;5,6,7,8,9,
DB 0BBH,0B7H,07EH,07DH,07BH ;A,B,C,D,E,
DB 077H,0FFH ;F 0FF为结束码
;-----------------------------------------------------
;键值显示子程序
;使用一个数码管显示
;-----------------------------------------------------
KEY_PLAER:
MOV A,30H
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P0口
CLR P2.3 ;第一个数码管亮
CLR P2.2 ;第一个数码管亮
CLR P2.1 ;第一个数码管亮
CLR P2.0 ;第一个数码管亮
RET
;-----------------------------------------------------
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88h,83h,0c6h,0a1h,86h,8eh
;-----------------------------------------------------
;-----------------------------------------------------
;//以下为独立键盘处理部分程序
KEY_CHKSW: ; 循环检测按键是否按下
ACALL SCAN_KEY ; 输入按键状态
MOV KEY_S,A
XRL A,KEY_V ; 检查按键值是否改变
JZ KEY_CHKSW ; 若无键被按,则跳回KEY_CHKSW
MOV R5,#1 ; 延时10ms
ACALL DELAY ; 延时去抖
ACALL SCAN_KEY ; 再次检查按键值
MOV KEY_S,A
XRL A,KEY_V
JZ KEY_CHKSW
MOV KEY_V,KEY_S ; 保存按键状态
ACALL PROC_KEY ;
SJMP KEY_CHKSW
;===============================================================================
;===============================================================================
SCAN_KEY:
; 扫描按键
; 传入参数:无
; 返回值:A --- 按键状态
CLR A
MOV C,AN1
MOV ACC.0,C
MOV C,AN2
MOV ACC.1,C
RET
;===============================================================================
PROC_KEY:
; 按键处理子程序
; 传入参数: KEY_V --- 按键值
; 返回值: 无
MOV A,KEY_V
JNB ACC.0,PROC_AN1
JNB ACC.1,PROC_AN2
RET
PROC_AN1: ; 按键AN1处理程序
MOV A,leddata ; 右移
RR A
MOV leddata,A
MOV P0,leddata
CLR P2.3 ;第一个数码管亮
CLR P2.2 ;第一个数码管亮
CLR P2.1 ;第一个数码管亮
CLR P2.0 ;第一个数码管亮 CALL BEEP_BL
CALL SEND_CHAR
CALL BEEP_BL
RET
PROC_AN2: ; 按键AN2处理程序
MOV A,leddata ; 左移
RL A
MOV leddata,A
MOV P0,leddata
CLR P2.3 ;第一个数码管亮
CLR P2.2 ;第一个数码管亮
CLR P2.1 ;第一个数码管亮
CLR P2.0 ;第一个数码管亮 CALL BEEP_BL
CALL SEND_CHAR
CALL BEEP_BL
RET
;===============================================================================
;===============================================================================
SEND_CHAR:
; 传送一个字符
; 传入参数: ACC(要发送的数据)
; 返回值: 无
MOV SBUF,A
JNB TI,$ ; 等特数据传送
CLR TI ; 清除数据传送标志
RET
;===============================================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -