基于单片机的显示系统

基于单片机的显示系统

目录
一、选题背景 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

基于单片机的显示系统_第1张图片
基于单片机的显示系统_第2张图片
基于单片机的显示系统_第3张图片
基于单片机的显示系统_第4张图片
基于单片机的显示系统_第5张图片
基于单片机的显示系统_第6张图片
基于单片机的显示系统_第7张图片
基于单片机的显示系统_第8张图片
基于单片机的显示系统_第9张图片
基于单片机的显示系统_第10张图片
基于单片机的显示系统_第11张图片
基于单片机的显示系统_第12张图片
基于单片机的显示系统_第13张图片
基于单片机的显示系统_第14张图片
基于单片机的显示系统_第15张图片
基于单片机的显示系统_第16张图片
基于单片机的显示系统_第17张图片
基于单片机的显示系统_第18张图片
基于单片机的显示系统_第19张图片
基于单片机的显示系统_第20张图片
基于单片机的显示系统_第21张图片
基于单片机的显示系统_第22张图片
基于单片机的显示系统_第23张图片
基于单片机的显示系统_第24张图片
基于单片机的显示系统_第25张图片
基于单片机的显示系统_第26张图片
基于单片机的显示系统_第27张图片
基于单片机的显示系统_第28张图片
基于单片机的显示系统_第29张图片
基于单片机的显示系统_第30张图片
基于单片机的显示系统_第31张图片
基于单片机的显示系统_第32张图片
基于单片机的显示系统_第33张图片

你可能感兴趣的:(单片机,嵌入式硬件,stm32,显示系统,课程设计)