输入电话号码数码管流动显示protues仿真 汇编代码

输入电话号码数码管流动显示protues仿真 汇编代码

功能:可以通过矩阵键盘按键输入电话号码

一次只能输入一位

按确定键之后可以输入下一位

按下播放键之后数码管流动显示

播放之后不能返回

keil代码

AUXR DATA 08EH;辅助功能寄存器

SH_CP EQU P2.0
DSSSS EQU P2.1
ST_CP EQU P2.2
	
DATA_INPUT  EQU 41H;片内rom直接访问
SEG_SELECT  EQU 42H
SCANCODE  EQU 44H
KEY_INDEX EQU 45H
KEY_NUM   EQU 46H
	
TEL_NUM_ADR EQU 6DH
TEL_BLANK2  EQU 5CH
TEL_BLANK1  EQU 5BH
TEL_NUM_10  EQU 5AH
TEL_NUM_09  EQU 59H
TEL_NUM_08  EQU 58H
TEL_NUM_07  EQU 57H
TEL_NUM_06  EQU 56H
TEL_NUM_05  EQU 55H
TEL_NUM_04  EQU 54H
TEL_NUM_03  EQU 53H
TEL_NUM_02  EQU 52H
TEL_NUM_01  EQU 51H
TEL_NUM_00  EQU 50H
TEL_BLANK0  EQU 4FH

COUNT_1 EQU 60H
COUNT_2 EQU 61H
	
ORG 0000H
LJMP START

;定时器中断
ORG 000BH
LJMP TIMER0

ORG 0100H
START:
	MOV TEL_BLANK0,#10H
	MOV TEL_NUM_00,#01H
	MOV TEL_NUM_01,#03H
	MOV TEL_NUM_02,#01H
	MOV TEL_NUM_03,#05H
	MOV TEL_NUM_04,#05H
	MOV TEL_NUM_05,#08H
	MOV TEL_NUM_06,#02H
	MOV TEL_NUM_07,#05H
	MOV TEL_NUM_08,#09H
	MOV TEL_NUM_09,#01H
	MOV TEL_NUM_10,#02H
	MOV TEL_BLANK1,#10H
	MOV TEL_BLANK2,#10H
	
	MOV TEL_NUM_ADR,#TEL_NUM_00;获取号码的一个地址
	
	LCALL TIMER0INIT;
	MOV COUNT_1,#60H
	
	MAIN_LOOP:
	;矩阵键盘检测
	LCALL KEYSCAN
	;显示一位静态数码管
	LCALL DS_ONE_SEG
	
	LJMP MAIN_LOOP
	
	SECOND_LOOP:
		;动态显示
		MOV 43H,#08H;
		DS_LOOP:
			MOV A,43H
			CLR C;消除借位标志
			SUBB A,#01H;查表位置消除偏移
			MOV DPTR,#SEG_COM
			MOVC A,@A+DPTR
			MOV SEG_SELECT,A;查表选择数码管
			
			MOV A,43H
			CLR C;消除借位标志
			SUBB A,#01H;查表位置消除偏移
			ADD A,TEL_NUM_ADR;获取对应键值地址
			MOV R1,A
			MOV DATA_INPUT,@R1
			LCALL HC_SER
			;LCALL DELAY3MS;加3ms延时来延时显示
			MOV DATA_INPUT, #10H;消隐
			LCALL HC_SER
		DJNZ 43H,DS_LOOP;减1不为0转移,可以转移1次
	LJMP SECOND_LOOP
	
	
;显示一位静态数码管
DS_ONE_SEG:
	MOV SEG_SELECT,#0FEH;选择数码管
	MOV R1,TEL_NUM_ADR;获取对应键值地址
	MOV DATA_INPUT,@R1
	LCALL HC_SER
	RET
	
TIMER0INIT:			;1毫秒@11.0592MHz
	ORL AUXR,#80H		;定时器时钟1T模式
	ANL TMOD,#0F0H		;设置定时器模式
	MOV TL0,#0CDH		;设置定时初始值
	MOV TH0,#0D4H		;设置定时初始值
	CLR TF0			;清除TF0标志
	SETB TR0		;定时器0开始计时
	SETB ET0
	//SETB EA;开启中断
	RET
	
TIMER0:;计时2s
	PUSH ACC
	PUSH PSW
	DJNZ COUNT_1,UNFINSH_COUNT
	MOV COUNT_1,#60H
	
	;DJNZ COUNT_2,UNFINSH_COUNT
	;MOV COUNT_2,#14H
	CPL P2.4
	
	MOV A,TEL_NUM_ADR
	CJNE A,#TEL_NUM_04,FINSH_INC
	MOV TEL_NUM_ADR,#4EH
	FINSH_INC:
	INC TEL_NUM_ADR
	UNFINSH_COUNT:
	POP PSW
	POP ACC
	RETI
	
