⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text2.asm

📁 12864+图形温度计+ds1302+ds18b20+矩阵键盘
💻 ASM
字号:

;********************************************************************************
     RS EQU p2.0;液晶接口的定义
     RW EQU p2.1;
     E EQU p2.2;
     HOUR EQU 31H;小时定义
     MIN EQU 32H;分定义
     SEC EQU 33H;秒定义
     X EQU 35H;LCD存放地址
     K1 BIT P2.4
     K2 BIT P2.5
     K3 BIT P2.6
     K4 BIT P2.7
     WLED EQU P3.7;LED控制位
;=====================================================================================     
      org 0000h; 原程序其始地址
      LJMP MAIN
      ORG 000BH ; TO定时器的中断入口地址
      LJMP INTT0
;=======================================================================================      
 ;LCD初始化设置
 ;================================================================
      org 0025h ;主程序入口地址   
MAIN: MOV SP ,#70H;设置堆栈
      MOV p0,#01H ;清屏
      CALL ENABLE ; 写入指令
      MOV p0,#38H ;功能设置
      CALL ENABLE
      MOV p0,#0CH ;显示开关控制
      CALL ENABLE
      MOV p0,#06H ;+1;AC地址计数器自动加一
      CALL ENABLE
;=======================================================================================
;LCD查表显示和定时器初始化
;=======================================================================================
SET_LCD:              
      MOV DPTR,#TABLE1; 查表显示1
      MOV 30H,#1
      LCALL WRITE1;   LCD显示输出
      MOV DPTR,#TABLE2; 查表显示2
      MOV 30H,#2
      LCALL WRITE1   ;LCD显示输出
      LCALL INTT     ;变量初始化
      LCALL INTT_TIME ;TO定时器初始化
;MOV p0,#80H;第一行的开始位置
;cALL ENABLE
;MOV DPTR,#TABLE1;显示
;CALL WRITE1;到TABLE1取码
;MOV p0,#0C0H;第二行的位置
;CALL ENABLE
;MOV DPTR,#TABLE2;显示
;CALL WRITE1;到TABLE2 取码
;MOV p0,#0C2H;光标定位0C0H
      ;CALL ENABLE
  AA:SJMP AA     ;等待中断
;===========================================================================================
;键盘扫描
;====================================================================================
LOP:  JB K1,L1   ;键盘扫描子程序
       lcall BUSY ;是否为忙的子程序 
       LCALL LED_BL ;LED闪烁表示工作状态
       MOV DPTR,#MADJ ;查表显示
       MOV 30H,#1
       LCALL WRITE1
       LCALL SET_TIME; 设置时间
     ; INC HOUR
      ;MOV 50H,HOUR
      ;MOV A,50H
      ;CJNE A,#24,LOP1
      ;CLR HOUR
       Jmp LOP
L1:    JB K2,L2
      ;INC MIN
      ;MOV 51H,MIN
      ;MOV A,MIN
      ;CJNE A,#60,LOP1
      ;CLR MIN
       JMP LOP
L2:    JB K3,L3 ;K3键保留未做任何动作
       JNB K3,$
      ;INC SEC
      ;MOV 52H,SEC
      ;MOV A,52H
      ;CJNE A,#60H,LOP1
      ;CLR SEC
       JMP LOP
L3:    JB K4,L4   
       JMP LOP
L4:   ;JMP LOP1
LOP1:   RET
;================================================================================================
;写入指令
;============================================================
ENABLE: CLR RS ;送命令 ;写入指令
        CLR RW ;写入数据
        CLR E ;写入数据
        CALL DELAY
        SETB E
        RET
;================================================================================================
;查表输出显示
;=============================================================================
WRITE1: MOV A,30H ;LCD二行输出的查表显示
        CJNE A,#1,LINE2
LINE1:  MOV P0,#80H ;LCD第一行显示的首地址	
        LCALL ENABLE ; 写入指令
        AJMP XX
LINE2:  MOV P0,#0C0H ;LCD第二行显示的首地址
        LCALL ENABLE ; 写入指令
XX:     MOV R1,#00H ;显示table中的值
A1:     MOV A,R1;到table取码
        MOVC A,@A+DPTR
        call wRITE2 ;显示到lcd
        INC R1
        CJNE A,#00H,A1 ;是否到00h
        RET
WRITE2: MOV p0,A ;显示
        SETB RS ;写入数据
        CLR RW  ;写入数据
        CLR E   ;写入数据
        CALL DELAY ;短延时产生户用信号
        SETB E  ;写入地址
        RET
;===================================================================================================     
DELAY:  MOV R3,#5;  2.5MS延时
D1:     MOV R7,#0FFH
        DJNZ R7,$
        DJNZ R3,D1
	RET
;=================================================================================================
table1: db" CHINA--DA SHUN ",00H
table2: db"ZHE BIAN JI ",00H
MADJ:   DB"K2:H K3:M K4:OK",00H
;==================================================================================================
;工作灯闪烁表示LCD程序运行
;===========================================================================
LED_BL: MOV R4,#4 ; LED闪烁四次
LEO:    CPL WLED
        MOV R5,#100;MOV R5,#100
LEO1:   LCALL DELAY
        DJNZ R5,LEO1
        DJNZ R4,LEO
        RET
;===================================================================================================
;时,分,秒的初始化
;====================================================================================================
INTT:   MOV SEC,#0;  变量初始化
        MOV MIN,#0
        MOV HOUR,#12
        RET
;====================================================================================================
;K2小时加一,K3分钟加一,K4为正常走时
;===================================================================================
SET_TIME:      ;     设置时间;K1键设置时间
        CLR TR0
        MOV SEC,#0
S0:     JB K2,S1 ;   K2键加时
        JNB K2,$
        INC HOUR
        MOV A,HOUR
        CJNE A,#24,S11
        MOV HOUR,#0
