搜索
bottom↓
回复: 33

我用1602LCD做了一个电子表。

[复制链接]

出0入0汤圆

发表于 2005-3-30 18:25:35 | 显示全部楼层 |阅读模式
程序是用站上的1602LCD7线接法程序改的,硬件一样。

程序存在小BUG,我也知道,你试试就知道了,很好改,因为程序本来就很简单。

1M的时钟,每秒中断,给秒加1,并判断是不是有进位。



LCD使用中的问题:



原来以25米买了一个,但回来怎么改也不出结果,或者出乱码,或者方块。以为LCD被焊坏,又买了一个,但还是同样的结果。

想了N久(N>20天),发现1-16脚弄反了。因为我以电路板上标的1-16说明来接的,后来发现焊盘附近两端有1和16字样,和接线说明是相反的。把线反过来接,就OK了。



使用站上的程序,1号LCD正常,但2号乱码。增大延时后,就都正常了。不知道是原程序延时不够,还是LCD质量不好。



目前没有校表功能,时钟初值在编译时决定,校表我觉得也简单。



现在的问题是开机后的几秒内LCD乱码,但过一会儿就好了,可能是片内RC振荡开机时不稳所致,用晶振应该能好.现在用片内RC加标定的话,运行了一小时,误差在0.6%左右,小于DATASHEET说的1%.



ICCAVR6.31A通过。



程序下载:点击此处下载armok0143167.rar




-----此内容被fsclub于2005-03-31,10:29:39编辑过
头像被屏蔽

出0入0汤圆

发表于 2005-3-30 18:49:40 | 显示全部楼层
谢谢!



有空测试一下,看看能不能编写成范例。

出0入0汤圆

发表于 2005-12-6 16:50:48 | 显示全部楼层
好啊!armok多出些范例,我觉得对新手来说很有好处的!·

出0入0汤圆

发表于 2006-1-16 13:30:15 | 显示全部楼层
同意

出0入0汤圆

发表于 2006-1-16 16:21:45 | 显示全部楼层
这样的例子比较实际,更具体的功能就慢慢加上去就是了。像校表等功能应该不是很难的。很久前就做过(台湾的CPU)。

出0入0汤圆

发表于 2006-2-27 17:14:52 | 显示全部楼层
请问哪位朋友知道怎样确定片内RC的校准值?

出0入0汤圆

 楼主| 发表于 2006-2-28 08:55:31 | 显示全部楼层
用SLISP读出来.

出0入0汤圆

发表于 2006-4-26 13:32:37 | 显示全部楼层
To:  fsclub





"现在的问题是开机后的几秒内LCD乱码,但过一会儿就好了,可能是片内RC振荡开机时不稳所致,用晶振应该能好.现在用片内RC加标定的话,运行了一小时,误差在0.6%左右,小于DATASHEET说的1%. "





在LCD_write_char(0,0x28)前加15ms的延时就行了。



void LCD_init(void)

  {

    delay_nms(15);

    LCD_write_char(0,0x28);      //4bit test

    LCD_write_char(0,0x0c);      //显示开

    LCD_write_char(0,0x01);      //显示清屏

    delay_nms(2);

    LCD_write_char(0,0x06);      //显示光标移动设置       

  }



更改后的代码如下:

点击此处下载armok01115855.rar

出0入0汤圆

发表于 2006-4-27 17:29:28 | 显示全部楼层
我试验了一下,不过不成功。哪位网友能帮忙测试一下啊?谢谢了。(用六线驱动LCD能成功。)

出0入0汤圆

