精华内容
下载资源
问答
  • LCD12864
    ; created by perry.peng 2012/7/12
    delay5us:   acall delay2us
                nop
                nop
                ret                         ; ACALL + RET = 4 cycles,  total 8 cycles.
    
    delayTas:   acall delay2us
                nop
                ret
    
    delayTd:    acall delay2us
                acall delay2us
                ret
    
    delayTpw:   acall delay5us
                acall delay5us
                acall delay5us
                acall delay5us
                acall delay5us
                acall delay2us
                nop
                ret
    
    delay50us:  push  0
                mov   r0, #9
    repWx:      acall delay5us
                djnz  r0, repWx
                pop   0
                acall delay2us
                ret
    
    delay1ms:   push  0
                mov   r1, #10
    repWy:      acall delay50us
                djnz  r1, repWy
                pop   0
                acall delay2us
                ret
    
    reset:      clr   RST
                mov   r1, #100
    repWz:      acall delay50us
                djnz  r1, repWz
                setb  RST
                ret
    
    init:       clr   EP
                setb  PSB                   ; use paralell mode.
                acall reset
                lcall delay1ms
    
                mov   a, #0x30              ; 功能设定, b0011xRxx, R=1扩充指令集动作
                lcall wcmd
                lcall delay1ms
    
                mov   a, #0x08              ; 显示状态(b00001DCB), D=0整体显示OFF, C=1游标ON, B=1游标位置ON
                lcall wcmd
                lcall delay1ms
    
                mov   a, #0x01              ; 清除显示(b00000001), 将DDRAM填满20H, DDRAM的地址计数器(AC)到00H
                lcall wcmd
                lcall delay1ms
    
                mov   a, #0x02              ; 地址归位(b0000001x), D=0整体显示OFF, C=1游标ON, B=1游标位置ON
                lcall wcmd
                lcall delay1ms
    
                mov   a, #0x06              ; 进入点(b000001IS), 指定在资料的读取与写入时,设定游标移动方向及指定显示的移位
                lcall wcmd
                lcall delay1ms
    
                mov   a, #0x80              ; 设定DDRAM地址(b1xxxxxxx), xxxxxxx = 7bit address.
                lcall wcmd
                lcall delay1ms
    
                mov   a, #0x40              ; 设定CGRAM地址(b01xxxxxx), xxxxxx = 6bit address.
                lcall wcmd
                lcall delay1ms
    
                mov   a, #0x0c              ; 显示状态(b00001DCB), D=1整体显示ON, C=1游标ON, B=1游标位置ON
                lcall wcmd
                lcall delay1ms
    
                ret
    
    ready:      clr   RS
                setb  RW
                lcall delayTas
                setb  EP
                lcall delayTd
                mov   a, P0
                lcall delayTpw
                clr   EP
                lcall delayTpw
                jb    BSY, ready
                ret
    
    rcmd:       clr   RS
                setb  RW
                lcall delayTas
                setb  EP
                lcall delayTd
                mov   a, P0
                lcall delayTpw
                clr   EP
                lcall delayTpw
                ret
    
    rdat:       ;lcall ready
                setb  RS
                setb  RW
                lcall delayTas
                setb  EP
                lcall delayTd
                mov   a, P0
                lcall delayTpw
                clr   EP
                lcall delayTpw
                ret
    
    wcmd:       ;lcall ready
                clr   RS
                clr   RW
                mov   P0, a
                lcall delayTas
                setb  EP
                lcall delayTpw
                clr   EP
                lcall delayTpw
                ret
    
    wdat:       ;lcall ready
                setb  RS
                clr   RW
                mov   P0, a
                lcall delayTas
                setb  EP
                lcall delayTpw
                clr   EP
                lcall delayTpw
                ret
    
    setpz:      mov   r6, #0x80     ; a = x(0 ~ 127), dpl = y(0 ~ 32), dph = p(0 | ~0)
                jnb   A05, LN32R
                orl   6, #0x08
    LN32R:      anl   a, #0x1f
                orl   a, #0x80
                lcall wcmd          ; row addr.
    
                mov   a, dpl
                anl   a, #0x7f
                mov   b, #16
                div   ab
                orl   a, r6
    writeX:     lcall wcmd          ; column addr.
    
                clr   a
                lcall wdat
                lcall wdat
                lcall delay1ms
                lcall delay1ms
                lcall delay1ms
                lcall delay1ms
                lcall delay1ms
                ret
    
    clear:      ;mov   a, #0x36              ;
                ;lcall wcmd
    
                mov   a, r0
                setb  A07
                lcall wcmd
    
                mov   a, r1
                orl   a, #0x88
                lcall wcmd
    
                ret
    
    refresh:    mov   a, #0x36              ;
                lcall wcmd
    
                mov   dpl, #0x00
                mov   dph, #0x00
    
                mov   r0, #0x80
    drawR:      mov   r1, #0x80
    drawC:      mov   a, r0
                anl   a, #0x9f
                lcall wcmd                  ; 写入行地址(0 ~ 0x1f),
    
                mov   b, r1
                mov   a, r0                 ; 判断是否是高半屏
                jnb   A05, drawH            ; 超过32为高半屏部分。
                orl   b, #0x08              ; 高半屏的列地址
    drawH:      mov   a, b                  ; 列地址。
                lcall wcmd
                
                push  0
                
                mov   a, dpl
                ;orl   a, #0x80
                mov   r0, a
                movx   a, @r0
                lcall wdat
                inc   dpl
    
                mov   a, dpl
                ;orl   a, #0x80
                mov   r0, a
                movx   a, @r0
                lcall wdat
                inc   dpl
    
                pop   0
    
                inc   r1
                cjne  r1, #0x88, drawC
                inc   r0
                cjne  r0, #0xc0, drawR
    
                mov   a, #0x30              ;
                lcall wcmd
                ret
    
    .area CSEG    (CODE)
    .area CONST   (CODE)
    str_ready:
                .ascii "Ready!!!"
                .db 0x0d, 0x0a, 0x00
    str_invalid_cmd:
                .ascii "ERROR: ERR_ILLEGAL_FUNCTION."
                .db 0x0d, 0x0a, 0x00
    .area XINIT   (CODE)
    .area CABS    (ABS,CODE)

    展开全文
  • 51单片机控制汇编指令控制LCD1602,显示字符,包含proteus仿真图及程序设计。
  • stc51.52单片机驱动LCD1602的汇编代码,各位有兴趣的大佬可以看一下。
  • 汇编语言编写的51单片机LCD1602液晶实验代码,适合初学者。
  • 采用汇编程序利用温度传感器完成温度的采集和显示 包含LCD显示 温度模块以及相关的程序思路 适用于单片机课程设计
  • 基于单片机LCD的带时钟万年历,使用时钟芯片SD3088,带农历显示、可调闹钟。汇编语言编写
  • 8.ASM8_LCD1602: LCD1602显示字符串 (注意代码显示不全,最下面有Keil源码和Proteus工程) /** ****************************************************************************** * @file LCD1602.asm * @...

    8.ASM8_LCD1602:    LCD1602显示字符串

    (注意代码显示不全,最下面有Keil源码和Proteus工程)

    /**
    ******************************************************************************
    *   @file      LCD1602.asm
    *   @author    Alex——小白
    *   @version   V1.0
    *   @date      2019.9.1
    *   @brief     LCD显示字符串
    *   @store     Proteus仿真店子
    *   @Link      https://shop484534014.taobao.com/
    *   @Email     844545015@qq.com
    ******************************************************************************
    *   @attention  All Rights Reserved  
    **/
    
        LcdRs   BIT    P2.0  ;引脚定义  
        LcdRw   BIT    P2.1
        LcdEn   BIT    P2.2
    
        ORG     0000H      ;程序执行的起始地址        
        LJMP    Main      ;跳转到main函数
    
        ORG     0100H      ;程序跳转到0100H开始执行
      Main:    
        MOV    R0,#00H    
        MOV     A,#80H      ;显示第1行16位        
      While:            
        MOV    DPTR,#TABLE_LCD0;DPTR指向数组TABLE_LCD0
        MOV    A,R0  
        MOVC  A,@A+DPTR
        LCALL  LCD_WDAT    ;等待
        NOP            ;延时1个指令
        INC    R0        ;R0++
        CJNE  R0,#16,Next1  ;第一行判断是否显示完毕
        MOV    R0,#00H      ;若是,R0变量清零  
        
        MOV     A,#0C0H      ;显示第2行16位  
        LCALL  LCD_WCMD
        MOV    DPTR,#TABLE_LCD1;DPTR指向数组TABLE_LCD1
      Next0:      
        MOV    A,R0  
        MOVC  A,@A+DPTR
        LCALL  LCD_WDAT
        NOP
        INC    R0
        CJNE  R0,#16,Next0    
        MOV    R0,#00H      
    
      Next1:      
        SJMP  While      ;While循环
        
      LCD_INIT:          ;初始化LCD1602
        LCALL  Delay      ;设置8线,5*7等
        MOV    A,#38H
        LCALL  LCD_WCMD
        LCALL  Delay
        MOV    A,#06H
        LCALL  LCD_WCMD
        LCALL  Delay
        MOV    A,#01H      ;界面清零
        LCALL  LCD_WCMD
        LCALL  Delay
        RET    
    
        LCD_WCMD:        ;LCD1602写指令
        LCALL   LCD_Wait
        CLR     LcdEn      ;LcdEn = 0
        CLR     LcdRs      ;LcdRs = 0
        CLR     LcdRw      ;LcdRw = 0
        NOP           ;延时1个指令周期
        NOP    
        NOP
        SETB    LcdEn      ;LcdEn = 1
        NOP   
        NOP    
        NOP
        MOV     P0,A      ;P0 = A      
        NOP   
        NOP    
        NOP                                            
        CLR     LcdEn      ;LcdEn = 0
        NOP 
        NOP    
        NOP    
        RET
        
      LCD_Wait:          ;LCD忙判断
        PUSH  ACC
        MOV     P0,#0FFH
        CLR     LcdRs                 
        SETB    LcdRw
        LCALL  Delay     
      BusyLOOP:  
        CLR     LcdEn
        LCALL  Delay 
        SETB    LcdEn    
        JB    P0.7,BusyLOOP                     
          POP    ACC
        RET
    
      Delay:            ;t=t1*10=5ms,修改R6的值即可更改时间(不精准)
        MOV    R6, #00AH    ;00AH=10
      D1:            
        MOV    R7, #0FAH    ;t1=250*2=500
      D2:    
        DJNZ  R7, D2      ;R7=250自减,直到为0跳出循环,双周期
        DJNZ  R6, D1      ;R6=020自减,直到为0跳出循环,双周期
        RET
      TABLE_LCD0:
        DB "   LCD Initial  "
    
      TABLE_LCD1:
        DB "   0123456789   "
      END  

    1、学习目的

    通过了解对LCD1602液晶屏的读写时序,命令来控制字符的显示。

    2、学习内容

    前面学习了数码管的显示,但要显示字符还得LCD1602显示屏。除电源外,1602液晶屏还有8个并口数据引脚,3个控制引脚RS、RW、EN。

    RS数据命令寄存器:高电平-数据寄存器,低电平-命令寄存器;

    RW读写寄存器:高电平-读,低电平-写,一般显示给即可;

    EN使能引脚:从高到底时,执行命令。

    如需下载Proteus仿真文件和Keil工程,请关注公众号:

    Proteus仿真店子

    (若需Proteus和keil安装包,后台回复:安装包;若需Proteus教学视频,后台回复:Proteus视频;若需其它设计,后台回复:51汇编设计

    展开全文
  • 1.汇编的笔记2: 指令:DA A //当两个BCD码的二进制相加时,相加结果肯定不是BCD的值,通过此指令,结果转换BCD码 过程:#低四位出现非BCD码,或进位(AC=1),低四位+6 #同样高四位一样 汇编程序编译技巧:...

    1.汇编的笔记2: 

    指令:DA   A      //当两个BCD码的二进制相加时,相加结果肯定不是BCD的值,通过此指令,结果转换BCD码

    过程:#低四位出现非BCD码,或进位(AC=1),低四位+6

               #同样高四位一样  

    汇编程序编译技巧: 

    • 尽量使用子程序模式
    • 子程序保护现场
    • 中断处理最好保存状态字(PWM,ACC)(特别时用寄存器计时,要调用不同寄存器组

    伪指令: 

    • ORG  0030H      告诉编译器,要在此地址30H为起始位置(ROM)
    • END
    • EQU   :  伪赋值     DATA   EQU   P1
    • DB    定义字节数据伪地址,  定义地址存放的数据(3FH)与ASCII表('ABC')

    DW    定义字地址(双字节) 

    EXAMPLE:
      
    ORG 0010H
    TABLE1: DB 00H, 01H, 002H, 00003H,  0004H,  500H, 6602H 
    
    ORG 0010H
    TABLE2: DW 0001H, 002H, 00003H,  0004H,  500H,  6602H,  0FDH
       
           只读后两位    只读后四位
    (0010)   00H           00H
    (0011)   01H           01H
    (0012)   02H           00H
    (0013)   03H           02H
    (0014)   04H           00H
    (0015)   00H           03H 
    (0016)   02H           00H
    (0017)                 04H
    (0018)                 05H
    (0019)                 00H
    (001A)                 66H
                           02H
                           00H
                           FDH
    • DATA  指定数据地址或代码地址      example: add  DATA 30H //  add的地址为30H
    • DS  保留地址     example:ORG 0030H; DS 04H; DB 8EH, 99H; //保留0030H-0033H
    • DB DS DW 都用于程序存储器(ROM)调用要  MOVC
    • BIT  位地址赋值命令  example: OUT1  BIT  P1.0

    机器汇编:汇编程序以文件形式(.ASM),然后成功生成16进制文件(.HEX),完成后生成打印文件(.prt),列表文件(.lst),目标文件(.obj),可执行文件(.exe)。 

     2.LCD1602驱动程序

    3.CODE 

    //*******************************************
    //题目:LCD1602显示
    //语言:汇编语言(51MCU)
    //功能:任意行列显示
    //优点:中间没有延时函数,用判忙操作;可移植
    //      含lcd的所有操作,包括滚屏,光标等设置
    //      函数封装
    //作者: 梦
    //提醒: 记得点赞哦!!!!!
    //*******************************************
    
    LCD_E  EQU P2.7
    LCD_RS EQU P2.6
    LCD_RW EQU P2.5	
    LCD_ADD EQU P0
    LCD_busybit EQU P0.7
    ORG 0000H
    	AJMP MAIN
    ORG 0030H
    MAIN:
         CLR RS1
    	 CLR RS0      //调用第0组寄存器
    	 LCALL LCD_INIT
    	 LCALL LCD_W_BUFF1   //第一行;TABLEDD1
    	 LCALL LCD_W_BUFF2   //第二行;TABLEDD2
    /CGRAM
    	 LCALL LCD_CGRAM   写入自定义符;TABLECG	 
    	 AJMP $
    ///滚屏	 
    	 LL:
    	       ACALL LCD_R_busy 
               MOV A, #18H        //光标移动设置0001 |S/C|R/L|** S/C/为1表示字体显示移位为0表示光标(地址)移位%%%%%光标移位
    		                    //R/L/为1右移为0左移   指令5   
    		   ACALL LCD_W_cmd
    		 
               SETB RS1   //调用第三组寄存器
    	       SETB RS0
    	       MOV R7,#5
    	      ACALL DELAY100MS   ;误差 0us;参数寄存器:R7  存放延时时间的倍数
    	       AJMP LL
    /CGRAM
    	       LCALL LCD_CGRAM   写入自定义符;TABLECG	   
    ///指定位置   	
             ACALL LCD_R_busy 
             MOV A, #01H         //清屏  %%%%%清屏设置
             ACALL LCD_W_cmd
    	     MOV R0,#1
    	     MOV R1,#8
    	     MOV R2, #00H
    	     LCALL LCD_W_XYD  //第1行,第8列,显示TABLEXYD 的第R2字符
    	     MOV R0,#2
    	     MOV R1,#10
    	     MOV R2,#01H
    	     LCALL LCD_W_XYD   //第2行,第10列,显示TABLEXYD 的第R2字符
    	 
    	 
    	 
    	 
    	 LJMP MAIN  
    	 
    
    LCD_INIT:
             SETB RS1   //调用第三组寄存器
    	     SETB RS0
             MOV R7,#15
    		 ACALL DELAY1MS
    		 MOV A,#38H
    		 ACALL LCD_W_cmd
    		 SETB RS1   //调用第三组寄存器
    	     SETB RS0
    		 MOV R7,#5
    		 ACALL DELAY1MS
             MOV A,#38H         //以上是唤醒驱动芯片不用判忙
    		 CLR RS1
    	     CLR RS0    //调用第0组寄存器
    /基础初始化 
    		 ACALL LCD_R_busy 
             MOV A,#0CH        //0000 1DCB  D/1为开显示0为关显示??????? %%%%%显示开关      指令4
    		                     //  C/1为有光标0为无光标 B/1为光标闪烁0为无闪烁
    		 ACALL LCD_W_cmd
    	     ACALL LCD_R_busy 
             MOV A, #38H       //001|DL| NF**  N/1双行显示0单行显示;  %%%%%%功能设置     指令6
    		                      //F/1为5*10;0为5*8   N/1双行显示;0单行显示 NL//1为8线输入0为4线输入
    		 ACALL LCD_W_cmd
    		 ACALL LCD_R_busy 
             MOV A, #01H         //清屏  %%%%%清屏设置              指令1
    		 ACALL LCD_W_cmd
    		 
    		 //滚屏,光标操作
    		 ;ACALL LCD_R_busy 
             ;MOV A, #06H        //光标移动方向0000 01|I/D|S I/D/为1表示增量方式为0表示光标移位减量  %%%输入方式设置
    		                    ;//S/为显示1移位为0不移移      指令3
    		 ;ACALL LCD_W_cmd
    		 
    		 ;ACALL LCD_R_busy 
             ;MOV A, #1CH        //光标移动设置0001 |S/C|R/L|** S/C/为1表示字体显示移位为0表示光标(地址)移位%%%%%光标移位
    		                    ;//R/L/为1右移为0左移   指令5   
    		 ;ACALL LCD_W_cmd
             RET
    
    LCD_W_XYD:    //X为第几行,Y为第几列,D为要显示数据(分别存到R0,R1,R2) (X:#1-2  Y:#0—#40  D:TAVLEXYD)
             ACALL   LCD_R_busy 
    		 CJNE R0, #01H, HAN
             MOV     A, #80H		 //第一行显示
    		 AJMP    LIE
    HAN:	 MOV     A, #0C0H       //第二行显示 
    LIE:     ADD     A, R1
             DEC     A
    		 ACALL LCD_W_cmd
    		 ACALL LCD_R_busy
    		 MOV   A, R2
    		 MOV   DPTR,#TABLEXYD  //
    		 MOVC  A, @A+DPTR
    		 ACALL LCD_W_data
    		 RET
      
    LCD_W_BUFF1:   //第一行显示
             ACALL  LCD_R_busy 
             MOV    A, #80H        //第一行显示
    		 ACALL  LCD_W_cmd
    		 MOV    DPTR, #TABLEDD1
    		 MOV    A, #00H
    		 MOV    R3,#00H   //R3用于判断数据多少
    DDLOOP1: MOVC   A, @A+DPTR
    		 ACALL  LCD_R_busy
    		 ACALL  LCD_W_data
    		 INC    R3
    		 MOV    A,R3
    		 CJNE R3, #48, DDLOOP1  //#16可以修改?????
    		 RET
      
    LCD_W_BUFF2:   //第二行显示
             ACALL   LCD_R_busy 
             MOV     A, #0C0H        //第二行显示
    		 ACALL   LCD_W_cmd
    		 MOV     DPTR,#TABLEDD2
    		 MOV     A, #00H
    		 MOV     R3,#00H      //R3用于判断数据多少
    DDLOOP2: MOVC   A, @A+DPTR
             ACALL   LCD_R_busy
    		 ACALL   LCD_W_data
    		 INC     R3
    		 MOV     A, R3
    		 CJNE R3, #30, DDLOOP2  //#16可以修改?????
    		 RET
      /
    LCD_CGRAM: 
             ACALL  LCD_R_busy 
             MOV    A, #40H        //写数据地址40H-7FH,但显示地址为00H—7H 08H-0FH
    		 ACALL  LCD_W_cmd
    		 MOV    DPTR,#TABLECG
    		 MOV    A, #00H
    		 MOV    R3,#01H  
    CGLOOP:	 MOVC   A,@A+DPTR
    		 ACALL  LCD_R_busy
    		 ACALL  LCD_W_data
    		 INC    R3
    		 MOV    A, R3
    		 CJNE R3, #32, CGLOOP  //  #8*X可以修改?????
    		 RET
    		 //
    LCD_W_cmd:
             CLR   LCD_RS
    		 CLR   LCD_RW
    		 MOV   LCD_ADD ,A
    		 SETB  LCD_E
    		 NOP 
    		 CLR   LCD_E
    		 RET
    		 //
    LCD_W_data:
             SETB  LCD_RS
    		 CLR   LCD_RW
    		 MOV   LCD_ADD ,A
    		 SETB  LCD_E
    		 NOP
    		 CLR   LCD_E
    		 RET
    		 //
    LCD_R_busy:
             MOV   LCD_ADD, #0FFH
             CLR   LCD_RS
    		 SETB  LCD_RW
    		 SETB  LCD_E  
    		 JB LCD_busybit, LCD_R_busy  //可以$
    		 CLR LCD_E
    		 RET
    		RET
    
    
    DELAY1MS:   ;误差 0us;参数寄存器:R7存放延时时间的倍数
          SETB RS1   //调用第三组寄存器
    	  SETB RS0
    START:
        MOV R6,#0C7H
    DL0:
        MOV R5,#01H
        DJNZ R5,$
        DJNZ R6,DL0
        DJNZ R7,START
    	CLR RS1
    	CLR RS0    //调用第0组寄存器
        RET
    
    DELAY100MS:   ;误差 0us;参数寄存器:R7  存放延时时间的倍数
          SETB RS1   //调用第三组寄存器
    	  SETB RS0
    START1:
        
        MOV R4,#07H
    DL11:
        MOV R6,#4AH
    DL00:
        MOV R5,#5FH
        DJNZ R5,$
        DJNZ R6,DL00
        DJNZ R4,DL11
        DJNZ R7,START1
    	CLR RS1
    	CLR RS0    //调用第0组寄存器
        RET
    
    TABLEDD1:DB "welcome to china thank you me too "
    TABLEDD2:DB 'I LOVE YOU BEST WISHES '
    	     DB 00H,01H,02H,04H,05H
    TABLEXYD:DB 00H, 02H, 03H ,04H
    TABLECG:DB  00H,00H,04H,0AH,11H,11H,0EH,00H,00H,00H
            DB  00H,0EH,00H,15H,15H,00H,0EH,00H,00H,00H
            DB  00H,04H,04H,1FH,15H,1FH,04H,04H,04H,00H //中
            DB  00H,1FH,11H,1FH,15H,1FH,15H,1FH,11H,1FH  //国
    		DB  00H,00H,00H,1FH,11H,0AH,04H,0AH,11H,00H  //又
    		DB  00H,00H,04H,0FH,15H,0AH,14H,13H,00H,00H	  //欠
    	END

    总结:LCD1602是单片机学习的最基础的,但是包含又各个方面内容,对于初接触单片机,特别写汇编有点困难,然后网上的历程大多是C语言,而汇编的我看了大多数使用延时判忙,这是在未来开发的大忌,最大可能不要用延时。

    通过芯片手册,我们知道它那些延时都是nm级别,而单片机的机器周期最小就1us(对于89c51)所以不需延时,在判忙时,也不要用延时,因为会影响项目性能。

    虽然LCD1602的操作简单,但是当我们学习它时,要掌握学习的方法:

    • 例如:学会利用互联网等资源找到你需要的资料 
    • 学会通过数据手册理解芯片的运行过程
    • 通过芯片时序图,写出自己的函数,而不是复制粘贴
    • 通过芯片各个寄存器映射了解功能内容,并使用它
    • 这为以后我们遇到各种模块(蓝牙,LED数码管,超声波等)它们的各种通信时序图(iic,spi,usart,uart,can,usb等)奠定基础
    • 总之不要忽略简单的问题,一定要搞透,不要因为为了完成作业而复制粘贴应付

    最后,记得点赞收藏哦!!!!

    这一节是作者总结上一章和这一章汇编指令,额外添加LCD1602的显示程序。 

    展开全文
  • C语言和汇编语言实现51单片机LCD的控制,给出了三种不同的方法,并附有纤细的程序清单
  • 适合单片机初学者,弄懂它液晶显示就没问题
  • KT800综合系统板实验源程序库 单片机LCD 1602液晶秒表程序(汇编
  • 本程序是通过51单片机汇编语言编写DS18b20、DS1302、红外遥控、LCD1602等驱动程序,实现用1602液晶屏显示时间、日期、室内温度。并通过红外遥控器按键实现时间的修改、闹钟的设置,到达设定闹钟时间时,控制蜂鸣器响...
  • 有利于单片机学习的资料,单片机汇编,时钟,LCD,键盘的相关设计
  • 51单片机汇编1602字符液晶驱动程序,教学学习资源
  • ;=================================== ... Function : LCD1602 drives ; Programer : MicroAC ; Date : 2012.03.06 ;=================================== name LCD1602 ;You should know that

    ;===================================
    ; Function     : LCD1602 drives
    ; Programer : MicroAC
    ; Date            : 2012.03.06
    ;===================================
    name LCD1602
    ;You should know that A-register as
    ;transper if you gonna delier data.

    ;MCU'SEPCIAL REGISTER

    ;ACC      DATA    0E0H
    ;B            DATA    0F0H
    ;SP         DATA    81H
    ;DPL      DATA    82H
    ;DPH      DATA    83H

    ;DEFINE CONTROL PIN HERE & DATA PORT
    RS   BIT P2.4
    RW  BIT P2.5
    E      BIT P2.6

    DAT EQU P0


    ;SOME CONTROLER FLAG OR DAT

    CHECK BIT 20H.0    ;Bit rang you can search.
    BUSY  EQU 80H

    ;SOME PARATERMER DEFINE


    DEL_TIM EQU 100    ;SETTING TIME YOU WANT DELAY.

    ;***********************************
    ;--FUNCTION             :  MAIN
    ;--IN PARAMETER     : NONE
    ;--OUTPARAMETER  : NONE
    ;--PROTEST                : NONE
    ;***********************************
    MAIN SEGMENT CODE
    START:
         ....add your instruction here!
         AJMP START

    ;***********************************
    ;--FUNCTION      :  InitLCD
    ;--IN PARAMETER  : CHECK , A
    ;--OUTPARAMETER  : NONE
    ;--PROTEST   : NONE
    ;***********************************
    InitLCD PROC NEAR
        MOV  R1,#3                                          ;CIRCLE 3 TIMES
    CIRCLE:
     MOV  DAT,#0                                            ;COMMAND 0X38,NO CHECK BF
     MOV  A,#38H
     CLR  CHECK
     CALL WriteCom                                       ;WRITE COMMAND
     LCALL DELAY    ;DELAY
     DJNZ  R1,CIRCLE
    ;COMMAND 0X38,CHECK BF & SETTING BEGINNING
     MOV   A,#38H                                            ;NO DELAY
     SETB  CHECK
     CALL WriteCom                                       ;WRITE COMMAND
    ;COMMAND 0X08,CHECK BF & SETTING BEGINNING
     MOV   A,#08H                                            ;NO DELAY
     SETB  CHECK
     CALL WriteCom                                       ;WRITE COMMAND
    ;COMMAND 0X01,CHECK BF & SETTING BEGINNING
     MOV   A,#01H                                           ;NO DELAY
     SETB  CHECK
     CALL WriteCom                                      ;WRITE COMMAND
    ;COMMAND 0X06,CHECK BF & SETTING BEGINNING
     MOV   A,#06H                                           ;NO DELAY
     SETB  CHECK
     CALL WriteCom                                      ;WRITE COMMAND
    ;COMMAND 0X0C,CHECK BF & SETTING BEGINNING
     MOV   A,#0CH                                          ;NO DELAY
     SETB  CHECK
     CALL WriteCom                                      ;WRITE COMMAND
     CALL DELAY                                            ;DELAY
     RET
    InitLCD ENDP
    ;***********************************
    ;--FUNCTION              :  WriteDat
    ;--IN PARAMETER      : CHECK , A
    ;--OUTPARAMETER   : NONE
    ;--PROTEST                 : NONE
    ;*********************************** 
    WriteDat PROC NEAR

     JNB CHECK,NOCHE                              ;NEEDN'T CHECKE BUSY-BF


     CLR CHECK                                             ;CLR CHECK FLAG FOR NEXT CHECK.


     CALL ReadStatus


    NOCHE:
     
        MOV DAT,A                                             ;DAT<-(A),COMMAND RESTORE AT A-REGISTER
        SETB  RS
        CLR   RW
        SETB  E
        CLR   E
        SETB  E
         RET
    WriteDat ENDP
    ;***********************************
    ;--FUNCTION              :  WriteCom
    ;--IN PARAMETER      : CHECK,A
    ;--OUTPARAMETER   : NONE
    ;--PROTEST                 : NONE
    ;***********************************
    WriteCom PROC NEAR

     JNB CHECK,NOCHE                                    ;NEEDN'T CHECKE BUSY-BF


     CALL ReadStatus
    NOCHE:
     
        MOV DAT,A                                                  ;DAT<-(A),COMMAND RESTORE AT A-REGISTER
       CLR   RS
       CLR   RW
       SETB  E
       CLR   E
       SETB  E

        RET
    WriteCom ENDP
    ;***********************************
    ;--FUNCTION             :  ReadStatus
    ;--IN PARAMETER     : NONE
    ;--OUTPARAMETER  : NONE
    ;--PROTEST                : NONE
    ;***********************************
    ReadStatus PROC NEAR
       
        MOV  DAT,#0FFH                                     ;PIN READ MODULE
        CLR  RS
        SETB RW
        SETB E
        CLR  E
    BLOOP:                                                           ;GET BUSY BIT -BF
         MOV  A,DAT
        ANL  A,#BUSY  
        JBC  ACC.7 ,BLOOP
        SETB E
        RET
    ReadStatus ENDP
    ;***********************************
    ;--FUNCTION              :  DispOneChar
    ;--IN PARAMETER      : A
    ;--OUTPARAMETER   : NONE
    ;--PROTEST                 : A
    ;***********************************
    DispOneChar  PROC NEAR
        PUSH ACC                                    ;NEED TO PROTECT DISPLAY DATA.
        CLR  A                                            ;CLEAR  A
        ORL  A , #(80H+ 4)                       ;CHANG INTO INSTRUCTION(SET ADDRESS)
        SETB CHECK                               ;AND DISPLAY ONE LINE WITH CHECK BF
        CALL WriteCom
        POP  ACC                                       ;DISPLAY DATA OUT.
        SETB CHECK
        CALL WriteDat
        CALL DELAY
           RET
    DispOneChar ENDP
    ;***********************************
    ;--FUNCTION             : DEALY
    ;--IN PARAMETER     : DEL_TIM
    ;--OUTPARAMETER  : NONE
    ;--PROTEST               : PSW
    ;***********************************
    DEALY PROC FAR
        PUSH PSW
        SETB RS0                                      ;USING WORK REGISTER 3
        SETB RS1
        MOV R7,#DEL_TIM
        MOV R6,#200
    LOOP:
        DJNZ R6,$
        DJNZ R7,LOOP
        POP PSW
        RETS                                              ;FAR PROCEDURE RETURN
    DEALY ENDP
     END

    展开全文
  • 单片机汇编的停车计费系统,按键从左至右分别是1车计费开始,一车停止。2车开始2车停止。3车开始3车停止。最后两个按键是加减计费周期对应的周期价格。计费时间设定为30秒一个计费周期
  • LCD1孔接8000H;LCD2孔接8100H; 四.实验说明 本实验采用的是TRULY公司的MSC-G12232DYEW-7N型号液晶显示器,它能显示122X32点阵。既能显示文本,也能显示图形。具体参数及有关操作的详细说明参见光盘中的芯片技术...
  • 51单片机控制LCD1602模块结构图和使用说明,学习LCD1602必备资料!
  • 单片机实现0-10v电压的LCD显示 保留三个有效位
  • 由浅入深,系统学习单片机及其与外围芯片配合实现键盘输入,LED,LCD显示输出。含许多经典案例,配有解说。
  • 单片机资料lcd16824

    2010-04-17 16:08:27
    单片机高级程序lcd16824显示屏例程
  • 51单片机 汇编 驱动 LG 240*128点阵液晶 T6963C控制器 2005年全国大学生电子设计大赛上使用的东西,4天3也使用汇编驱动液晶, 还是大屏幕的液晶,很佩服当时自己的勇气与决心啊!
  • 利用单片机控制lcd上显示温度和图形,内部有单片机的C51源代码和具体电路图。
  • 单片机c语言示例例子,包含了各种单片机应用程序,lcd,led,蜂鸣器,键盘,液晶显示等 可自行学习,有注释
  • 51单片机lcd1602

    2015-05-04 19:59:59
    51单片机lcd1602显示程序,keil uvision 4 汇编语言代码
  • 51单片机LCD1602显示模块

    千次阅读 2019-05-11 21:15:47
    - 什么是LCD1602 LCD:Liquid Crystal Display—液晶显示器,简称LCD,其主要显示原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面,通常把各种液晶显示器都直接叫做液晶。 1602:液晶的命名通常都是...
  • 这是一个基于单片机驱动1602显示中文汉字的心得体会,与大家共分享
  • 基于C51单片机LCD电子时钟设计

    千次阅读 多人点赞 2020-07-05 07:50:37
    1、 制作一个基于LCD显示的电子钟,在LCD显示器上显示当前时间。 2、 使用字符型LCD显示器显示时间。 3、 显示格式:“时时:分分:秒秒”。 4、 用4个功能键操作来设置当前时间。功能键K1~K4功能如下: (1) K1:进入...
  • 51单片机开发板程序_18b20+1602LCD测温实验(汇编

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,028
精华内容 811
关键字:

单片机汇编lcd