找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6358|回复: 9
打印 上一主题 下一主题
收起左侧

LCD12864(ks0108驱动)显示时间和汉字

  [复制链接]
跳转到指定楼层
楼主
#include<reg51.h>
#include<intrins.h>
#include "shuzi.h"  //字符库头文件
#include "hanzi.h"
#define uchar unsigned char
#define uint unsigned int
uint aa,s,m,h,cc,oo;

sbit cs1=P2^3;
sbit cs2=P2^4;
sbit rw=P2^2;
sbit rs=P2^1;
sbit le=P2^0;
sbit D7=P2^6;
sbit BZ=P2^7;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;

void delay(uint t)
{
        uint i,j;
        for(i=0;i<t;i++);
        for(j=0;j<10;j++);
}

void CheckState()//状态检查               
{
   rs=0; // 数据\指令选择,D/I(RS)="L" ,表示 DB7∽DB0 为显示指令数据
   rw=1; //R/W="H" ,E="H"数据被读到DB7∽DB0
   P0=0x00;
   le=1;        //EN下降源
   delay(1);//延时
   le=0;
}

void write_com(uchar cmdcode)
{
    CheckState();//检测LCD是否忙
        rs=0;
        rw=0;
        P0=cmdcode;               
        delay(1);
        le=1;
        delay(1);
        le=0;
}

  void write_date(uchar LCDDispdata)
{
    CheckState();//检测LCD是否忙
        rs=1;
        rw=0;
        P0=LCDDispdata;         
        delay(1);
        le=1;
        delay(1);
        le=0;
}

void Clr_Scr()//清除LCD内存程序
{
        uchar j,k;
        cs1=0; //左、右屏均开显示
        cs2=0;
        write_com(0xb8+0);
        write_com(0x40+0);
        for(k=0;k<8;k++)//控制页数0-7,共8页
        {
                write_com(0xb8+k); //每页每页进行写
                  for(j=0;j<64;j++)  //每页最多可写32个中文文字或64个ASCII字符
                {
                      write_com(0x40+j);
                        write_date(0x00);//控制列数0-63,共64列,写点内容,列地址自动加1
                }
        }
}

void lcd_werite_x_y(uchar x,uchar y)  //左右屏显示设置
{
          y=y&0x7f;                                 //限定范围,列不能超过128
          x=x&0x07;                             //限定范围,行不能超过8
          if(y<64)                    //如果列小于64
          {
                    cs1=1;                  //选通左半屏
                    cs2=0;                  //关闭右半屏
                    write_com(0x40+y);  //将列地址写入  
          }
          else
          {
                    cs1=0;                  //关闭左半屏
                    cs2=1;                  //选通右半屏
                    y&=0x3f;
                    write_com(0x40+y);  //将列地址写入         
          }
          write_com(0xb8+x);      //将行地址写入       
}

void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat) //左右屏显示设置
{
      uchar i=0;
          lcd_werite_x_y(x,y);            //设定起始地址
          for(i=0;i<8;i++)
          {
                  write_date(dat[en*16+i]);
          }   //先写上半个字,共8个字节
          lcd_werite_x_y(x+1,y);          //设定起始地址,此次将行地址加1,以便写下行
          for(i=0;i<8;i++)
          {
              write_date(dat[en*16+8+i]);
          } //再写下半个字,共8个字节
}

void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat)
{
          uchar i=0;       
          lcd_werite_x_y(x,y);             //设定起始地址
          for(i=0;i<16;i++)
          write_date(dat[hz*32+i]);    //先写上半个字,共16个字节
          lcd_werite_x_y(x+1,y);           //设定起始地址,此次将行地址加1,以便写下行
          for(i=0;i<16;i++)
          write_date(dat[hz*32+16+i]); //再写下半个字,共16个字节
}

void time_shuzi()
{
                lcd_write_english(3,80,s/10,SHUZI);
                lcd_write_english(3,88,s%10,SHUZI);
                lcd_write_english(3,72,10,SHUZI);
                lcd_write_english(3,56,m/10,SHUZI);
                lcd_write_english(3,64,m%10,SHUZI);
                lcd_write_english(3,48,10,SHUZI);
                lcd_write_english(3,32,h/10,SHUZI);
                lcd_write_english(3,40,h%10,SHUZI);       
}

void time_week()
{
                lcd_write_english(0,8,2,SHUZI);
                lcd_write_english(0,16,0,SHUZI);
                lcd_write_english(0,24,1,SHUZI);
                lcd_write_english(0,32,8,SHUZI);
                lcd_write_chinese(0,40,9,HANZI);//年
                lcd_write_english(0,56,1,SHUZI);
                lcd_write_english(0,64,1,SHUZI);
                lcd_write_chinese(0,70,10,HANZI);// 月
                lcd_write_english(0,88,1,SHUZI);
                lcd_write_english(0,96,0,SHUZI);//日
                lcd_write_chinese(0,104,11,HANZI);

                lcd_write_chinese(3,0,12,HANZI);
                lcd_write_chinese(3,112,13,HANZI);

        //        lcd_write_chinese(6,0,14,HANZI);
        //        lcd_write_chinese(6,16,15,HANZI);
        //        lcd_write_chinese(6,32,16,HANZI);
        //        lcd_write_chinese(6,48,17,HANZI);

                lcd_write_chinese(6,80,0,HANZI);
                lcd_write_chinese(6,96,1,HANZI);
                lcd_write_chinese(6,112,6,HANZI);
       
}

