找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2561|回复: 0
收起左侧

新手汇编写的LCD1602数字时钟调不出来求指正

[复制链接]
ID:118098 发表于 2016-7-29 16:08 | 显示全部楼层 |阅读模式
汇编写的LCD1602数字时钟调不出来,一直显示白屏,用C语言写 的就没有问题很好用,两种代码都贴出来,求指正汇编写的问题出在那里好多天了
汇编的代码
;中断控制定时  1602屏显数字电子时钟

RS bit P2.6
RW bit P2.5
E  bit P2.7
LCD EQU P0       
SECOND EQU 60H                         ;秒数存储
MINUTE EQU 61H                         ;份钟存储
HOUR EQU 62H                         ;小时存储
ORG 0000H
AJMP INIT_LCD                         ;初始化
ORG 000BH                        
AJMP TIME0                                 ;中断入口
ORG 0030H
MIAN:
AJMP MIAN                                                          
INIT_LCD:
MOV B,#10
MOV SECOND,#0
MOV MINUTE,#0
MOV HOUR,#12                          ;12小时
MOV TMOD,00000001B
MOV TH0,#3CH
MOV TL0,#0B0H
SETB ET0
SETB EA
SETB TR0
;MOV TCON,#00010000B         ;开启计时
MOV LCD,#00111000B
ACALL WR_COMM
MOV LCD,#00001110B
ACALL WR_COMM
MOV LCD,#00000100B                 ;当读或写一个字符后地址指纹减1
ACALL WR_COMM
MOV LCD,#00000001B
ACALL WR_COMM


MOV LCD,#87H                         ;液晶屏第一行第8个字位
ACALL WR_COMM

MOV A,HOUR
DIV AB
MOV LCD,A
ACALL WR_DATA
MOV LCD,B
ACALL WR_DATA

MOV A,MINUTE
DIV AB
MOV LCD,A
ACALL WR_DATA
MOV LCD,B
ACALL WR_DATA

MOV A,SECOND
DIV AB
MOV LCD,A
ACALL WR_DATA
MOV LCD,B
ACALL WR_DATA

MOV LCD,#47H                ; 液晶屏第二行第8个字位
ACALL WR_COMM
;MOV LCD,#'0'
;ACALL WR_COMM
RET
TIME0:
PUSH ACC
MOV R1,#20                     ;定时1秒
DJNZ R1,JIXU
INC SECOND                ;秒数
MOV A,SECOND
MOV R2,SECOND
DIV AB
MOV LCD,B
ACALL WR_DATA
MOV LCD,A
ACALL WR_DATA
MOV LCD,#':'
ACALL WR_DATA          
CJNE R2,#60,JIXU
MOV SECOND,#0
INC MINUTE                ;分钟
MOV A,MINUTE
MOV R2,MINUTE
DIV AB
MOV LCD,B
ACALL WR_DATA
MOV LCD,A
ACALL WR_DATA
MOV LCD,#':'
ACALL WR_DATA       
CJNE R2,#60,JIXU
MOV MINUTE,#0
INC HOUR           ;小时
MOV A,HOUR
MOV R2,HOUR
DIV AB
MOV LCD,B
ACALL WR_DATA
MOV LCD,A
ACALL WR_DATA
CJNE R2,#24,JIXU
MOV HOUR,#0
JIXU:                                          ;中断延时
POP ACC
MOV TH0,#3CH
MOV TL0,#0B0H
RETI
WR_COMM:                                  ;写指令
CLR RS
CLR RW
CLR E
ACALL CHECK_BF
;ACALL DLY1
SETB E
;ACALL DLY1
CLR E
RET

WR_DATA:                                   ;写数据
SETB RS
CLR RW
CLR E
ACALL CHECK_BF       
;ACALL DLY1
SETB E
;ACALL DLY1
;CLR E
RET
CHECK_BF:                           ;判断忙子程序
MOV LCD,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB LCD.7,CHECK_BF
RET
DLY1S:MOV R5,#1           ;cpu延时
DLY1:MOV R6,#100
DLY2:MOV R7,#100
     DJNZ R7,$
         DJNZ R6,DLY2
        ; DJNZ R5,DLY1
RET
END


C语言写的没问题很好用
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^6;
sbit rw=P2^5;
sbit lcden=P2^7;
//LCD EQU P0
uchar code table[]="  2016-7-26 MON";
uchar code table1[]="    23:59:00";
uint count,shi,fen,miao;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--) ;
       
}
void write_com(uchar com)
{
        rs=0;
        rw=0;
        lcden=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void write_date(uchar date)
{
        rs=1;
        rw=0;
        lcden=0;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init()
{
        uchar num;
        lcden=0;          //自己加的
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
        for(num=0;num<15;num++)
        {
                 write_date(table[num]);
                 delay(5);
        }
        write_com(0x80+0x40);
        for(num=0;num<12;num++)
        {
                 write_date(table1[num]);
                 delay(5);       
        }
        TMOD=0X01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void write_sfm(uchar add,uchar date)
{
    uchar shi,ge;
        shi=date/10;
        ge=date%10;
        write_com(0X80+0x40+add);
        write_date(0x30+shi);                                //这里解释了为什么在上面加上23:59:00
        write_date(0x30+ge);
}
void main()
{
        init();
        while(1)
   {
        if(count==20)        //定时1秒种
        {
                count=0;
                miao++;
                if(miao==60)
                {
                        miao=0;
                        fen++;
                        if(fen==60)
                        {
                                fen=0;
                                shi++;
                                if(shi==24)
                                {
                                        shi=0;
                                }
                                write_sfm(4,shi);
                        }
                        write_sfm(7,fen);
                }
                write_sfm(10,miao);
        }
  }
        //while(1);
}
void timer0()  interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表