发表于 2006-6-20 10:51:39 | 显示全部楼层
我段时间正在搞LCD1602的小实验,我不会用C做我用的是汇编做的,你们能帮我看一下吗?不知道那里出错了,就是不可以用.谢谢!





        ;LCD程序实验(1602)

        DAT EQU 21H       

        RS BIT P1.2

        RW BIT P1.6

        E  BIT P1.3

         

        ;初时化

        LCD:CALL TM15MS;延时15MS

            MOV A,#38H ;工能设置DL=8位数据口

            CALL PR1

            CALL TM5MS

            MOV A,#38H

            CALL PR1

            CALL TM5MS

            MOV A,#38H

            CALL PR2

            MOV A,#38H

            CALL PR2

            MOV A,#08H;设定显示开关为关

            CALL PR2

            MOV A,#01H;清屏

            CALL PR2

            MOV A,#06H;设定数据输入法式

            CALL PR2

            MOV A,#0CH;显示屏开关设定

            RET

        ;显示数据输入

   DZP1:MOV A,#06H

        CALL PR2

        MOV A,#80H

        CALL PR2

        MOV DPTR,#TAB

        MOV R2,#12

        MOV R3,#00H

        WRIN:MOV A,R3

        MOVC A,@A+DPTR

        MOV DAT,A

        LCALL PR3

        LCALL MS_S

        INC R3

        DJNZ R2,WRIN

        SJMP $

        TAB:DB 43H,75H,72H,73H,6FH,72H,20H

        DB 57H,72H,69H,74H,65H

        ;15ms延时时间程序

        TM15MS:PUSH 07H

            PUSH 06H

            MOV R6,#30H

        D15:MOV R7,#250

            DJNZ R7,$

            DJNZ R6,D15

            POP 06H

            POP 07H

            RET

        ;5ms延时时间程序

        TM5MS:PUSH 07H

            PUSH 06H

            MOV R6,#10

         D5:MOV R7,#250

            DJNZ R7,$

            DJNZ R6,D5

            POP 06H

            POP 07H

            RET

        ;1S延时程序

        MS_S:PUSH 07H

             PUSH 06H

             MOV R6,#0FFH

        DZ:MOV R7,#250

             DJNZ R7,$

             DJNZ R6,DZ

                    POP 06H

             POP 07H

             RET

        ;写指令子程序,不查询忙标志

        PR1:CLR RS

            CLR RW

            SETB E

            MOV P0,A

            CLR E

            MOV P0,#0FFH

            RET

        ;写指令子程序,查询忙标志

        PR2:PUSH ACC

            CLR RS

            CLR RW

            SETB E

            MOV P0,A

            CLR E

            MOV P0,#0FFH

            SETB RW

        PR2_1:SETB E

            MOV A,P0

            CLR E

            JB ACC.7,PR2_1

            POP ACC

            RET

        ;写数据程序,查询忙标志

        PR3:PUSH ACC

           CLR RS

           SETB RW

        DD:  MOV P0,#0FFH

           SETB E

           MOV A,P0

           JB ACC.7,DD

           SETB RS

           CLR RW

           MOV P0,DAT

           CLR E

           RET

         

           END

出0入0汤圆

发表于 2006-6-20 11:28:48 | 显示全部楼层
这东东我搞了很长时间没有搞出来,请大伙帮帮忙.我用的是89S51

出0入0汤圆

发表于 2006-6-20 11:35:11 | 显示全部楼层
请站长帮忙搞一下我那个程序.

出0入0汤圆

发表于 2006-6-21 22:34:36 | 显示全部楼层
#include <reg51.h>

#include <stdio.h>

#include <intrins.h>



sbit    rs=P0^7;  //加上拉

sbit    rw=P0^6;  //加上拉

sbit    e =P0^5;  //加上拉

#define lcd_data  P2



//**********************************************************************

//1602LCD初始化函数

//**********************************************************************

void lcd_init(void)

             {adr_write(0x38);

                          adr_write(0x0c);

                          adr_write(0x06);

                          }

//**********************************************************************

//1602LCD查忙函数

//**********************************************************************

void checkbusy(void)

              {unsigned char temp_0;

                           unsigned char temp_1;

                           do

                           {rs=0;

                            rw=1;

                            e =0;

                            e =1;

                            temp_0=lcd_data&0x80;

                            }while(temp_0==0x80);

                                for(temp_1=0;temp_1<250;temp_1++);

                                }



//**********************************************************************

//1602LCD写地址函数

//**********************************************************************

void adr_write(unsigned char adr)

              {checkbusy();

                       e=0;

                       rs=0;

                       rw=0;

                       e=1;

                           lcd_data=adr;

                           e=0;

                           }



//**********************************************************************

//1602LCD写数据函数

//**********************************************************************

void ddr_write(unsigned char ddr)

              {checkbusy();

                           e=0;

                           rs=1;

                           rw=0;

                           e=1;

                           lcd_data=ddr;

                           e=0;

                            }



//-----------------------------------------------------------------------------

void main(void)

          {SP=0x50;

           lcd_init();       //LCD1602初始化

           adr_write(0x80);  //在第一行第一列

          ddr_write(0x30);         //显示“0”

          //........        //简单吧!我常用的,就是用51编的,可以随时移植到AVR

            }

出0入0汤圆

发表于 2006-6-21 22:47:17 | 显示全部楼层
能不能用汇编做呀?我现在学汇编还没有学C我看不懂.谢谢!

出0入0汤圆

发表于 2006-6-21 22:59:49 | 显示全部楼层
唉!我以前嫌汇编麻烦,才转换过来的,你又叫我转换回去,晕了......

下班后回家找找,看门后面有没有,说错了,呵呵!是看门后面电脑里还有没有以前汇编的备份。

出0入0汤圆

发表于 2006-6-22 08:36:55 | 显示全部楼层
谢谢你们了,我搞定了

出0入0汤圆

发表于 2006-6-22 08:43:38 | 显示全部楼层
good

出0入0汤圆

发表于 2006-6-29 08:02:09 | 显示全部楼层
y