;74HC595数字输入,串行输出
;A是十进制数字
;转换成对应码段
FIND_HC:
	MOV DPTR,#SEG_CC;查表操作
	MOVC A,@A+DPTR
	RET
	
;入口SEG_SELECT,DATA_INPUT,并行输出
;使用到的内存变量40H
;74HC595芯片输出模块
;两块芯片串联
HC_SER:
	;高八位数据先输入
	MOV A,SEG_SELECT
	MOV 40H,#08H
	HC_LOOP1:
	RLC A;A左移
	MOV DSSSS,C;串行输入
	
	CLR SH_CP;上升沿串行输出一位
	SETB SH_CP;
	DJNZ 40H,HC_LOOP1;减1不为0转移,可以转移7次

	;第二位数码管显示
	;低八位数据后输入
	MOV A,DATA_INPUT;将对应输入数据转换为码段
	LCALL FIND_HC

	MOV 40H,#08H
	HC_LOOP2:
	RLC A;A左移
	MOV DSSSS,C;串行输入
	CLR SH_CP;上升沿串行输出一位
	SETB SH_CP;
	DJNZ 40H,HC_LOOP2;减1不为0转移,可以转移7次
	CLR ST_CP;上升沿并行输出
	SETB ST_CP;
	RET
	
;矩阵键盘检测
KEYSCAN:
	MOV P1,#0FH;读行高四位,先送低四位高电平
	MOV A,P1
	CJNE A,#0FH,KEY_DOWN
	RET;无键按下

KEY_DOWN:
	;LCALL DELAY10MS
	MOV A,P1
	CJNE A,#0FH,KEY_REZ
	RET;无键按下

KEY_REZ:
	MOV SCANCODE,A
	MOV P1,#0F0H
	NOP 
	NOP
	MOV A,P1
	ADD A,SCANCODE
	MOV SCANCODE,A

KEY_UP:
	MOV A,P1
	CJNE A,#0F0H,KEY_UP
	;LCALL DELAY10MS
	MOV A,P1
	CJNE A,#0F0H,KEY_UP
	MOV DPTR,#KEY_CODE
	MOV KEY_INDEX,#0
	
KEY_LOOP:
	MOV A,KEY_INDEX
	MOVC A,@A+DPTR
	CJNE A,SCANCODE,NEXTKEY
	MOV KEY_NUM,KEY_INDEX
	MOV A,KEY_NUM
	
	CJNE A,#0AH,NUM_SEC_DS;按键为10,选择下一个
	
	MOV A,TEL_NUM_ADR
	CJNE A,#TEL_BLANK1,FINSH_INC1
	MOV TEL_NUM_ADR,#TEL_BLANK0
	FINSH_INC1:
	INC TEL_NUM_ADR
	RET
	
	NUM_SEC_DS:
		CJNE A,#0BH,NUM_SEC;按键为11,选择流动显示
		MOV TEL_NUM_ADR,#TEL_BLANK0
		SETB EA;开启中断
		LJMP SECOND_LOOP
		NUM_SEC:
		MOV R0,TEL_NUM_ADR
		MOV @R0,A
	RET
	NEXTKEY:
	INC KEY_INDEX
	LJMP KEY_LOOP

DELAY3MS:			;@11.0592MHz
	NOP
	NOP
	NOP
	NOP
	PUSH 30H
	PUSH 31H
	MOV 30H,#26
	MOV 31H,#204
NEXT2:
	DJNZ 31H,NEXT2
	DJNZ 30H,NEXT2
	POP 31H
	POP 30H
	RET

;共阴极数码管码段表
SEG_CC:
DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
DB 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
DB 0x00
	
SEG_COM:
DB 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F
	
KEY_CODE:
DB  0EEH, 0EDH, 0EBH, 0E7H, 0DEH, 0DDH, 0DBH, 0D7H
DB  0BEH, 0BDH, 0BBH, 0B7H, 07EH, 07DH, 07BH, 077H
END

protued仿真截图

1.

实现思路

矩阵键盘线反转法检测

数码管通过74HC595两片串联驱动

输入位选和段选数据之后并行显示(理论上来讲不需要消隐)

实现思路

矩阵键盘线反转法检测

数码管通过74HC595两片串联驱动

输入位选和段选数据之后并行显示(理论上来讲不需要消隐)

然后通过按键的输入值进行各种操作

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值