[51单片机] 基于Proteus学习单片机系列(十一)——LCD12864

[复制链接]
7738|7
 楼主| 11066 发表于 2021-1-24 19:57 | 显示全部楼层 |阅读模式
本帖最后由 11066 于 2021-1-24 19:58 编辑

#申请原创# #技术资源#
回复本贴,获取更多单片机资料
https://pan.baidu.com/s/15Z8WdZUz2XXd7slChW6NAA
游客,如果您要查看本帖隐藏内容请回复


1、电路图


2、驱动代码

  1. #include <intrins.h>
  2. #include<ziku.c>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar num[] = "0123456789";        
  6. sbit REST = P2^0;                                                                                                                    //Reset signal, active"L"
  7. sbit C_D = P2^1;                                                                                                                        //L:data   H:code
  8. sbit C_E = P2^2;                                                                                                                        //Chip enable signal, active"L"
  9. sbit R_D = P2^3;                                                                                                                        //read signal, active"L"
  10. sbit W_R = P2^4;                                                                                                                        //write signal, active"L"
  11. #define width                                       15                                                                                        //显示区宽度
  12. #define Graphic                       1
  13. #define TXT                                0
  14. #define LcmLengthDots            128
  15. #define LcmWidthDots             64                                                                                                                                                                                                                                       
  16. /**************************12864液晶的相关函数**********************/                                                                           
  17. void delay_nms(uint i)
  18. {
  19.         while(i)
  20.         i--;
  21. }
  22. void write_commond(uchar com)                                                                                                //对液晶写一个指令
  23. {                                                                                          
  24.         C_E = 0;        
  25.         C_D = 1;
  26.         R_D = 1;
  27.         P0 = com;
  28.         W_R = 0;                                                                                                                                // write         
  29.         _nop_();                                       
  30.         W_R = 1;                                                                                                                                // disable write
  31.         C_E = 1;                                                                              
  32.         C_D = 0;
  33. }
  34. void write_date(uchar dat)                                                                                                        //对液晶写一个数据
  35. {
  36.         C_E = 0;
  37.         C_D = 0;
  38.         R_D = 1;
  39.         P0 = dat;
  40.         W_R = 0;
  41.         _nop_();
  42.         W_R = 1;
  43.         C_E = 1;
  44.         C_D = 1;
  45. }
  46. void write_dc(uchar com,uchar dat)                                                                                        //写一个指令和一个数据
  47. {
  48.         write_date(dat);
  49.         write_commond(com);
  50. }
  51. //写一个指令和两个数据
  52. void write_ddc(uchar com,uchar dat1,uchar dat2)
  53. {
  54.         write_date(dat1);
  55.         write_date(dat2);
  56.         write_commond(com);
  57. }
  58. //LCD初始化函数
  59. void F12864_init(void)
  60. {        
  61.         REST = 0;
  62.         delay_nms(2000);                                       
  63.         REST = 1;
  64.         write_ddc(0x40,0x00,0x00);                                                                                              //设置文本显示区首地址
  65.         write_ddc(0x41,128/8,0x00);                                                                                          //设置文本显示区宽度
  66.         write_ddc(0x42,0x00,0x08);                                                                                              //设置图形显示区首地址0x0800
  67.         write_ddc(0x43,128/8,0x00);                                                                                          //设置图形显示区宽度
  68.         write_commond(0xA0);                                                                                        //设置光标形状 8x8方块
  69.         write_commond(0x80);                                                                                        //显示方式设置 文本and图形(异或)
  70.         write_commond(0x92);                                                                                        //设置光标
  71.         write_commond(0x9F);                                                                                        //显示开关设置 文本开,图形开,光标闪烁关                                                                 
  72. }
  73. //**************************//清显示存储器函数
  74. void F12864_clear(void)
  75. {
  76.         unsigned int i;
  77.         write_ddc(0x24,0x00,0x00);                                                                                                 //置地址指针为从零开始
  78.            write_commond(0xb0);                                                                                                         //自动写
  79.         for(i = 0;i < 128 * 64 ;i++)write_date(0x00);                                                         //清一屏
  80.         write_commond(0xb2);                                                                                                         //自动写结束
  81.         write_ddc(0x24,0x00,0x00);                                                                                                 //重置地址指针
  82. }
  83. //设定显示的地址
  84. void goto_xy(uchar x,uchar y,uchar mode)
  85. {
  86.      uint  temp;
  87.      temp = 128 / 8 * y + x;
  88.      if(mode)                                                                                                 //mode = 1为Graphic
  89.      {                                                                                                        //如果图形模式要加上图形区首地址0x0800
  90.          temp = temp + 0x0100;
  91.      }
  92.      write_ddc(0x24,temp & 0xff,temp / 256);                                                                  //地址指针位置
  93. }
  94. //显示一个ASCII码函数
  95. void Putchar(uchar x,uchar y,uchar Charbyte)
  96. {
  97.      goto_xy(x,y,TXT);
  98.      write_dc(0xC4,Charbyte-32);                                                                                     //数据一次读写方式//查字符rom         
  99. }
  100. void display_string(uchar x,uchar y,uchar *p)
  101. {
  102.         while(*p != 0)
  103.         {
  104.                 if(x > 15 )                                                                                          //自动换行         128*64
  105.                 {                                                                                         
  106.                         x = 0;
  107.                         y++;
  108.                 }
  109.                 Putchar(x,y,*p);
  110.                 ++x;
  111.                 ++p;
  112.         }
  113. }
  114. void display_num(uchar x,uchar y,uchar z)
  115. {
  116.         uchar z1,z2;
  117.         z1 = num[z / 10];
  118.         z2 = num[z % 10];
  119.         Putchar(x,y,z1);
  120.         Putchar(x+1,y,z2);
  121. }


  122. //显示一串汉字,j = k + n为(n为要显示的字的个数),k为选择从哪个字开始
  123. void dprintf_hanzi_string_1(struct typFNT_GB16 code *GB_16,uint X_pos,uint Y_pos,uchar j,uchar k)
  124. {  
  125.         unsigned int address;
  126.         unsigned char m,n;
  127.         while(k < j)
  128.         {
  129.                 m = 0;
  130.                 address = LcmLengthDots / 8 * Y_pos + X_pos + 0x0800;
  131.                 for(n = 0;n < 16;n++)                                                                    //计数值16
  132.             {
  133.                    write_ddc(0x24,(uchar)(address),(uchar)(address>>8));                          //设置显示存储器地址
  134.                    write_dc(0xc0,GB_16[k].Mask[m++]);                                            //写入汉字字模左部
  135.                    write_dc(0xc0,GB_16[k].Mask[m++]);                                             //写入汉字字模右部
  136.                    address = address + 128/8;                                                   //修改显示存储器地址,显示下一列(共16列)
  137.             }
  138.                 X_pos += 2;
  139.                 k++;
  140.         }
  141. }



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
caizhiwei 发表于 2021-1-26 21:45 | 显示全部楼层
还有人玩这个嗯
lindeijun 发表于 2021-4-16 10:15 | 显示全部楼层
初学,赞一个,谢谢啦!!
2669020082 发表于 2024-8-15 18:09 | 显示全部楼层
学习学习
dyx8899 发表于 2024-8-17 19:59 | 显示全部楼层
感谢分享
zhp7607 发表于 2024-11-28 11:20 | 显示全部楼层
初学,赞一个,谢谢啦!感谢分享
夜雨依丁 发表于 2024-12-10 14:53 | 显示全部楼层
初学,赞一个,谢谢分享
STCMCUNT018 发表于 2024-12-10 16:26 | 显示全部楼层


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

14

主题

20

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部