基于单片机的显示系统

发布于:2022-12-29 ⋅ 阅读:(613) ⋅ 点赞:(0)

基于单片机的显示系统

目录
一、选题背景 1
二、方案论证(设计理念) 2
三、过程论述 3
四、结果分析 29
五、课程设计总结 36

一、选题背景
单片机课程设计是《微机系统与接口技术》课程学习中不可缺少的实践性教学环节。通过课程设计,加深学生对本门课程基本知识的理解,培养学生运用所学知识,分析和解决问题的技能,提高学生对课程基本知识的应用能力,训练并提高学生查阅文献、分析资料和撰写论文的基本功。单片微型计算机作为微型计算机的一个重要分支,在技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让它得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。其中单片机用于电子产品的设计是非常方便的。
本实验要求如下:
1.分立小模块功能要求
(1)输入按键并显示:4×4矩阵键盘分别定义为:0、1、2、3、4、5、……、E、F,16个按键。当键入一个按键,在一位数码管上显示键值。
(2)键盘控制LED:利用键盘0~7八个按键,分别控制8个LED。当键入其中一个按键,点亮相应的LED。
(3)外部中断0:按下KEY1,在四位数码管闪烁显示“ERR-”三次。
(4)外部中断1:按下KEY2,LED演示走马灯10次,并且LED点亮的时间控制必须精确定时,利用定时器定时时间。
2.综合模块要求
将分立小模块的多个功能集成在一个项目中,自主设计一个具有实际应用功能的程序,鼓励自主创新。

二、方案论证(设计理念)
1.键盘扫描
(1)矩阵键盘的介绍
单片机中的矩阵键盘是由51芯片中的P2端口所拉出来的8根引线组成的,其中P2.0P2.3作为行线,P2.4P2.7作为列线。在行线和列线的每个交叉点上设置一个按键,这样键盘上按键的个数就为4×4个。
(2)识别矩形键盘按键的方法
对矩阵键盘按键识别常用的有扫描法,反极法和位操作法:
①扫描法
首先判断是否有键按下,使全部行线输出低电平,检测列线的电平状态;确认有键按下后,每条行线分别单独输出低电平,检测列线为零的交点,由此得到的一个八位二进制可利用穷举法进行键值赋值。
②反极法
行线全送出低电平,检测列线状态,出现低电平的列线即被按下;此后,相反的,将全部列线送出低电平,检测行线状态,出现低电平的行线即被按下。将得到的两个表示状态的八位二进制进行或运算,就在进行查找键值。
③位操作法
把行输出线逐位置为低电平,对列输入线逐位扫描,有键按下时列线变为低电平。再把行线逐条置为低电平,其余行线置为高电平,用位比较指令逐列扫描,确定按下的键所在的列。赋予键值。把行输出线逐位置为低电平,对列输入线用位比较指令逐位扫描,若列线全部为高电平,表示按键已释放。本文转载自http://www.biyezuopin.vip/onews.asp?id=15349
三种方法比较而言,“反极法”最为简易快捷,代码短而又能够实现功能。故本实验采用反极法得到按键值,利用查表法进行按键赋值,为之后再次查表赋予数码管码值以及LED灯码值做好准备。


		ORG 0000H         ;主程序入口
        AJMP MAIN
        ORG 0003H         ;外部中断0
        AJMP ERR_FLASH
        ORG 000BH         ;定时器0
        AJMP TIMER0
        ORG 0013H         ;外部中断1
        AJMP FLOW_LIGHT
        ORG 001BH         ;定时器1
        AJMP TIME1
        ORG 0030H
MAIN:
        SETB EA           ;全局中断允许
        SETB EX0          ;外部中断0中断允许
        SETB EX1          ;外部中断1中断允许
        SETB PT0          ;定时器0:高优先级
        CLR PT1           ;定时器1:低优先级
        CLR PX0           ;外中断0:低优先级
        CLR PX1           ;外中断1:低优先级
        
