• 基于单片机的显示系统


    基于单片机的显示系统

    目录
    一、选题背景 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377

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

  • 相关阅读:
    【数据结构基础_字符串】Leetcode 415.字符串相加
    CSRF+Self XSS
    docker 启动时报错
    GBase 8c 产品高级特性(中)
    vue 详情页返回列表,过滤查询条件保留
    Laravel swagger接口文档生成和管理
    [附源码]java毕业设计某互联网公司人力资源管理系统
    k8s--基础--29.1--ingress--介绍
    2022“杭电杯” 中国大学生算法设计超级联赛(10)1 4题解
    分布式事务 —— SpringCloud Alibaba Seata
  • 原文地址:https://blog.csdn.net/newlw/article/details/126701991