数码管显示程序~实验板上的数码管从左到右逐个显示“0”、“1”、“2”、“3”

 1 DAT_74164    BIT    P0.6      ;头文件:74ALS164芯片的数据输入端接单片机引脚的p06
 2 CLK_74164    BIT    P0.7      ;74LS164芯片的时钟端接单片机引脚的p07
 3 
 4     org    0000H        
 5     jmp    MAIN
 6 
 7 ;*******************************************    
 8     org    0030H        ;Start program from 0030H        
 9 MAIN:
10     mov    P0,#0FFH    ;赋初始值:将立即数:二进制的1111,1111赋值给p0寄存器~使四个数码管都不显示
11     mov    P1,#0FFH
12     mov    P2,#0FFH
13     mov    P3,#0FFH
14 
15     mov    P0,#11111110B    ;The first to show 0,位选:FC~1,第一个亮
16     mov    a,#11000000B    ;段选
17     call    sendTo74164
18     call    DELAY    
19     
20     mov    P0,#1111101B        ;The second to show 1,位选:~2,第二个亮
21     mov    a,#11111001B      ;段选,亮f,e
22     call    sendTo74164
23     call    DELAY
24 
25     mov    P0,#11111011B    ;The third to show 2,
26     mov    a,#10100100B    ;段选:亮:a,b,g,e,d
27     call    sendTo74164
28     call    DELAY
29 
30     mov    P0,#11110111B    ;The fouth to show 3
31     mov    a,#10110000B
32     call    sendTo74164
33     call    DELAY
34 
35     jmp    $
36 
37 
38     ret
39 ;*******************************************
40 ;Send data of A to chip 74LS164
41 sendTo74164:
42     push    07h      ;07h地址压入到堆栈中
43     push    acc
44 
45     mov    r7,#08            ;send 8 bits   ,   
46 SEND164_LOOP:
47     clr    CLK_74164        ;clear clock-line for reading data,
48     rlc    a          ;带进位累加器循环左移
49     mov    DAT_74164,c        ;move data-bit to data-line    
50     setb    CLK_74164        ;send data to 74164
51     djnz    r7,SEND164_LOOP    ;寄存器r7-1,不为零则转移到SEND164——LOOP
52         
53     pop    acc
54     pop    07h
55 ret
56 ;*******************************************
57 ;Dealy for a interval
58 DELAY:    
59     mov    r5,#06H
60 DELAY_2:
61     mov    R6,#0FFH    
62 DELAY_1:
63     
64     mov    R7,#0FFH
65 DELAY_0:
66     nop
67     nop
68     djnz    R7,DELAY_0
69 
70     djnz    R6,DELAY_1
71 
72     djnz    R5,DELAY_2
73 
74     ret
75 ;*******************************************
76     END    

solution:

1 #:代表立即数:MOV P2,#0FH ;#的作用是将0FH标记为立即数,将0FH 换成 0000 1111B 也没毛病

  #0FFH:在16进制中每个立即数前要写一个0,无实际意义

2 位选与段选:

  位选:哪个数码管选通

  段选:数码管的a段到g段那一段亮

3 段选中立即数与数码管的对应关系:

  mov    a,#11000000B
 ~ 1 gfedcba 1 B

4 入栈和出栈操作:
  push direct
  push acc
  ......
  pop acc
  pop direct

push pop acc操作:避免累加器出错,保护好数据

5 send to 74164?
6 rlc a:
  带进位位循环左移:将a的内容左移一位,将进位位C中的值移到累加器a的最低位,a的最高位移到C里。
posted on 2022-10-13 17:07  罗小罗佳油  阅读(507)  评论(0编辑  收藏  举报