;——————————开机闪烁作者1次——————————
        LCALL DLY4
        MOV R1,#05H       ;延时
SHOW0:
        MOV R5,#0CEH      ;赋值P    
        MOV A,R5
        LCALL TUBE
        SETB P0.0
        LCALL DLY3
        CLR P0.0
        
        MOV R5,#76H       ;赋值Y 
        MOV A,R5
        LCALL TUBE
        SETB P0.1
        LCALL DLY3
        CLR P0.1
        
        MOV R5,#0EEH      ;赋值A 
        MOV A,R5
        LCALL TUBE
        SETB P0.2
        LCALL DLY3
        CLR P0.2
        
        MOV R5,#0FCH      ;赋值O
        MOV A,R5
        LCALL TUBE
        SETB P0.3
        LCALL DLY3
        CLR P0.3
        
        JNB F0,SHOW0
        CLR F0
        DJNZ R1,SHOW0
        MOV R1,#03H
        MOV P0,#00H        ;灭数码管灯

;——————————根据键值判断选择功能—————————— 
        LCALL SCAN        ;扫描键盘
        CJNE R0,#0E7H,COM1 
        AJMP CHECK1       ;按键为左下角第一个则选择CHECK1数码管显示数字功能
COM1:
        CJNE R0,#0EBH,COM2;
        AJMP CHECK2       ;按键为左下角从左到右第二个则选择CHECK2按键控制相应LED灯亮功能
COM2:
        CJNE R0,#0EDH,MAIN;不为这3个按键则返回主程序重新扫描
        AJMP ALARM  
        


;===============功能1:数码管显示数值===============
CHECK1: 
        LCALL SCAN
        ;LCALL ALARM        
        MOV A,#00H
        MOV R1,#00H
NEXT1:  
        MOV A,R1
        INC A             ;A不断增加直到与R0相等才不再循环,最终A为键值,R1为按键数值
        MOV R1,A          
        MOV DPTR,#TABLE1  ;装入键值表头
        MOVC A,@A+DPTR    ;按键值与键值表比较
        CLR CY            ;进位标志CY清0
        SUBB A,R0         ;(A)<-(A)-(R0)-(CY)
        JNZ NEXT1         ;A不等于0则循环查表
NOW:    
        MOV R3,#08H       ;R3高位置0,控制串行输入循环
        MOV DPTR,#TABLE2  ;装入数码管表头
        MOV A,R1          ;将按键数值存入A
        MOVC A,@A+DPTR    ;按键值与数码管表比较并将数码管值存入A
        LCALL TUBE        ;调用传输数据给数码管功能子程序
        SETB P0.0         ;点亮第一个数码管
        SETB P0.3
        LCALL DLY3
        ;CLR P0.0         ;加上这句则为闪亮一下
        AJMP CHECK1       ;返回CHECK1循环扫描
        
;===============功能2:按键控制LED灯显示===============
CHECK2: 
        LCALL SCAN
        MOV A,#00H
        MOV R2,#00H
NEXT3:  
        MOV A,R2
        INC A
        MOV R2,A          ;将符合的键值暂存入R2
        MOV DPTR,#TABLE1  ;装入键值表头
        MOVC A,@A+DPTR    ;按键值与键值表比较
        CLR CY            ;进位标志CY清0
        SUBB A,R0         ;(A)<-(A)-(R0)-(CY)
        JNZ NEXT3         ;A不等于0则循环查表
NOW1:   
        MOV DPTR,#TABLE3  ;装入LED表头
        MOV A,R2          ;将键值存入A
        MOVC A,@A+DPTR    ;按键值与数码管表比较
        MOV P0,A          ;符合的键值存入P0点亮LED灯
        AJMP CHECK2       ;返回CHECK2循环扫描


;===============功能3:外部中断0,数码管ERR-闪烁3===============
ERR_FLASH:
        LCALL DLY4
        MOV R0,#03H       ;闪烁次数
        MOV R1,#05H
        MOV R2,#4
        MOV R3,#0
        MOV DPTR,#TABLE4