出0入0汤圆

发表于 2006-6-30 21:31:04 | 显示全部楼层
看见fsclub 大哥的,我也想起了我前年用C51写的,绝对调试通过,如果你移植到AVR上只要改动一下头文件和引脚定义就可以了,本身我也移植过去了,但我找不到以前那个程序了,但我用ISIS 6 Professional仿真就是用些功能不能正常实现,我也比较郁闷!另外这个程序可以再压

缩很多地方,我也没有时间去搞了,你自已有时间就改动一下,如GOTO问题!



程序说明:开机显年/月/日/星期/时间/闹铃,调整时会闪动,LCD1602





点击此处下载armok01122048.rar



出0入0汤圆

发表于 2006-7-1 00:19:57 | 显示全部楼层
敢问楼上的大侠,P0.0、P0.1、P0.7、P2.7是做什么用的?

出0入0汤圆

发表于 2006-7-1 08:15:50 | 显示全部楼层
不好意思,因为时间长了,我也忘记说了。

P0.0----------外接一个LED指示灯(秒灯)

P0.1----------是控制背光的,低电平有效,也就是按下K5后。

P1.7----------也就是LCD忙查询

P2.7----------是闹铃,控制峰鸣器低电平有效

另外:        TL0+=183;TH0+=60;本身是定时50MS,但考虑到时间误差而做的补偿,走时24小时

应该误差小于1S,你先试下了,再有问题再告诉我,我QQ:690297125(10小时在线--当然是白天)

出0入0汤圆

发表于 2006-8-19 08:49:02 | 显示全部楼层
我喜欢这样的地方,更喜欢这里的人。无私的奉献!更重要的是大家都有一颗上进的心。

出0入0汤圆

发表于 2006-10-20 16:21:54 | 显示全部楼层
晕.到底系统时钟是1M还是8M啊.我下载了那个压缩包,打开里面的TXT文件.看到延时头文件里是说8M啊.到底多少啊???

出0入0汤圆

发表于 2008-6-29 13:09:27 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2009-4-21 08:35:07 | 显示全部楼层
各位单片机大侠太厉害了,能够随意改动!佩服!!
我正在做基于AVR单片机的电子时钟毕业论文,感谢大侠提供这样的平台!我想借鉴一下!
我现在仿真各位的程序和电路图,希望能够给我帮助!
我已经搜集了好多资料,可是好多的接口啊我看不明白,我用的是51系列的,对于AVR不是很熟悉
有的是C语言,有的是汇编语言,我就只能在论文中论证,那一种通过仿真就用哪个!

出0入0汤圆

发表于 2009-4-21 08:39:26 | 显示全部楼层
有没有AVR单片机设计的电子表呢!!
希望大家帮忙啊 !

出0入0汤圆

发表于 2009-4-21 08:42:32 | 显示全部楼层
C语言编写ourdev_438414.txt(文件大小:6K) (原文件名:基于avr单片机的电子时钟.txt)

出0入0汤圆

发表于 2009-4-21 08:43:47 | 显示全部楼层
希望大家帮我读一下,设计电路图!!
我对于汇编比较熟悉,C比较难一点啊 ,谢谢

出0入0汤圆

 楼主| 发表于 2009-4-21 08:44:15 | 显示全部楼层
这个就AVR的电子表啊,当年初用AVR,为了练习一下定时中断的用法,随便写了个。

出0入0汤圆

发表于 2009-4-21 16:05:26 | 显示全部楼层
我还是喜欢ICC

出0入0汤圆

发表于 2009-7-18 12:13:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-25 13:57:22 | 显示全部楼层
LZ大哥,你好!  请问下面有GICR=0x00这样一句话是什么东东?我下了自己编译,这个GICR就报错了,如果要改,我想问下应该怎么改。谢谢
void main(void)
  {  unsigned char i=0b000001;

     OSCCAL=0XBA;
     DDRD |= LCD_DATA | LCD_RW;
     DDRC |= LCD_RS   | LCD_EN;
     
     LCD_init();
     LCD_write_char(0x01,0); //stop errant interrupts until set up
     CLI(); //disable all interrupts
     timer1_init();
     MCUCR = 0x00;
     GICR = 0x00;
     TIMSK = 0x04; //timer interrupt sources
     SEI(); //re-enable interrupts
            //all peripherals are now initialized
     LCD_set_xy(3,0);
     LCD_set_xy(6,0);
     LCD_write_char(0,':');

     while(1)
     { ;}   
}

出0入0汤圆

 楼主| 发表于 2009-11-28 01:57:00 | 显示全部楼层
那玩意是ICC自己生成的,我也不知道。
你可以看看DATASHEET就知道什么意思了。

出0入0汤圆

发表于 2009-12-4 14:50:43 | 显示全部楼层
论文!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 22:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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