; By Paprika
; 2017.10.31
; 程序内容: 1开机显示四位8确定数码管好坏和程序的正确性
;2 摁第一个键显示班级,第其余三位显示学号的四位 摁动四个数字键依次显示为1503 1504 0130 2###
CH452_DCLK BIT P2.5 ;串行数据时钟,上升沿激活
CH452_DIN BIT P2.6 ;串行数据输出,接CH452的数据输入
CH452_LOAD BIT P3.3 ;串行命令加载,上升沿激活
CH452_DOUT BIT P2.7 ;接 CH452 的数据输出
ORG 0000H
START: ACALL CH452_INIT;调用初始化程序
MOV R5,#00H;R5清零
MOV R4,#00H;R清零
ceshi:;检测数码管是否OK显示四位8
MOV B,#0CH ;B是高四位
MOV A,#0fdH ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0dH ;B是高四位
MOV A,#0FDH ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0eH ;B是高四位
MOV A,#0FDH ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0fH ;B是高四位
MOV A,#0FDH ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
xianshi: ACALL jiance ;检测是否有按键按下
SJMP xianshi ;显示功能
SJMP $
jiance:
MOV C,CH452_DOUT ;判断是否有按键按下,位判断
JC jiance ;没有按键按下,继续检测
ACALL CH452_READ ;有按键按下,通过452读值
MOV R1,A
C0: CJNE R1,#44H,C1 ;由键码得
ACALL banji
AJMP TES
C1: CJNE R1,#45H,C2
ACALL xuehao1
AJMP TES
C2: CJNE R1,#46H,C3
ACALL xuehao2
C3: CJNE R1,#47H,jiance ;由键码得
ACALL xuehao3
AJMP TES
TES:
RET
JC jiance
banji:
; 显示班级 具体写入数据为: 段选+数字1503
MOV B,#0CH ;B是高四位
MOV A,#18H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0dH ;B是高四位
MOV A,#0e9H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0eH ;B是高四位
MOV A,#0bdH ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0fH ;B是高四位
MOV A,#0d9H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
RET
xuehao1:
; 显示1504 具体写入数据为: 段选+数字
MOV B,#0CH ;B是高四位
MOV A,#18H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0dH ;B是高四位
MOV A,#0e9H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0eH ;B是高四位
MOV A,#0bdH ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0fH ;B是高四位
MOV A,#078H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
RET
xuehao2:
; 显示学号0130 具体写入数据为: 段选+数字
MOV B,#0CH ;B是高四位
MOV A,#0bdH ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0dH ;B是高四位
MOV A,#018H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0eH ;B是高四位
MOV A,#0d9H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0fH ;B是高四位
MOV A,#0bdH ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
RET
xuehao3:
; 显示2### 具体写入数据为: 段选+数字
MOV B,#0cH ;B是高四位
MOV A,#0d5H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0dH ;B是高四位
MOV A,#0H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0eH ;B是高四位
MOV A,#0H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#0fH ;B是高四位
MOV A,#0H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
RET
;**************************************************************************** CH452初始程序
CH452_INIT: ;CH452初始化
CLR CH452_DIN ;先低后高,输出上升沿通知 CH452 选择 4 线串行接口
SETB CH452_DCLK;置为默认的高电平
SETB CH452_DIN
SETB CH452_LOAD
SETB CH452_DOUT;置为输入
MOV B,#04H ;B是高四位
MOV A,#03H ;设置为键盘与显示开 ;A 是低八位
ACALL CH452_WRITE
MOV B,#05H ;设定显示参数
MOV A,#0AH ;设置no bcd 扫描极限最高1000B
ACALL CH452_WRITE
RET
;****************************************************************************串口通信读出写入程序
CH452_WRITE:
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 处理命令数据
RET
; 读取数据
CH452_READ:
CLR CH452_LOAD ;命令开始
MOV A,#07H;读取键值命令的高 4 位 0111B
MOV R7,#04H ;忽略 12 位命令的低 8 位 1111 0000 ;改过#040H
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 ;位数据未完继续
RET
|