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

📄 testlcd.asm

📁 用C8051F020读写液晶的程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;未切换工作寄存器区,R0固定传递显示数据的起始地址
;DPTR除几个中间状态外,主要用于传递当前页的字符串的起始地址

;*****************************************
;设置 LCD
SET_LCD:LCALL  K50MS;           延时50ms
        MOV A,#30H      ;设置为8位控制界面
	ACALL WRCMD
	MOV A,#30H      ;
	ACALL WRCMD
	MOV A,#0CH      ;开整体显示
	ACALL WRCMD
	MOV A,#01H      ;清显示
	ACALL WRCMD
	MOV A,#06H      ;初始化原点
	ACALL WRCMD
;   MOV A,#0FH      ;开显示 FLASH
;	MOV A,#0EH      ;NO FLASH
	ACALL  WRCMD;

	RET;
;*****************************************
;写指令
WRCMD: MOV P2,#0DCH        ;写入指令
	MOV  R1,#0FFH;
	MOVX @R1,A;从硬件上保证了写信号的作用
	LCALL  DLY00	;延时

	RET
;*****************************************
;写数据
WRDATA:MOV  P2,#0DDH;
	MOV  R1,#0FFH;
	MOVX  @R1,A;
	LCALL  DLY00;

	RET
DLY00:
      MOV  DLY3,#00H;
      DJNZ  DLY3,$;
      RET;

;***********************************
;显示字符串,字符串以0结尾
; DPTR = 要显示字符串的地址
STR2BUFF:
        PUSH    DPH;
        PUSH    DPL;
        MOV     R0,#DISPBUFF;
FILL:	CLR 	A
	MOVC 	A,@A+DPTR
	CJNE 	A,#00H,LC1
        POP    DPL;
        POP    DPH;
	RET
LC1:	MOV    @R0,A;
        INC    R0;
	INC 	DPTR
	SJMP 	FILL

;****************************************
;键盘检测A中为返回键值
KEY:    MOV   PSW,#00H
        MOV   P1,#0FFH
	ANL   P1,#0FCH;列输入送0
	MOV   A,P1;读取行输出
	ANL   A,#1CH;消除不相关位的干扰
	XRL   A,#1CH;将行输出位取反

	JZ    KEY
	CLR   P1.0
	SETB  P1.1
	MOV   A,P1
	ANL   A,#1CH
	XRL   A,#1CH
	JZ    KEY0
        ACALL DLY15ms	;消抖
	JNB   P1.4,KEY1   ;S1键
	JNB   P1.3,KEY3   ;S3键
	JNB   P1.2,KEY5   ;S5键
KEY0:   SETB P1.0
	CLR   P1.1
	MOV   A,P1
	ANL   A,#1CH
	XRL   A,#1CH
	JZ    KEY
        ACALL DLY15ms	;消抖
	JNB   P1.4,KEY2   ;S2键
	JNB   P1.3,KEY4   ;S4键
	JNB   P1.2,KEY6   ;S6键
	SJMP  KEY

KEY1:MOV  A,#01H;
     JNB  P1.4,$    ;等待按键抬起
     MOV  P1,#0FFH
     RET

KEY2:MOV  A,#02H
     JNB  P1.4,$    ;等待按键抬起
     MOV  P1,#0FFH
     RET;
KEY3:MOV  A,#03H
     JNB  P1.3,$
     MOV  P1,#0FFH
     RET

KEY4:MOV  A,#04H
     JNB  P1.3,$
     MOV  P1,#0FFH
     RET

KEY5:MOV  A,#05H
     JNB  P1.2,$
     MOV  P1,#0FFH
	 RET
KEY6:MOV  A,#06H
    JNB   P1.2,$
    MOV   P1,#0FFH
	RET

DLY15ms:MOV DLY1,#14H    ;0.015ms
	MOV   DLY2,#00H
KTIM1:DJNZ DLY2,KTIM1
    DJNZ   DLY1,KTIM1
	ret;

K50ms:  MOV DLY1,#00H    ;50ms
	MOV DLY2,#00H
KTIM2:  DJNZ DLY2,KTIM2
        DJNZ DLY1,KTIM2
	RET




Init_1820:
          SETB WDDATA   ;按照时序拉高P3.0
          NOP            ;延时一个机器周期1微秒
          CLR WDDATA   ;拉低数据线
          MOV R5,#36
          LCALL Delay ;调用延时子程序,发出一个540微秒的低脉冲
          SETB WDDATA  ;再次拉高数据线
          NOP
          NOP
          MOV R0,#36
     TZ2: JNB WDDATA,TZ3 ;运行36次跳转指令,等待72微秒,其间收到低脉冲,证明18B20存在,否则不存在
          DJNZ R0,TZ2
          LJMP TZ4
     TZ3: SETB exist1820 ;收到低脉冲,标志位置高,证明18B20存在
          LJMP TZ5
     TZ4: CLR  exist1820 ;没有低脉冲反馈,证明18B20没有连接上,标志位置低
          LJMP TZ7 ;TZ7将P3.0拉高
     TZ5: MOV R0,#06EH ;复位成功,按照时序延时240微秒
     TZ6: DJNZ R0,TZ6
     TZ7: SETB WDDATA
          ret;