void time_clock()
{
        if(cc==h&&oo==m)
        {
                BZ=~BZ;
                delay(10000);
        }
        lcd_write_chinese(6,0,14,HANZI); //闹
        lcd_write_chinese(6,16,15,HANZI);//        钟
        lcd_write_english(6,32,cc/10,SHUZI);
        lcd_write_english(6,40,cc%10,SHUZI);
        lcd_write_english(6,48,10,SHUZI);
        lcd_write_english(6,56,oo/10,SHUZI);
        lcd_write_english(6,64,oo%10,SHUZI);

}

void keyscna()
{
       
}

void init1()
{
          TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        s=0;
        m=55;
        h=8;
        cc=12;
        oo=0;
        BZ=0;
}

   void init()//初始化
{

        delay(2);       
        cs1=1;//刚开始关闭两屏
        cs2=1;
        delay(2);
        write_com(0x3e);         //写初始化命令
        write_com(0xb8+0);
        write_com(0xc0+0);
        write_com(0x40+0);
        write_com(0x3f);

}

void main()
{
        init1();
        init();
        Clr_Scr();
        while(1)
        {
                BZ=1;
                delay(10000);
                BZ=0;
                time_shuzi();
                time_week();
                time_clock();
        }
}

void time() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;
        if(aa==20)
        {
                aa=0;
                s++;
                if(s==60)
                {
                        s=0;
                        m++;
                        if(m==60)
                        {
                                m=0;
                                h++;
                                if(h==24)
                                {
                                        h=0;
                                }
                        }
                }
        }
}


12864.jpg (31.08 KB, 下载次数: 108)

12864.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:437013 发表于 2019-5-27 22:40 | 只看该作者
不错的资料
回复

使用道具 举报

板凳
ID:421017 发表于 2019-8-8 22:13 | 只看该作者
为什么要把VOUT接到V0,不接可以吗,VOUT输出-5V
回复

使用道具 举报

地板
ID:236699 发表于 2019-8-13 14:03 | 只看该作者
康泽威 发表于 2019-8-8 22:13
为什么要把VOUT接到V0,不接可以吗,VOUT输出-5V

有的可以,有的不可以,有的要接R103\R104电位器,不则屏不显示。
回复

使用道具 举报

5#
ID:282095 发表于 2019-8-13 15:42 | 只看该作者
要接入电位器啊 不然肯定是无法操作的哦
回复

使用道具 举报

6#
ID:584814 发表于 2019-10-11 15:35 | 只看该作者
shuzi.h和hanzi.h在哪里 ?
回复

使用道具 举报

7#
ID:151654 发表于 2019-10-19 15:58 | 只看该作者
不错的样子
回复

使用道具 举报

8#
ID:155507 发表于 2020-10-3 11:46 | 只看该作者
man1234567 发表于 2019-10-11 15:35
shuzi.h和hanzi.h在哪里 ?

shuzi.h
  1. #ifndef __SHUZI_H__
  2. #define __SHUZI_H__
  3. #define uchar unsigned char

  4. //取模软件:zimo221
  5. //取模方式:纵向取模  字节倒序
  6. uchar code SHUZI[]=
  7. {
  8. /*--  文字:  0  --*/
  9. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  10. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
  11. 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
  12. /*--  文字:  1  --*/
  13. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  14. 0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,
  15. 0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,
  16. /*--  文字:  2  --*/
  17. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  18. 0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,
  19. 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
  20. /*--  文字:  3  --*/
  21. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  22. 0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,
  23. 0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,
  24. /*--  文字:  4  --*/
  25. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  26. 0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,
  27. 0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,
  28. /*--  文字:  5  --*/
  29. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  30. 0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,
  31. 0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,
  32. /*--  文字:  6  --*/
  33. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  34. 0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,
  35. 0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,
  36. /*--  文字:  7  --*/
  37. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  38. 0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,
  39. 0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,
  40. /*--  文字:  8  --*/
  41. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  42. 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
  43. 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
  44. /*--  文字:  9  --*/
  45. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  46. 0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,
  47. 0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,
  48. /*--  文字:  -  --*/
  49. ///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  50. //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  51. //0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
  52. };
  53. #endif
复制代码

hanzi.h
  1. #ifndef __HANZI_H__
  2. #define __HANZI_H__
  3. #define uchar unsigned char

  4. //取模软件:zimo221
  5. //取模方式:纵向取模  字节倒序
  6. uchar code HANZI[]=
  7. {
  8. /*--  文字:  星  --*/
  9. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  10. 0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,
  11. 0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,
  12. 0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,
  13. 0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00,

  14. /*--  文字:  期  --*/
  15. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  16. 0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,
  17. 0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
  18. 0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,
  19. 0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00,

  20. /*--  文字:  一  --*/
  21. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  22. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
  23. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
  24. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  25. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  26. /*--  文字:  二  --*/
  27. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  28. 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,
  29. 0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
  30. 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
  31. 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,

  32. /*--  文字:  三  --*/
  33. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  34. 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,
  35. 0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
  36. 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  37. 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

  38. /*--  文字:  四  --*/
  39. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  40. 0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,
  41. 0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
  42. 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,
  43. 0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,

  44. /*--  文字:  五  --*/
  45. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  46. 0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,
  47. 0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,
  48. 0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,
  49. 0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00,

  50. /*--  文字:  六  --*/
  51. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  52. 0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,
  53. 0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  54. 0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,
  55. 0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,

  56. /*--  文字:  日  --*/
  57. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  58. 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,
  59. 0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
  60. 0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,
  61. 0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
  62. };
  63. #endif
复制代码

回复

使用道具 举报

9#
ID:780879 发表于 2020-10-3 14:02 | 只看该作者
启发很多
回复

使用道具 举报

10#
ID:600695 发表于 2022-9-21 22:21 | 只看该作者
没跑起来,不知道问题出在那
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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