程序12-5:16×32点阵屏的显示程序,显示内容为汉字“南方公园”(对应图12-15)
ORG 00H ; 起始地址00H
; 主程序段
START:
MOV A, #00H ; A=00H
MOV P0, A ; 上半个8×32点阵清0
MOV P2, A ; 下半个8×32点阵清0
; 扫描程序段
DISPLAY:
MOV R0, #2 ; 需要两屏才能显示完4个字,R0为屏数计数器
MOV 30H, #00H ; 30H中存储取显示编码的指针
SCAN_SETS:
MOV R1, #00H ; R1为74154的扫描计数器,初始值为00H
MOV R2, #0FFH ; 每屏停留一段时间,通过R2进行延时
DIS_SETS:
MOV R3, #32 ; 每个字有32个字节的数据,R3为显示数据计数器
MOV R4, 30H ; 将取显示编码的指针载入R4中
DIS_CHAR:
CALL LOAD ; 调用显示编码的子程序LOAD
INC R1 ; 扫描计数器增加1
DJNZ R3, DIS_CHAR ; 如果没有取完1个字的32个字节的数据则继续取
MOV R1, #00 ; 如果取完32个字节,扫描计数器清0
DJNZ R2, DIS_SETS ; 每屏显示之后延时一会儿
MOV 30H, R4 ; 取显示编码的指针存回30H中
DJNZ R0, SCAN_SETS ; 如果不到两屏,说明4个字没有显示完,继续显示
MOV R5, #200 ; 如果显示完两屏,延时100ms
CALL DELAY ; 调用延时子程序
JMP START ; 循环
; 取显示编码的子程序段
LOAD:
MOV A, R1 ; 扫描计数器载入A
MOV P1, A ; 从P1口输出,以选中某一列
MOV A, R4 ; 取显示编码指针载入A
MOV DPTR, #TABLE ; DPTR寄存器指向TABLE表头
MOVC A, @A+DPTR ; 显示编码载入A
MOV P0, A ; 从P0口输出显示编码,显示汉字的一半
INC R4 ; 取显示编码指针增加1
MOV A, R4 ; 更新的取显示编码指针载入A
MOVC A, @A+DPTR ; 下一个显示编码载入A
MOV P2, A ; 从P2口输出显示编码,显示汉字的一半
INC R4 ; 取显示编码指针增加1
MOV R5, #30 ; 延时15ms
CALL DELAY
MOV A, #00H ; A=00H
MOV P0, A ; 清屏幕
MOV P2, A
RET
DELAY: ; 延时子程序
MOV R6, #248
DJNZ R6, $
DJNZ R5, DELAY
RET
TABLE:
;************** “南”字的编码 **************
DB 20H, 00H, 20H, 00H, 27H, 0FEH, 24H, 20H
DB 24H, 0A0H, 26H, 0A0H, 02DH, 0A0H, 0F4H, 0FEH
DB 24H, 0A0H, 25H, 0A0H, 26H, 0A0H, 24H, 0A4H
DB 24H, 22H, 67H, 0FCH, 20H, 00H, 00H, 00H
;************** “方”字的编码 **************
DB 10H, 02H, 10H, 02H, 10H, 04H, 10H, 08H
DB 10H, 30H, 10H, 0C0H, 9FH, 00H, 52H, 00H
DB 32H, 04H, 12H, 02H, 12H, 02H, 13H, 0FCH
DB 10H, 00H, 10H, 00H, 10H, 00H, 00H, 00H
;************** “公”字的编码 **************
DB 00H, 00H, 00H, 80H, 01H, 04H, 02H, 0EH
DB 0CH, 14H, 70H, 24H, 21H, 0C4H, 00H, 8CH
DB 00H, 08H, 70H, 08H, 08H, 28H, 06H, 1EH
DB 03H, 0CH, 01H, 80H, 01H, 00H, 00H, 00H
;************** “园”字的编码 **************
DB 00H, 00H, 7FH, 0FFH, 40H, 0AH, 42H, 12H
DB 52H, 22H, 53H, 0C2H, 52H, 02H, 52H, 02H
DB 53H, 0E2H, 52H, 12H, 56H, 12H, 42H, 72H
DB 40H, 02H, 7FH, 0FFH, 00H, 00H, 00H, 00H
END
第二篇:单片机入门汇编程序 程序15-4:太阳跟随系统
程序15-4:太阳跟随系统(对应图15-40)
LDR1 EQU P3.0 ; 定义变量LDR1,光线传感器1输入
LDR2 EQU P3.5 ; 定义变量LDR2,光线传感器2输入
LIM1 EQU P1.2 ; 定义变量LIM1,限位开关1
LIM2 EQU P1.3 ; 定义变量LIM2,限位开关2
SW1 EQU P1.0 ; 定义变量SW1,开始跟随开关
SW2 EQU P1.1 ; 定义变量SW2,停止跟随开关
ENA EQU P2.5 ; 定义变量ENA,X轴电机使能
ENB EQU P2.6 ; 定义变量ENB,Y轴电机使能
MX1 EQU P2.0 ; 定义变量MX1,X轴电机控制端1
MX2 EQU P2.1 ; 定义变量MX2,X轴电机控制端2
MY1 EQU P2.2 ; 定义变量MY1,Y轴电机控制端1
MY2 EQU P2.3 ; 定义变量MY2,Y轴电机控制端2
MOTT EQU 00H ; 定义变量MOTT
ORG 00H
MAIN:
MOV P1,#0FH ; P1低位作输入端
MOV MOTT,#01H ; MOTT=01H
MMINS:
CALL MOTORR ; 调MOTORR子程序
JB LIM2,MMINS
SETB ENA ; 两个电机停止
SETB ENB
CLR MX1
CLR MX2
CLR MY1
CLR MY2
SETB SW1 ; 等待开始跟随开关被按下
JB SW1,$
NOP
JNB SW1,$
MMAIN:
SETB LDR1
SETB LDR2
SETB LIM1
SETB LIM2
JB LDR1,SD1 ; 如果光线传感器1为暗,则跳到SD1
JB LDR2,SD2 ; 如果光线传感器2为暗,则跳到SD2
JNB LIM1,MMAINS
JNB SW2,STOP ; 判断停止跟随按钮
JB LIM2,MMAIN
SETB ENA ; 两个电机停止
SETB ENB
CLR MX1
CLR MX2
CLR MY1
CLR MY2
JMP START_TRACKING
STOP:
CALL MOTORR
JB LIM2,STOP
JNB SW2,$
JMP MAIN ; 循环
SD1:
JB LDR2,SD3 ; 如果光线传感器2为暗,跳到SD3
SD4:
JB LDR1,SD4 ; 旋转直到光线传感器1为亮
JB LDR2,SD2 ; 旋转直到光线传感器2为亮
JMP START_TRACKING
SD2:
CALL MOTORL
JNB LIM1,MMAINS
JB LDR2,SD2
JB LDR1,SD1
JMP START_TRACKING
SD3:
SETB LIM1
SETB LIM2
JNB LIM1,MMAINS
JNB LDR1,MMAIN
JNB LDR2,MMAIN
JMP SD3
MMAINS:
CALL MOTORR
JB LIM2,MMAINS
SNM:
CALL DELAY
JNB LDR1,SNM
CALL DELAY
JB LDR2,SNM
JMP MMAIN
MOTORL:
MOV A,MOTT
CJNE A,#01H,XC1
MOV MOTT,#04H
CALL MOTOR_ROTATE
CALL DELAY
RET
XC1:
DEC MOTT
CALL MOTOR_ROTATE
CALL DELAY
RET
MOTORR:
MOV A,MOTT
CJNE A,#04H,XC2
MOV MOTT,#01H
CALL MOTOR_ROTATE
CALL DELAY
RET
XC2:
INC MOTT
CALL MOTOR_ROTATE
CALL DELAY
RET
START_TRACKING:
JMP MMAIN
MOTOR_ROTATE: ; X轴和Y轴电机组合运动
MOV A,MOTT
CJNE A,#01H,GB1
SETB ENA ; X轴和Y轴电机正转
SETB ENB
SETB MX1
CLR MX2
SETB MY1
CLR MY2
RET
GB1:
CJNE A,#02H,GB2
SETB ENA ; X轴电机正转Y轴电机反转
SETB ENB
SETB MX1
CLR MX2
CLR MY1
SETB MY2
RET
GB2:
CJNE A,#03H,GB3
SETB ENA ; X轴电机反转Y轴电机正转
SETB ENB
CLR MX1
SETB MX2
SETB MY1
CLR MY2
RET
GB3:
CJNE A,#04H,GB4
SETB ENA ; X轴和Y轴电机反转
SETB ENB
CLR MX1
SETB MX2
CLR MY1
SETB MY2
GB4:
RET
DELAY:
MOV R0,#45H
REP2:
MOV R1,#99H
REP1:
NOP
DJNZ R1,REP1
DJNZ R0,REP2
RET
END