SHOW:
        MOV A,R3
        MOVC A,@A+DPTR       ;查表     
        LCALL TUBE
SHU0:   CJNE R3,#0,SHU1      ;判断是第1个字则点亮第1个数码管
        SETB P0.0
        LCALL DLY3
        CLR P0.0
        AJMP CMPR2
SHU1:   CJNE R3,#1,SHU2      ;判断是第2个字则点亮第2个数码管
        SETB P0.1
        LCALL DLY3
        CLR P0.1
        AJMP CMPR2
SHU2:   CJNE R3,#2,SHU3      ;判断是第3个字则点亮第3个数码管
        SETB P0.2
        LCALL DLY3
        CLR P0.2
        AJMP CMPR2
SHU3:   CJNE R3,#3,CMPR2     ;判断是第4个字则点亮第4个数码管
        SETB P0.3
        LCALL DLY3
        CLR P0.3
CMPR2:  
        INC R3
        DJNZ R2,SHOW
        MOV R2,#4
        MOV R3,#0
        JNB F0,SHOW
        CLR F0
        MOV R2,#4
        MOV R3,#0
        DJNZ R1,SHOW
        MOV R1,#03H
        MOV P0,#00H        ;灭数码管灯
BLANK:
        JNB F0,BLANK
        CLR F0
        DJNZ R1,BLANK
        MOV R1,#05H
        MOV R2,#4
        MOV R3,#0
        DJNZ R0,SHOW
        CLR TR0        
        RETI

;===============功能4:外部中断1,LED演示走马灯(用到了定时器,总共用时约16s)===============
FLOW_LIGHT:
        LCALL DLY4        ;调用定时器计时子程序
        MOV R3,#80        ;共右移80次
        MOV A,#7FH        ;设置初始值左边第一个灯亮

RUN:
        MOV P0,A
        JNB F0,RUN        ;计时未完成则依旧点亮原来的灯
        CLR F0
        RR A              ;循环右移
        DJNZ R3,RUN
        CLR TR0
        MOV P0,#0FFH
        RETI

;===============功能5(附加功能):循环播放生日歌===============
ALARM:
     MOV TMOD,#10H
     MOV IE,#88H
START0:
     MOV R1,#00H
NEXT:
     MOV A,R1
     MOV DPTR,#TABLE5
     MOVC A,@A+DPTR
     MOV R2,A 
     JZ END0
     ANL A,#0FH
     MOV R5,A
     MOV A,R2
     SWAP A ;高四位和低四位互换
     ANL A,#0FH
     JNZ SING
     CLR TR1
     JMP D1
SING:
     DEC A
     MOV R6,A
     RL A
     MOV DPTR,#TABLE6
     MOVC A,@A+DPTR       ;查表预置高位
     MOV TH1,A
     MOV 51H,A
     MOV A,R6
     RL A                 ;设定字节间隔
     INC A
     MOVC A,@A+DPTR       ;查表预置低位
     MOV TL1,A
     MOV 50H,A
     SETB TR1             ;启动定时器1
D1:
     LCALL DELAYMUSIC
     INC R1
     JMP NEXT
END0:
     CLR TR1
     JMP START0
TIME1:
     PUSH ACC             ;保护ACC值
     PUSH PSW             ;保护PSW值
     MOV TH1,51H
     MOV TL1,50H
     CPL P1.3             ;波形输出反相
     POP PSW
     POP ACC
     RETI
DELAYMUSIC:
     MOV R7,#02
D2:  
     MOV R4,#187
D3:  
     MOV R3,#248
     DJNZ R3,$
     DJNZ R4,D3
     DJNZ R7,D2
     DJNZ R5,DELAYMUSIC
     RET
;===============功能5结束===============


;===============反极法扫描键盘函数===============
SCAN: 
        NOP
