;振蕩頻率接到外部定時器T0
;液晶顯示采用JMC1602C-HD44780
;鍵盤P2口獨立式按鍵
;C=1UF
;R=200
;RX=721500/F-100歐姆
;RC振蕩信號接T0(14)腳
;按下key0(P20)鍵可以保持測量數據
;============================================================
;HD44780 引腳連接
;1 GND
;2 VDD
;3 V0-GND 對比度最亮
;4 RS-P00 0寫入指令,1寫入數據
;5 RW-GND 只寫不讀,各數據指令之間延時
;6 EN-P01 下降沿寫入指令
;7 DB0
;8 DB1
;9 DB2
;10 DB3
;11 DB4-P04
;12 DB5-P05
;13 DB6-P06
;14 DB7-P07
;15 BL1
;16 BL2
;工作方式: 只寫不讀,中間延時,4位數據寬度
;[註:AT89S51使用12M晶振]
;=============================================================*/
;-------------------------------------
;LCD引腳定義
LCM_RS EQU P0.0
LCM_EN EQU P0.1
LCM_DATA EQU P0
F_INPUT_PIN EQU P1.1 ;頻率輸入腳
LED EQU P3.4
KEY0 EQU P2.0
;...........................................
;變量定義
RCAP_BUF0_H EQU 08H
RCAP_BUF0_L EQU 09H
RCAP_BUF1_H EQU 0AH
RCAP_BUF1_L EQU 0BH
FRQ_H EQU 0CH
FRQ_L EQU 0DH
DISBUF0 EQU 0EH
DISBUF1 EQU 0FH
;位定義
FLAG EQU 20H
RCAP_END_FG EQU FLAG.0
RCAP_FULL_FG EQU FLAG.1
CF_END_FG EQU FLAG.2
;------------------------------------------
T2CON DATA 0C8H
RCAP2L DATA 0CAH
RCAP2H DATA 0CBH
TL2 DATA 0CCH
TH2 DATA 0CDH
TF2 BIT 0CFH
EXF2 BIT 0CEH
RCLK BIT 0CDH
TCLK BIT 0CCH
EXEN2 BIT 0CBH
TR2 BIT 0CAH
C_T2 BIT 0C9H
CP_RL2 BIT 0C8H
;以下是主程序開始
ORG 0000H
AJMP START ;轉主程序
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
LJMP T1INT
ORG 0023H
RETI
ORG 002BH
RETI
;-------------------------------------------
ORG 0030H
START: MOV SP,#60H
;...........................................
CLR LCM_EN ;LCD_EN初始狀態0
LCALL INIT_LCD ;初始化LCD
MOV R5,#10 ;延時等待
LCALL DELAY
;...........................................
MOV A,#0 ;0行
MOV B,#0 ;0列
MOV DPTR,#TITLE ;字符串
LCALL LCD_PRN_STR ;顯示字符串"89c51 R TEST"
MOV A,#1 ;1行
MOV B,#0 ;0列
MOV DPTR,#R_INFO ;字符串
LCALL LCD_PRN_STR ;顯示字符串 "R="
SJMP $
;...........................................
;初始化LCD
;功能設定指令
;┌——————┬—————————————————————————————┬———┐
;ㄧ ㄧ 指令編碼 ㄧ 執行 ㄧ
;ㄧ 指令功能 ├——┬——┬——┬——┬——┬——┬——┬——┬——┬——┤ 時間 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├——————┼——┼——┼——┼——┼——┼——┼——┼——┼——┼——┼———┤
;ㄧ 功能設定 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 1 ㄧ DL ㄧ N ㄧ F ㄧ X ㄧ X ㄧ 40 ㄧ
;└——————┴——┴——┴——┴——┴——┴——┴——┴——┴——┴——┴———┘
;功能:設定數據總線位數、顯示的行數及字型。參數設定的情況如下:
; 位名 設置
; DL 0=數據總線為4位 1=數據總線為8位
; N 0=顯示1行 1=顯示2行
; F 0=5×7點陣/每字符 1=5×10點陣/每字符
;顯示開關控制指令
;┌——————┬—————————————————————————————┬———┐
;ㄧ ㄧ 指令編碼 ㄧ 執行 ㄧ
;ㄧ 指令功能 ├——┬——┬——┬——┬——┬——┬——┬——┬——┬——┤ 時間 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├——————┼——┼——┼——┼——┼——┼——┼——┼——┼——┼——┼———┤
;ㄧ顯示開關控制ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 1 ㄧ D ㄧ C ㄧ B ㄧ 40 ㄧ
;└——————┴——┴——┴——┴——┴——┴——┴——┴——┴——┴——┴———┘
;功能:控制顯示器開/關、光標顯示/關閉以及光標是否閃爍。參數設定的情況如下:
; 位名 設置
; D 0=顯示功能關 1=顯示功能開
; C 0=無光標 1=有光標
; B 0=光標閃爍 1=光標不閃爍
;設定顯示屏或光標移動方向指令
;┌——————┬—————————————————————————————┬———┐
;ㄧ ㄧ 指令編碼 ㄧ 執行 ㄧ
;ㄧ 指令功能 ├——┬——┬——┬——┬——┬——┬——┬——┬——┬——┤ 時間 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├——————┼——┼——┼——┼——┼——┼——┼——┼——┼——┼——┼———┤
;ㄧ設定顯示屏或ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 1 ㄧS/C ㄧR/L ㄧ X ㄧ X ㄧ 40 ㄧ
;ㄧ光標移動方向ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ
;└——————┴——┴——┴——┴——┴——┴——┴——┴——┴——┴——┴———┘
;功能:使光標移位或使整個顯示屏幕移位。參數設定的情況如下:
; S/C R/L 設定情況
; 0 0 光標左移1格,且AC值減1
; 0 1 光標右移1格,且AC值加1
; 1 0 顯示器上字符全部左移壹格,但光標不動
; 1 1 顯示器上字符全部右移壹格,但光標不動
;清屏指令
;┌——————┬—————————————————————————————┬———┐
;ㄧ ㄧ 指令編碼 ㄧ 執行 ㄧ
;ㄧ 指令功能 ├——┬——┬——┬——┬——┬——┬——┬——┬——┬——┤ 時間 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /ms ㄧ
;├——————┼——┼——┼——┼——┼——┼——┼——┼——┼——┼——┼———┤
;ㄧ 清屏 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 1 ㄧ 1.64 ㄧ
;└——————┴——┴——┴——┴——┴——┴——┴——┴——┴——┴——┴———┘
;功能:<1> 清除液晶顯示器,即將DDRAM的內容全部填入"空白"的ASCII碼20H;
; <2> 光標歸位,即將光標撤回液晶顯示屏的左上方;
; <3> 將地址計數器(AC)的值設為0。
INIT_LCD:
MOV LCM_DATA,#30H ;4位I/O初始化
LCALL EN ;寫動作
MOV R5,#2 ;延時等待
LCALL DELAY
MOV LCM_DATA,#30H ;4位I/O初始化
LCALL EN ;寫動作
MOV R5,#2 ;延時等待
LCALL DELAY
MOV LCM_DATA,#30H ;4位I/O初始化
LCALL EN ;寫動作
MOV R5,#2 ;延時等待
LCALL DELAY
MOV LCM_DATA,#20H ;4位I/O初始化
LCALL EN ;寫動作
MOV R5,#2 ;延時等待
LCALL DELAY
MOV A,#28H
LCALL WCOM
MOV R5,#1 ;延時等待;
LCALL DELAY
MOV A,#0CH
LCALL WCOM
MOV R5,#1 ;延時等待;作者:劉玉宏
LCALL DELAY
MOV A,#01H ;顯示清屏
LCALL WCOM
MOV R5,#1 ;延時等待
LCALL DELAY
RET
;-----------------------------------------------------------------
;產生下降沿用於寫命令;
EN:
SETB LCM_EN
LCALL DE
CLR LCM_EN
LCALL DE
RET
;-----------------------------------------------------------------
DE:
MOV R7,#10
DJNZ R7,$
RET
;-----------------------------------------------------------------
;寫命令
;參數傳遞A;
WCOM:
PUSH B
MOV B,A ;A暫存
ANL A,#0F0H ;清除低4位,保持LCD_EN為0
MOV LCM_DATA,A;寫高4位
CLR LCM_RS ;寫命令LCM_RS=0
LCALL EN ;寫動作
MOV A,B ;取出保存的參數
RLC A
RLC A
RLC A
RLC A ;4位方式先寫高4位,再寫低4位
ANL A,#0F0H ;清除低4位,保持LCD_EN為0
MOV LCM_DATA,A
CLR LCM_RS ;寫命令LCM_RS=0
LCALL EN ;寫動作
POP B
RET;、
;--------------------------------------------------------------------
;-----------------------------------------------------------------
;寫數據
;參數傳遞A
WDATA:
PUSH B
MOV B,A ;A暫存
ANL A,#0F0H ;清除低4位,保持LCD_EN為0
MOV LCM_DATA,A
SETB LCM_RS ;寫數據LCM_RS=1
LCALL EN ;寫動作
MOV A,B ;取出保存的參數
RLC A
RLC A
RLC A
RLC A ;4位方式先寫高4位,再寫低4位
ANL A,#0F0H ;清除低4位,保持LCD_EN為0
MOV LCM_DATA,A
SETB LCM_RS ;寫數據LCM_RS=1
LCALL EN ;寫動作
POP B;
RET
;--------------------------------------------------------------------
;延時R5*10MS
DELAY:
MOV R6,#50
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;--------------------------------------------------------------------
;在第0行指定位置顯示字符
;參數A顯示字符的ascii碼,B顯示的位置
LCDP0:
PUSH ACC
MOV A,B
;設定DDRAM地址指令
;┌——————┬—————————————————————————————┬———┐
;ㄧ ㄧ 指令編碼 ㄧ 執行 ㄧ
;ㄧ 指令功能 ├——┬——┬——┬——┬——┬——┬——┬——┬——┬——┤ 時間 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├——————┼——┼——┼——┼——┴——┴——┴——┴——┴——┴——┼———┤
;ㄧ設定CGRAM ㄧ 0 ㄧ 0 ㄧ 1 ㄧ DDRAM的地址(7位) ㄧ 40 ㄧ
;ㄧ 地址 ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ
;└——————┴——┴——┴——┴————————————————————┴———┘
;功能:設定下壹個要存入數據的CGRAM的地址。
;DDRAM地址與顯示位置的對應關系;作者:劉玉宏
;╭┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
;┊ ┊
;┊00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH ┊
;┊ ┊
;┊40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH ┊
;┊ ┊
;╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
ADD A,#80H ;第壹行地址
LCALL WCOM
POP ACC ;數據
LCALL WDATA
RET
;--------------------------------------------------------------------
;在第1行指定位置顯示字符
;參數A顯示字符的ascii碼,B顯示的位置
LCDP1:
PUSH ACC
MOV A,B
;設定DDRAM地址指令
;┌——————┬—————————————————————————————┬———┐
;ㄧ ㄧ 指令編碼 ㄧ 執行 ㄧ
;ㄧ 指令功能 ├——┬——┬——┬——┬——┬——┬——┬——┬——┬——┤ 時間 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├——————┼——┼——┼——┼——┴——┴——┴——┴——┴——┴——┼———┤
;ㄧ設定CGRAM ㄧ 0 ㄧ 0 ㄧ 1 ㄧ DDRAM的地址(7位) ㄧ 40 ㄧ
;ㄧ 地址 ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ
;└——————┴——┴——┴——┴————————————————————┴———┘
;功能:設定下壹個要存入數據的CGRAM的地址。
;DDRAM地址與顯示位置的對應關系
;╭┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
;┊ ┊
;┊00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH ┊
;┊ ┊
;┊40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH ┊
;┊ ┊
;╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
ADD A,#0C0H ;第二行地址
LCALL WCOM
POP ACC ;數據
LCALL WDATA
RET
;--------------------------------------------------------------------
;在指定位置顯示壹行字符串(以0結尾),不檢查是否超長,沒有考慮空格覆蓋以後的內容
;參數A行,B列,DPTR字符串指針
LCD_PRN_STR:
CJNE A,#0,LINE2
LINE1:
MOV A,B
ADD A,#80H ;第0行地址;
LCALL WCOM
LJMP FILL
LINE2:
MOV A,B
ADD A,#0C0H ;第1行地址
LCALL WCOM
LJMP FILL
FILL:
CLR A
MOVC A,@A+DPTR
CJNE A,#0,L1
RET
L1:;
LCALL WDATA
INC DPTR
AJMP FILL
;--------------------------------------------------------------------
TITLE: DB '89C51 R TEST',0
R_INFO: DB 'R=',0
;--------------------------------------------------------------------
END