S11:    LCALL BUSY  ;检查忙
        mov p0,#01h ;清除屏幕,这条指令是能否显示的关键
	lcall ENABLE;写入指令
        CALL CONV  ;时钟显示
        MOV R5,#25  
S111:   LCALL DELAY
        DJNZ R5,S111 
        JMP S0
S1:     JB K3,S2 ;   K3键加分
        JNB K3,$
        INC MIN
        MOV A,MIN
        CJNE A,#60,S21
        MOV MIN,#0
S21:    LCALL BUSY
        mov p0,#01h ;清除屏幕,这条指令是能否显示的关键
	lcall ENABLE;写入指令
        LCALL CONV
        MOV R5,#20
S211:   LCALL DELAY
        DJNZ R5,S211 
        JMP S0
S2:     JB K4,S0;   K4恢复走时
        JNB K4,$
        LCALL LED_BL
        SETB TR0
        RET
;=======================================================================================
;时钟的液晶显示
;=========================================================================================
CONV:   MOV A,HOUR ; 时钟显示
        MOV X,#5
        LCALL SHOW_DIG2; 转化为字符并显示
        INC X
        MOV A,#":"
        MOV B,X
        LCALL LCDP2   ;显示地址程序
        MOV A,MIN
        INC X
        LCALL SHOW_DIG2
        ;INC X
        ;LCALL SHOW_DIG2
        INC X
        MOV A,#":"
        MOV B,X
        LCALL LCDP2
        MOV A,SEC
        INC X
        LCALL SHOW_DIG2
        RET
SHOW_DIG2:MOV B,#10 
         DIV AB     ;A为时位,B为个位
	 ADD A,#30H;  转换为字符
	 PUSH B  ;   保护B的数据
	 MOV B,X
	 LCALL LCDP2;  确定A的显示地址
	 POP B
	 MOV A,B
	 ADD A,#30H
	 INC X
	 MOV B,X
	 LCALL LCDP2
	 RET
;===================================================================================
;ADD A,#0C0H 应该在液晶的第二行首地址,可显示时却在第一行??????????
;========================================================================================
LCDP2:   PUSH ACC; 保护A的数据
         MOV A,B 
         ADD A,#0C0H ;第二行的首地址
         LCALL WCOM; 写入指令
         POP ACC 
         LCALL WDATA ;写入数据
         RET
 WCOM:   CLR RS ;送命令 写入指令
         CLR RW ;写入数据
         CLR E ;写入数据
         CALL DELAY;2.5MS
         SETB E ;写入地址
         RET
WDATA:  MOV p0,A ;显示 写入数据显示
        SETB RS ;写入数据
        CLR RW  ;写入数据
        CLR E   ;写入数据
        ;rlc A
         RLC A
         RLC A
         RLC A
	 RLC A
         MOV P0,A
         SETB RS ;写入数据
         CALL DELAY ;短延时;2.5MS
         CLR E  ;写入数据
         RET
;====================================================================================================  
DE:     MOV R6,#5
        DJNZ R6,$
        RET
EN1:    SETB E
        LCALL DE
        CLR E
        LCALL DE
        RET
;====================================================================================================== 
;TO工作方式0 ,10MS定时 便于键盘扫描
;===========================================================================================
INTT_TIME:MOV TMOD,#01H ; TO的定时方式一
          MOV IE,#10000010B
	  MOV TH0,#0D8H;延时10MS;10MS便于键盘扫描
          MOV TL0,#0F0H
  	  SETB TR0
	  RET
 ;====================================================================================================
;如何定时来解决液晶闪烁的问题呢?????
;======================================================================================= 
INTT0:    PUSH ACC
          MOV TH0,#0D8H
          MOV TL0,#0F0H
          INC 40H
          MOV A,40H
          CJNE A,#10,TT;定时100MS;CJNE A,#100,TT;这里的1S又该怎么设置?????
          MOV 40H,#0
          CPL WLED
          INC SEC
          MOV A,SEC
          CJNE A,#60,TT
          INC MIN
          MOV SEC,#0
          MOV A,MIN
          CJNE A,#60,TT
          INC HOUR 
          MOV MIN,#0
          MOV A,HOUR
          CJNE A,#24,TT
          MOV SEC,#0
          MOV MIN,#0
          MOV HOUR,#0
TT:       ;MOV P0,#01H;
          ;LCALL ENABLE;
	  ;MOV p0,#06H ;+1;AC地址计数器自动加一
          ;CALL ENABLE
          LCALL LOP  ;键盘扫描;当无键按下时
          LCALL BUSY ; 检查忙
	  mov p0,#01h;清除屏幕,这条指令是能否显示的关键
	  lcall ENABLE;写入指令
	  LCALL CONV; 显示输出;5MS;这里的5MS是否为影响1S定时的呢 与 键盘的扫描时间???????????
;=======================================================================================
;延时稳定液晶显示画面  在CONV中有25MS+5MS的时间了,这是否会影响1S定时????
;===========================================================================================
          MOV R5,#20;25MS  在CONV中有25MS+5MS的时间了,这是否会影响1S定时?????
S51:      LCALL DELAY;
          DJNZ R5,S51;
;======================================================================================
	  POP ACC  
          RETI
;=======================================================================================
;液晶是否为忙
;===================================================================================
BUSY:     MOV P0,#0FFH ;判断液晶显示器是否为忙的子程序; 这是液晶显示中最重要的一条指令
          CLR RS ;写入指令 
          SETB RW; 读取数据
          CLR E; 写入数据
          NOP 
          SETB E ;写入地址 
          JB P0.7,BUSY ;如果P0.7为高电平表示忙就循环等待
          RET      
          end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -