数码管显示程序~实验板上的数码管从左到右逐个显示“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里。