;——————————列查询——————————
KEYC:   
        MOV P2,#0FH       ;按键高四位即行清0
        MOV A,P2
        ANL A,#0FH        ;累加器A高四位即行清0
        CJNE A,#0FH,KC1   ;判断是否按下按键,是则跳至KC1存值,否则再次扫描
        AJMP KEYC
KC1:    
        LCALL DLY3        ;调用延时子程序
        MOV A,P2          ;将键值存入A
        ANL A,#0FH        ;累加器A高四位即行再次清0
        CJNE A,#0FH,KC2   ;再次判断是否按下按键,是则跳至KC2存值,否则再次扫描
        AJMP KEYC
KC2:    
        MOV R0,A          ;将列键值A存入R0
;——————————行查询——————————
KEYR:   
        MOV P2,#0F0H      ;按键低四位即列清0
        MOV A,P2
        ANL A,#0F0H       ;累加器A低四位即列清0
        CJNE A,#0F0H,KR1
        AJMP KEYR
KR1:    
        LCALL DLY3
        MOV A,P2
        ANL A,#0F0H
        CJNE A,#0F0H,KR2
        AJMP KEYR
KR2:    
        ORL A,R0          
        MOV R0,A          ;将行键值A与原R0或,存入R0包含行与列
        RET
;===============扫描键盘结束===============

;——————————74HC595传数据给数码管——————————
TUBE:
        MOV P0,#00H
        MOV R4,#08H
        CLR P0.6
PUT_IN:
        RRC A             ;带进位累加器循环右移
        MOV P0.7,C                                                
        SETB P0.4
        CLR P0.4
        DJNZ R4,PUT_IN                                        
        AJMP PUT_OUT
PUT_OUT:
        SETB P0.5
        CLR P0.5
        RET
;——————————定时器0中断——————————
TIMER0:
        MOV TMOD,#01H
        MOV TH0,#3CH
        MOV TL0,#0B0H
        DJNZ R7,TIMER0
        SETB F0
        RETI
;——————————延时消除抖动——————————
DLY3:
        MOV R6,#50
D1S1:
        MOV R5,#50
        DJNZ R5,$
        DJNZ R6,D1S1
        RET
;——————————定时器0延时0.2S——————————
DLY4:
        MOV TMOD,#01H     ;选择工作模式1,定时器0 
        MOV TH0,#3CH      ;初值高字节
        MOV TL0,#0B0H     ;初值低字节
        MOV R7,#04H
        SETB ET0          ;定时器T0中断允许
        SETB TR0          ;启动定时器T0
        CLR F0
        RET

;——————————矩阵键盘、数码管、LED灯码值表——————————
TABLE1: 
        DB 0E7H,0EBH,0EDH,0EEH,0D7H,0DBH,0DDH,0DEH,0B7H,0BBH,0BDH,0BEH,77H,7BH,7DH,7EH
        ;矩阵键盘:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
TABLE2: 
        DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0FAH,3EH,1AH,7AH,9EH,8EH
        ;数码管:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
TABLE3: 
        DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH,07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH     
        ;对应LED键字0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7
TABLE4:
        DB 09EH,0EEH,0EEH,02H,0CEH,76H,0EEH,0FCH
        ;数码管:ERR-PYAO
        
;歌曲表单
TABLE5:
     DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H
     DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H
     DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
     DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H

     DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H
     DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H
     DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
     DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
     DB 00H
     ;生日歌简谱:5 5 6 5 1 7 - | 5 5 6 5 2 1 | 5 5 5 3 1 7 6 | 4 4 3 1 2 1

;音调
TABLE6:
     DW 64260,64400,64524,64580 
     DW 64684,64777,64820,64898
     DW 64968,65030,65058,65110
     DW 65157,65178,65217
     ;5,低6,低7,中1
     ;2,中3,中4,中5
     ;6,中7,高1,高2
     ;3,高4,高5
     
     END

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述