仪器社区

51单片机---------基于简单IO口的LCD显示频率计设计

留心851 2013-12-04
求报告!!!
评论
全部评论
久川蹄市
BEEP BIT P3.7
LCD_RS BIT P2.0
LCD_RW BIT P2.1
LCD_EN BIT P2.2
LCD_X EQU 3FH ;LCD 地址变量 TIMER_H EQU 30H ;定时器高位字节单元
TIMER_L EQU 31H ;定时器低位字节单元
TIMCOUNT EQU 32H ;时间中断数
INT_G EQU 35H ;中断计数缓冲单元高地址
INT_H EQU 34H ;中断计数缓冲单元中地址
INT_L EQU 33H ;中断计数缓冲单元低地址
T_S EQU 36H ;数据显示低位
T_M EQU 37H ;数据显示中位
T_H EQU 38H ;数据显示高位
T_G EQU 39H ;数据显示Z高位;----------------------------------------------------------
ORG 0000H
JMP MAIN ;主程序开始
ORG 000BH
JMP TIMER_INT ;定时器T0中断服务程序
ORG 001BH ;定时器T1中断服务程序
JMP TIMER1
ORG 0030H
;----------------------------------------------------------
MAIN:
MOV SP,#60H ;设置SP指针
LCALL PRO_SET ;初始化
CALL SET_LCD
LCALL TIM_T0
;-----------------------------------------------------------
;LCD1602是慢速显示器件,故100MS显示一次。
;-----------------------------------------------------------
MAIN1:
MOV R5,40
MAIN2:
ACALL DELAY1 ;3ms
DJNZ R5,MAIN2
ACALL SBIN_SBCD
CALL CONV
JMP MAIN1
;------------------------------------------------------------
;T1计数器中断服务子程序
;计T1计数器溢出次数
;------------------------------------------------------------
TIMER1:
INC 2AH
RETI
;------------------------------------------------------------
;初始化程序
;------------------------------------------------------------
PRO_SET: MOV A,#00H
MOV B,#00H
MOV 2AH,A
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV INT_H,#00H
MOV INT_L,#00H
MOV INT_G,#00H
MOV T_S,#00H
MOV T_H,#00H
MOV T_M,#00H
MOV T_G,#00H
MOV TIMCOUNT,#00H
MOV TIMER_H,#04CH ;定时 50 MS
MOV TIMER_L,#10H ;
CLR BEEP
SETB P3.5 ;P3.5端口置输入状态
RET ;T1(TIMER1的外部输入脚)
;-----------------------------------------------------
;LCD 初始化设置
;-----------------------------------------------------
SET_LCD:
CLR LCD_EN
CALL INIT_LCD ;初始化 LCD
CALL DELAY1
MOV DPTR,#INFO1 ;指针指到显示信息1
MOV A,#1 ;显示在diyi行
CALL LCD_SHOW
MOV DPTR,#INFO2 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_SHOW
RET
;-----------------------------------------------------
INFO1: DB " CYMOMETER ",0 ;LCD diyi行显示信息
INFO2: DB "FREQ: HZ ",0 ;LCD 第二行显示信息
;-----------------------------------------------------
;LCD 接口初始化
;8位I/O控制
;-----------------------------------------------------
INIT_LCD:
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#0CH ;开显示,关光标,
CALL WCOM
CALL DELAY1
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM
CALL DELAY1
RET
;----------------------------------------------------
LCD_SHOW: ;在LCD的diyi行或第二行显示信息字符 CJNE A,#1,LINE2 ;判断是否为diyi行
LINE1: MOV A,#80H ;设置 LCD 的diyi行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的diyi行地址
CALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1: CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;---------------------------------------------------
CLR_LINE: ;清除该行 LCD 的字符
MOV R0,#24
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;-----------------------------------------------------
; 写指令、数据使能子程序
;-----------------------------------------------------
ENABLE: ;写指令使能
CLR LCD_RS ;RS=L,LCD_RW=L,D0-D7=指令码,E=高脉冲
CLR LCD_RW
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RET
ENABLE1: ;写数据使能
SETB LCD_RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲
CLR LCD_RW
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RETDELAY0: MOV R7,#250 ;延时500微秒
DJNZ R7,$
RET
;----------------------------------------------------
;写入命令子程序
;----------------------------------------------------
WCOM: ;以8位控制方式将命令写至LCD
MOV P0,A ;写入命令
CALL ENABLE
RET
;----------------------------------------------------
;写入数据子程序
;----------------------------------------------------
WDATA: ;以8位控制方式将数据写至LCD
MOV P0,A ;写入数据
CALL ENABLE1
RET
;---------------------------------------------------
;在 LCD 第二行显示字符
;A=ASC DATA, B=LINE X POS
;---------------------------------------------------
LCDP2: ;在LCD的第二行显示字符
PUSH ACC ;
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
13 0 2013-12-05 0条评论 回复
您可能感兴趣的社区主题
加载中...
发布 评论