输入电话号码数码管流动显示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仿真截图
实现思路
矩阵键盘线反转法检测
数码管通过74HC595两片串联驱动
输入位选和段选数据之后并行显示(理论上来讲不需要消隐)
实现思路
矩阵键盘线反转法检测
数码管通过74HC595两片串联驱动
输入位选和段选数据之后并行显示(理论上来讲不需要消隐)
然后通过按键的输入值进行各种操作
文章评论