;540微秒延时
Delay:
 LOOP:MOV R4,#06H
 LOOP1:DJNZ R4,LOOP1
      DJNZ R5,LOOP
      ret;


;读出转化后温度值的子程序
GetTemp:
	setb  WDDATA;		  //定时入口
	lcall Init_1820;	  //运行前先复位
        jnb  exist1820,gettempend;	 //如果检测到18B20存在,跳到退出
        mov   A,#0cch;
        lcall Write1820;	 //调用SKIP ROM命令
        mov   A,#044h;
        lcall Write1820;	 //调用CONVERT命令,一定要先执行ROM命令再执行RAM命令
        MOV R5,#50 ;             //根据时序要求延时750微秒等待A/D转换结束
        LCALL Delay;
 	lcall Init_1820;	//在读温度值前先复位
        mov  A,#0ccH;
	lcall Write1820;       //每下一个命令都要调用写程序写入
        mov  A,#0BEH;
        lcall Write1820;
        lcall Read1820;
        mov tempL,A;         //低位数
        lcall Read1820;
	mov tempH,A;       //高位数
gettempend:
        ret;

Write1820:
;程序入口为ACC
;写温度子程序
 	    MOV R2,#8 ;//一个字节共8位
            CLR C ;//清空进位位
   wr18201: CLR WDDATA ;//拉低总线
            MOV R3,#8
            DJNZ R3,$ ;//18B20开始工作,对数据进行采样,等待1
	    RRC A ;
            MOV WDDATA,C ;//命令字按位依次送给18B20
            MOV R3,#32
            DJNZ R3,$ ;//保证写过程持续在60微秒?
            SETB WDDATA
	    NOP
            DJNZ R2,WR18201 ;//未写完一个字节的话继续进行
            SETB WDDATA

            ret;
;读温度子程序,可以读出9个8位数据,分别存入以60H开始的9个地址内
Read1820:
       RE0: MOV R2,#8 ;//数据共有8位
       RE1: CLR C
            SETB WDDATA
            NOP
            NOP ;//
            CLR WDDATA
            NOP
            NOP
            NOP ;//保持低电平2微秒
            SETB WDDATA ;//
            MOV R3,#09
       RE2: DJNZ R3,RE2 ;//等待9微秒,让字节传来
            MOV C,WDDATA ;//主机按位依次读入18B20数据
            MOV R3,#24
       RE3: DJNZ R3,RE3
            RRC A ;//读取数据移入A
            DJNZ R2,RE1
            NOP;
            NOP;
            NOP;
            SETB WDDATA
            ret;        返回数据在A中

;温度计算子程序
;整数部分则把61H低四位变为60H高四位,60H原来的高四位变做低四位。如果温度为负则取反即可
Calculate:  MOV A,tempL
            ANL A,#0F0H ;//取dispbuff1高四位
            swap a
            MOV R5,A
            MOV A,tempH
            ANL A,#0FH ;//取dispbuff2低四位
            swap a
            ORL A,R5 ;//或得到一个新字节
            MOV calbuff1,A ;//存入整数部分低位
            MOV A,tempH
            ANL A,#80H ;//取温度高位上最高位,因为dispbuff2 前5位如果是1,温度为负,?
            jnb acc.7,ZHENG ;//如果是0,温度为正,跳转
            MOV A,calbuff1 ;//如果是1,温度为负
            CPL A ;//温度值取反
	    INC A
            MOV tempsign,#10 ;//给符号位赋值"-"
            MOV calbuff1,A
            sjmp   endCalcul;
      ZHENG:MOV tempsign,#00H ;//给符号位赋值"0"
endCalcul:
            ret;

;*****************************************
;数据转换,将A中的数据转化为三位BCD码,送显示
CONV:
        MOV   B,#100;
        DIV   AB;
        ADD   A,#30H;
        LCALL  WRDATA;

        MOV   A,B;
	MOV   B,#10 ;分离十位和个位
 	DIV   AB;A中为十位,B中为个位
        ADD   A,#30H
	LCALL  WRDATA;

	MOV   A,B;
	ADD   A,#30H;
	LCALL  WRDATA;

	MOV   A,#":";
	LCALL  WRDATA;

	RET

printinit:
        mov  bianhao,#00h;
        mov  bianhao+1,#00h;
        mov  bianhao+2,#02h;

        mov  weight,#25h;
        mov  weight+1,#63h

        mov  price,#69h;
        mov  price+1,#00h;

        mov  shuliang,#05h;

        mov  zongjia,#99h;
        mov  zongjia+1,#00h;

        mov  year,#08h;
        mov  month,#09h;
        mov  day,#09h;

        mov  hour,#22h;
        mov  minute,#03h;
        mov  second,#26h;

        ret;

        END



⌨️ 快捷键说明

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