为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 北冬虫夏草的图片

北冬虫夏草的图片

2017-09-20 8页 doc 82KB 26阅读

用户头像

is_321575

暂无简介

举报
北冬虫夏草的图片万年历 1、题目要求: 1、实现目标:用液晶屏显示时间、日期、星期和温度,时间、日期可调,且可以设置闹钟。 2、所用功能:1602液晶屏,独立按键,矩阵键盘,DS18B20温度传感器,1302时钟器,蜂鸣器,定时、中断。 2、程序框图: 主程序框图 计算阳历程序图 3、程序: ;==================变量和管脚的定义=================== LCD_RW    EQU     P2.5 LCD_RS    EQU     P2.6 LCD_EN  EQU     P2.7        ; L...
北冬虫夏草的图片
万年历 1、题目要求: 1、实现目标:用液晶屏显示时间、日期、星期和温度,时间、日期可调,且可以设置闹钟。 2、所用功能:1602液晶屏,独立按键,矩阵键盘,DS18B20温度传感器,1302时钟器,蜂鸣器,定时、中断。 2、程序框图: 主程序框图 计算阳历程序图 3、程序: ;==================变量和管脚的定义=================== LCD_RW    EQU     P2.5 LCD_RS    EQU     P2.6 LCD_EN  EQU     P2.7        ; LCD液晶显示控制端接口 RS BIT P2.0                        RW BIT P2.1                        E  BIT P2.2                LCD EQU P0 JIDIANQI EQU    P2.3 BEER    EQU    P2.4 H_BIT EQU 20H M_BIT EQU 21H S_BIT EQU 22H HH    EQU 23H MM    EQU 24H SS    EQU 25H HH_BIT EQU 26H MM_BIT EQU 27H SS_BIT EQU 28H BUF EQU 30H ;            30H-33H保存解码结果 FLAG1    BIT  F0        ;DS18B20存在标志位 DQ        BIT  P3.4      ;DS18B20占用的总线 TEMPER_L  EQU  29H TEMPER_H  EQU  28H ROM1      EQU  2AH ROM2      EQU  2BH ROM3      EQU  2CH ROM4      EQU  2DH ROM5      EQU  2EH ROM6      EQU  2FH ROM7      EQU  30H ROM8      EQU  31H A_BIT    EQU  35H B_BIT    EQU  36H LG        EQU    45H LG1        EQU    46H        ; LCD1602液晶显示位 ORG        0000H LJMP        INTI ORG        000BH ;=================================================== ; 初始化 ;=================================================== ORG        1000H INTI: MOV        LG, #35H MOV        LG1, #34H        ; LCD1602液晶显示初值 MOV        TMOD, #11H        ; 定时器方式1和0 MOV        TH0, #4CH        MOV        TL0, #B0H        ; 定时器0初值,控制中断时间 MOV        TH1, #D8H        ;设定时1初值 MOV        TL1, #F0H MOV        TCON, #50H MAIN: LCALL          LCD_INIT LCALL        LCDSET1        ; LCD1602液晶显示初始化 SETB        ET0              ; 打开定时器中断 SETB        EA              ; 打开总中断 SETB        TR0            ; 开定时器 SETB        TR1            ; 开定时器 MOV SP,        #60H MOV P1,        #00H MOV R5,        #00H MOV H_BIT,    #00H MOV M_BIT,    #00H MOV S_BIT,  #00H MOV HH_BIT, #00H MOV MM_BIT, #00H MOV SS_BIT, #00H MOV HH,        #00H MOV MM,        #00H MOV SS,        #00H MOV TMOD,    #01H MOV TH0,    #3CH MOV TL0,    #0B0H        MOV LCD,    #01H LCALL         LCDWC LCALL    INIT_18B20          ;复位程序 LCALL    GET_TEMPER          ;读转换后的温度 AJMP    CHANGE MOV SP,        #70H ;堆栈指针设到70H的地方 MOV R7,        #10 ACALL         DELAY_MS MOV DPTR,    #MSG1 CALL         DISPLAY_LINE1;在第一行显示 MOV DPTR,    #MSG2 CALL         DISPLAY_LINE2;在第二行显示 HERE: LCALL        KEY JMP        HERE            ; 按键标志,不断循环 KEY: ORL        P1, #11111111B    ; 拉高独立按键 MOV        A, P1 CPL        A ANL        A, #0CFH JZ        KEY0            ; 若为0,跳到KEY0 LJMP        KEY1 KEY0: LJMP         KEY2 KEY1: JB        P1.2, KEY2 CLR        EA                        ; 开中断 MOV         A, #02H                ; 清除屏幕 ACALL         LCD_CMD            ; 进行LCD忙检测 MOV        A, #80H LCALL        LCD_CMD MOV        A, #53H LCALL        LCD_WDATA            ; 查表,得到显示数 MOV        A, #81H LCALL        LCD_CMD MOV        A, #51H LCALL        LCD_WDATA MOV        A, #82H LCALL        LCD_CMD MOV        A, #52H LCALL        LCD_WDATA MOV        A, #85H LCALL        LCD_CMD MOV        A, #46H LCALL        LCD_WDATA MOV        A, #86H LCALL        LCD_CMD MOV        A, #30H LCALL        LCD_WDATA MOV        A, #87H LCALL        LCD_CMD MOV        A, #37H LCALL        LCD_WDATA MOV        A, #89H LCALL        LCD_CMD MOV        A, #41H LCALL        LCD_WDATA MOV        A, #8AH LCALL        LCD_CMD MOV        A, #32H LCALL        LCD_WDATA MOV        A, #8BH LCALL        LCD_CMD MOV        A, #34H LCALL        LCD_WDATA MOV        A, #8CH LCALL        LCD_CMD MOV        A, #30H LCALL        LCD_WDATA SETB        EA            ; 开中断 LJMP        KEY7 D1MS: MOV         R5, #10 D1: MOV         R6, #250  DJNZ         R6, $ DJNZ         R5, D1 RET ;=================================================== ; 延时10MS ; 占用资源:R5, R6 ;=================================================== D10MS: MOV         R5, #3 D2: MOV         R6, #200 DJNZ         R6, $ DJNZ         R5, D2 RET ;=================================================== ; 检测LCD控制器忙状态 ; 读数据 ; RS=L,RW=H,E=H,输出:D0-D7=数据 ;=================================================== CHECKBUSY: PUSH          ACC MOV          P0, #0FFH CLR          LCD_RS SETB          LCD_RW SETB          LCD_EN BUSYLOOP: NOP JB         P0.7, BUSYLOOP CLR          LCD_EN POP          ACC RET ;=================================================== ; 写显示数据到LCD ; RS=H,RW=L,D0-D7=数据,E=高脉冲 ;=================================================== LCD_WDATA: ACALL          CHECKBUSY ; 高4字节 SETB          LCD_RS CLR          LCD_RW CLR          LCD_EN MOV          P0, A NOP NOP NOP NOP SETB          LCD_EN NOP NOP NOP NOP CLR          LCD_EN ; 低4字节 SETB          LCD_RS CLR          LCD_RW CLR          LCD_EN NOP NOP NOP NOP ANL            A, #0FH SWAP        A MOV          P0, A NOP NOP NOP NOP SETB          LCD_EN NOP NOP NOP NOP CLR          LCD_EN RET ;=================================================== ; 写指令数据到LCD ; RS=L,RW=L,D0-D7=指令码,E=高脉冲 ;=================================================== LCD_CMD: ACALL          CHECKBUSY LCD_CMD_NC: ; 高4字节 CLR         LCD_RS CLR         LCD_RW CLR          LCD_EN NOP NOP MOV          P0, A NOP NOP NOP NOP SETB         LCD_EN NOP NOP NOP NOP CLR          LCD_EN ; 低4字节 ANL        A, #0FH SWAP        A MOV          P0, A NOP NOP NOP NOP SETB          LCD_EN NOP NOP NOP NOP CLR          LCD_EN RET ;=================================================== ; 写8位指令数据到LCD ; RS=L,RW=L,D0-D7=指令码,E=高脉冲 ;=================================================== LCD_CMD_8BIT: ACALL        CHECKBUSY LCD_CMD_8BIT_NC: CLR         LCD_RS CLR         LCD_RW CLR          LCD_EN NOP NOP MOV          P0, A NOP NOP NOP NOP SETB         LCD_EN NOP NOP NOP NOP CLR          LCD_EN RET ;=================================================== ; LCD初始化设定子程序 ;=================================================== LCD_INIT: ACALL         D1MS              ; 延时15MS ACALL         D1MS                ; 等待LCD电源稳定 ACALL         D1MS MOV         A, #38H        ; 16*2显示,5*7点阵,8位数据 ACALL         LCD_CMD_8BIT_NC      ; 不进行LCD忙检测 ACALL         D1MS MOV         A, #38H      ; 16*2显示,5*7点阵,8位数据 ACALL         LCD_CMD_8BIT_NC      ; 不进行LCD忙检测 ACALL         D1MS MOV  A, #28H              ; 16*2显示,5*7点阵,8位数据 ACALL         LCD_CMD_8BIT_NC      ; 不进行LCD忙检测 ACALL         D1MS ; 转4位界面 MOV         A, #28H          ; 16*2显示,5*7点阵,8位数据 ACALL         LCD_CMD            ; 不进行LCD忙检测 ACALL         D1MS MOV          A, #0cH                ; 显示关 ACALL         LCD_CMD              ; 进行LCD忙检测 ACALL         D1MS MOV         A, #02H                ; 清除屏幕 ACALL         LCD_CMD              ; 进行LCD忙检测 ACALL         D1MS MOV         A, #01H                ; 移动光标 ACALL         LCD_CMD              ; 进行LCD忙检测 ACALL         D1MS RET ;=================================================== ; 显示位置与移动光标设定 ;=================================================== LCDSET1: MOV         A, #01H                ; 清除屏幕 ACALL         LCD_CMD ACALL         D1MS MOV         A, #06H                ; 移动光标(光标加1) ACALL         LCD_CMD ACALL         D1MS MOV         A, #87H                ; 显示第一行左边第一位位置 ACALL         LCD_CMD ACALL         D1MS RET ;=================================================== LOOP: LCALL EY LCALL KEY LCALL EYY LJMP LOOP ;***************************时钟显示***************************************              ;===================子程序================= EY: LCALL LOOP1 LCALL LCDSET MOV DPTR,#TAB1 MOV A,H_BIT LCALL DISP MOV A,HH_BIT LCALL DISP MOV A,#58 MOV LCD,A LCALL WRR MOV A,M_BIT LCALL DISP MOV A,MM_BIT LCALL DISP MOV A,#58 MOV LCD,A LCALL WRR MOV A,S_BIT LCALL DISP MOV A,SS_BIT LCALL DISP RET ;=======BCD码转换子程序=============== LOOP1: MOV A,SS MOV B,#10 DIV AB MOV S_BIT,A MOV SS_BIT,B MOV A,MM MOV B,#10 DIV AB MOV M_BIT,A MOV MM_BIT,B MOV A,HH MOV B,#10 DIV AB MOV H_BIT,A MOV HH_BIT,B RET ;==========中断子程序================= TIME0: PUSH ACC PUSH PSW MOV TH0,#3CH MOV TL0,#0B0H INC R5 CJNE R5,#20,LOOP2 MOV R5,#00H INC SS MOV A,SS CJNE A,#60,LOOP2 MOV SS,#00H INC MM MOV A,MM CJNE A,#60,LOOP2 MOV MM,#00H INC HH MOV A,HH CJNE A,#24,LOOP2 MOV HH,#00H LOOP2: POP PSW POP ACC RETI ;=====按键检测子程序==================== KEY: clr ea JNB P3.2,SS_KEY KEY1: setb ea RET ;========秒钟调整子程序================ SS_KEY: LCALL EY1 LCALL DIS1 JNB P3.2,SS_KEY SSA: LCALL EY1 JNB P3.3,S_ADDKEY JNB P3.4,S_DECKEY LCALL DIS1 JNB P3.2,MM_KEY JNB P3.5,KEY3 LJMP SSA KEY3: LJMP KEY1 ;=========秒加1========================== S_ADDKEY: lcall ey1 LCALL DIS1 JNB P3.3,S_ADDKEY INC SS MOV A,SS CJNE A,#60,SS_KEY1 MOV SS,#00H SS_KEY1: LJMP SSA ;=========秒减1========================= S_DECKEY: lcall ey1 LCALL DIS1 JNB P3.4,S_DECKEY MOV A,SS CJNE A,#00,SS_KEY2 MOV SS,#60 SS_KEY2: DEC SS LJMP SS_KEY1 ;=========分钟调整子程序=============== MM_KEY: LCALL EY2 LCALL DIS1 JNB P3.2,MM_KEY MMA: LCALL EY2 JNB P3.3,M_ADDKEY JNB P3.4,M_DECKEY LCALL DIS1 JNB P3.2,HH_KEY JNB P3.5,KEY4 LJMP MMA KEY4: LJMP KEY1 ;============分加1==================== M_ADDKEY: lcall ey2 LCALL DIS1 JNB P3.3,M_ADDKEY INC MM MOV A,MM CJNE A,#60,MM_KEY1 MOV MM,#00H MM_KEY1: LJMP MMA ;===========分减1==================== M_DECKEY: lcall ey2 LCALL DIS1 JNB P3.4,M_DECKEY MOV A,MM CJNE A,#00,MM_KEY2 MOV MM,#60 MM_KEY2: DEC MM LJMP MM_KEY1 ;=======时钟调整子程序============== HH_KEY: LCALL EY3 LCALL DIS1 JNB P3.2,HH_KEY HHA: LCALL EY3 JNB P3.3,H_ADDKEY JNB P3.4,H_DECKEY LCALL DIS1 JNB P3.2,SSB JNB P3.5,KEY5 LJMP HHA KEY5: LJMP KEY1 ;==========时加1================== H_ADDKEY: lcall ey3 LCALL DIS1 JNB P3.3,H_ADDKEY INC HH MOV A,HH CJNE A,#24,HH_KEY1 MOV HH,#00H HH_KEY1: LJMP HHA ;==========时减1================= H_DECKEY: lcall ey3 LCALL DIS1 JNB P3.4,H_DECKEY MOV A,HH CJNE A,#00,HH_KEY2 MOV HH,#24 HH_KEY2: DEC HH LJMP HH_KEY1 SSB: LJMP SS_KEY DISP: MOVC A,@A+DPTR MOV LCD,A LCALL WRR RET ;======================== LCDSET: MOV LCD,#38H LCALL LCDWC MOV LCD,#06H LCALL LCDWC MOV LCD,#0CH LCALL LCDWC MOV LCD,#0C4H LCALL LCDWC RET ;============================ LCDWC: CLR RS CLR RW CLR E LCALL LCDBF SETB E RET ;=========================== WRR: SETB RS CLR RW CLR E LCALL LCDBF SETB E RET ;================================ LCDBF: MOV LCD,#0FFH CLR RS SETB RW CLR E NOP SETB E JB LCD.7,LCDBF RET ;================================ EYY: MOV LCD,#80H LCALL LCDWC MOV DPTR,#TAB2 MOV R2,#16 MOV R1,#00H EYY1: MOV A,R1 LCALL DISP INC R1 DJNZ R2,EYY1 RET ;========================== EY1: MOV LCD,#0C4H LCALL LCDWC MOV R4,#02 EY11: LCALL HIND DJNZ R4,EY11 LCALL LOOP1 MOV A,S_BIT LCALL DISP MOV A,SS_BIT LCALL DISP RET ;========================== EY2: MOV LCD,#0C4H LCALL LCDWC LCALL HIND LCALL LOOP1 MOV A,M_BIT LCALL DISP MOV A,MM_BIT LCALL DISP LCALL HIND RET ;======================= EY3: MOV LCD,#0C4H LCALL LCDWC LCALL LOOP1 MOV A,H_BIT LCALL DISP MOV A,HH_BIT LCALL DISP MOV R4,#02 EY33: LCALL HIND DJNZ R4,EY33 RET ;============================== HIND: MOV R3,#3 HIND1: MOV A,#' ' MOV LCD,A LCALL WRR DJNZ R3,HIND1 RET ;==========延时程序=============  DIS1: MOV R6,#20 DJNZ R6,$ RET ;=======段码表===================== TAB1: DB  30H,31h,32H,33H,34H,35H,36H,37H,38H,39H TAB2:  DB "TIM" ;******************************************************************** ; 读取数据表并将数据写入子程序 ;******************************************************************** WRITE1: MOVC A,@A+DPTR      ;查表 LCALL WR_DATA RET ;******************************************************************** ; 写数据子程序 ;******************************************************************** WR_DATA: MOV  P0,A SETB RS      ;RS=1 CLR RW      ;RW=0 ;准备写入数据 CLR E        ;E=0 ;执行显示命令 LCALL BUSY  ;判断液晶模块是否忙? SETB E      ;E=1 ;显示完成,程序停车 RET ;******************************************************************** ; 写命令子程序 ;******************************************************************** WR_CODE: CLR RS  ;写入控制命令的子程序 CLR RW CLR E LCALL BUSY SETB E RET ;******************************************************************** ; 判断忙碌子程序 ;******************************************************************** BUSY: MOV P0,#0FFH  ;判断液晶显示器是否忙的子程序 CLR RS SETB RW CLR E NOP SETB E JB P0.7,BUSY  ;如果P1.7为高电平表示忙就循环等待 RET ;******************  HEX转BCD碼 **************************** hex_BCD: mov  a,hex add  a,#00h da  a ret ;***************BCD碼转dec********************************* bcd_dec: mov  a,bcd mov  b,#16 div  ab      ;a中放置十位,b中放置个位 swap  a add  a,b ret ;*****************  温度显示  **************************************** common:  mov scon,#50h      ;串口方式1,允许接收 mov 87h,#00h        ;PCON设置(将SMOD置0,使波特率不加倍) setb tr1            ;启动计时 ;******************************************************************** ;**********DS18B20复位程序***************** INIT_18B20:    ;SETB  DQ          ;DS18B20占用的总线    ;NOP CLR    P1.0        ;二极管指示用于观察调试                                  CLR  DQ            ;DS18B20占用的总线 MOV  R0,#0FBH TSR1: DJNZ  R0,TSR1      ;延时 SETB  DQ MOV  R0,#25H TSR2: ;JNB  DQ ,TSR3      ;延时                DJNZ  R0,TSR2 TSR3: SETB  FLAG1        ;置标志位,表明DS18B20存在 ;AJMP  TSR5                                ;TSR4: CLR  FLAG1                                ;LJMP  TSR7                                TSR5: MOV  R0,#06BH      ;yf延时 TSR6: DJNZ  R0,TSR6 ;TSR7: SETB  DQ            ;表明不存在            SETB  P1.0          ;二极管指示用于观察调试 RET ;********************设定DS18B20暂存器设定值************** RE_CONFIG: JB    FLAG1,RE_CONFIG1 RET RE_CONFIG1: MOV    A,#0CCH        ;放跳过ROM命令 LCALL  WRITE_18B20 MOV    A,#4EH LCALL  WRITE_18B20    ;写暂存器命令 MOV    A,#00H          ;报警上限中写入00H LCALL  WRITE_18B20 MOV    A,#00H          ;报警下限中写入00H LCALL  WRITE_18B20 MOV    A,#1FH          ;选择九位温度分辨率 LCALL  WRITE_18B20 RET ;*****************读转换后的温度值**************** GET_TEMPER: SETB  DQ LCALL  INIT_18B20      ;yf复位 JB    FLAG1,TSS2      ;yf若FLAG1位为1则跳转 RET                    ;若不存在则返回 TSS2:      MOV    A,#033H          ;读ROM LCALL  WRITE_18B20 MOV    A,#44H          ;发出温度转换命令 LCALL  WRITE_18B20 LCALL  DISPLAY          ;延时 LCALL  INIT_18B20 MOV    A,#0CCH          ;跳过ROM LCALL  WRITE_18B20 MOV    A,#0BEH          ;发出读温度换命令 LCALL  WRITE_18B20 LCALL  READ2_18B20      ;读两个字节的温度 RET ;***************写DS18B20命令程序************ WRITE_18B20: MOV    R2,#8 CLR    C WR1: CLR    DQ MOV    R3,#6            ;yf延时 DJNZ  R3,$ RRC    A                ;yf带进位右移 MOV    DQ,C            ;yf象总线写一位数 MOV    R3,#23          ;yf延时 DJNZ  R3,$ SETB  DQ NOP DJNZ  R2,WR1          ;yf判断8位是否发完 SETB  DQ RET ;***********读18B20程序,读出两个字节的温度********* READ2_18B20:CLR  P1.1          ;二极管指示用于观察调试yf MOV  R4,#2        ;给2字节数,低位存在29 H,高位存在28H MOV  R1,#29H      ;yf给地址初值 RE00:      MOV  R2,#8        ;yf给R2给一字节循环数 RE01:      CLR  C SETB  C NOP NOP CLR  DQ NOP NOP NOP SETB  DQ MOV  R3,#7        ;yf延时 DJNZ  R3,$ MOV  C,DQ          ;yf将读得的数传给C MOV  R3,#23        ;yf延时 DJNZ  R3,$ RRC  A            ;yf右移一位,移位8次后A中的值即为所采得的数值 DJNZ  R2,RE01      ;yf一字节数采集够 MOV  @R1,A        ;yf将累加器值存入间接地址 mov sbuf,a        ;将29H单元采集的数据传到串口用于调试yf jnb ti,$ clr ti DEC  R1            ;yf地址减1 DJNZ  R4,RE00      ;yf第一字节采集完后采集第二字节 SETB  P1.1          ;二极管指示用于观察调试yf RET ;************读出的温度进行数据转换************** CHANGE:    MOV  A,29H MOV  C,28H.0        ;将28H中的最低位移入C RRC  A MOV  C,28H.1 RRC  A MOV  C,28H.2 RRC  A MOV  C,28H.3 RRC  A MOV  29H,A LCALL DISPLAY        ;调用数码管显示子程序 LJMP  MAIN ;*******************DISPLAY****** DISPLAY:    mov  a,29H        ;将29H中的十六进制数转换成10进制 mov  b,#10        ;待转换的数/10=10进制 div  ab mov  b_bit,a      ;十位在a mov  a_bit,b      ;个位在b mov  dptr,#TAB    ;指定查表启始地址 mov  r0,#4 dpl1:      mov  r1,#250      ;显示1000次 dplop:      mov  a,a_bit      ;取个位数 MOVC  A,@A+DPTR    ;查个位数的7段代码 mov  p0,a          ;送出个位的7段代码 clr  p2.5          ;开个位显示 acall d1ms          ;显示1ms setb  p2.5 mov  a,b_bit      ;取十位数 MOVC  A,@A+DPTR    ;查十位数的7段代码 mov  p0,a          ;送出十位的7段代码 clr  p2.4          ;开十位显示 acall d1ms          ;显示1ms setb  p2.4 djnz  r1,dplop      ;100次没完循环 djnz  r0,dpl1      ;4个100次没完循环 ret ;============================================ ;测量低电平时间,50US采样一次,R7加1一次,比如低电平时间为9000US,测得R7的结果为180(0B4H) ;OUTPUT: R7 GET_LOW: MOV R7,#00H GET_LOW_NEXT: MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期, DJNZ R6,$ ;这条指令执行需要2个机器周期 JB IRR,GET_LOW_RTN ;接收头为高电平,结束测量 INC R7 MOV A,R7 JNZ GET_LOW_NEXT ;看R7是否有溢出 GET_LOW_RTN: RET ;============================================ ;测量高电平时间,50US采样一次,R7加1一次,比如高电平时间为4500US,测得R7的结果为90 ;OUTPUT: R7 GET_HIGH: MOV R7,#00H GET_HIGH_NEXT: MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期, DJNZ R6,$ ;这条指令执行需要2个机器周期 JNB IRR,GET_HIGH_RTN ;接收头为低电平,结束测量 INC R7 MOV A,R7 GET_HIGH_RTN: RET ;============================================ ;============================================ DELAY_MS: MOV R6,#250 DELAY_MS_NEXT: NOP NOP DJNZ R6,DELAY_MS_NEXT DJNZ R7,DELAY_MS RET ;============================================ ;INPUT: R7 DELAY: DJNZ R7,$ RET ;============================================ ;向LCD写一个命令字节 ;INPUT: ACC SEND_COMMAND_BYTE: CLR RS CLR RW MOV P0,A SETB E NOP NOP NOP NOP NOP NOP CLR E MOV R7,#100 ACALL DELAY RET ;=============================================== ;向LCD写一个数据字节 ;INPUT: ACC SEND_DATA_BYTE: SETB RS CLR RW MOV P0,A SETB E NOP NOP NOP NOP NOP NOP CLR E MOV R7,#100 ACALL DELAY RET ;=================================================== ;初始化LCD INIT_LCD: MOV A,#30H ACALL SEND_COMMAND_BYTE ACALL SEND_COMMAND_BYTE ACALL SEND_COMMAND_BYTE MOV A,#38H ;设置工作方式 ACALL SEND_COMMAND_BYTE MOV A,#0CH ;显示状态设置 ACALL SEND_COMMAND_BYTE MOV A,#01H ;清屏 ACALL SEND_COMMAND_BYTE MOV A,#06H ;输入方式设置 ACALL SEND_COMMAND_BYTE RET ;=================================================== ;在第一行显示 ;INPUT: DPTR指向要显示的 DISPLAY_LINE1: MOV A,#080H DISPLAY_LINE1_A: ACALL SEND_COMMAND_BYTE ;设置DDRAM地址 MOV R6,#20 DISPLAY_LINE1_NEXT: CLR A MOVC A,@A+DPTR ACALL SEND_DATA_BYTE INC DPTR DJNZ R6,DISPLAY_LINE1_NEXT MOV R7,#100 ACALL DELAY RET ;=================================================== ;在第二行显示 ;INPUT: DPTR指向要显示的内容 DISPLAY_LINE2: MOV A,#0C0H AJMP DISPLAY_LINE1_A ;=================================================== END 4、程序说明: 此程序是一个比较简单和基本的程序,没有太多功能,可以实现:用液晶屏显示时间、日期、星期和温度,时间、日期可调,且可以设置闹钟。 难点:对汇编程序不是太熟悉,因为设计模块稍微有点多,调用的时候总是弄混,而且,各个地址和寄存器用的比较混乱。
/
本文档为【北冬虫夏草的图片】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索