找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2744|回复: 3
收起左侧

HDG12864L-6 STC15W4K32S4仿真显示文字

[复制链接]
ID:44037 发表于 2021-1-11 22:06 | 显示全部楼层 |阅读模式
HDG12864L-6 STC15W4K32S4仿真显示文字 程序来源于网上

个人学习 领会 理解  程序通过  仿真显示如下
  1. #include "STC15W4K32S4.h"     //单片机定义文件
  2. #include "intrins.h"          //调用_nop_();延时函数用
  3. #include "pixel.h"            //字符和汉字

  4. #define LCD_Data_Out P0

  5. sbit  RW = P1^0;
  6. sbit  RS = P1^1;
  7. sbit  RST= P1^2;
  8. sbit  CS = P1^3;
  9. sbit  E  = P1^4;

  10. #define X_WIDTH 132
  11. #define Y_WIDTH 64

  12. //*****************延时********************
  13. void delay_ms(uint t)
  14. {
  15.          int ii,jj;
  16.          if(t<1)  t=1;
  17.          for(ii = 0; ii < t; ii++)
  18.           for(jj = 0; jj < 2670; jj++);    //busclk:16MHz--1ms
  19. }
  20. /***************************LCD12864************************/
  21. //**************************写命令**************************
  22. void LCD_WrCmd(byte cmd)      //写命令
  23. {
  24.          RS = 0;  CS = 0;  RW = 0;  E = 1;
  25.          P0 = cmd;
  26.          _nop_();
  27.    E = 0;
  28. }
  29. //**************************写数据**************************
  30. void LCD_WrDat(byte date)      //--写数据
  31. {
  32.    RS = 1;  CS = 0;  RW = 0;  E = 1;
  33.    P0 = date;
  34.    _nop_();
  35.    E = 0;
  36. }
  37. //************************清屏*****************************
  38. void LCD_Fill(byte bmp_data)
  39. {
  40.          byte y,x;
  41.          for(y = 0; y < 8; y++)     //分页,总共8页
  42.          {
  43.                   LCD_WrCmd(0xb0+y);      //设置页地址
  44.                   LCD_WrCmd(0x01);        //设置column地址低地址
  45.                   LCD_WrCmd(0x10);        //设置column地址高地址
  46.                   for(x = 0; x < X_WIDTH; x++)
  47.        LCD_WrDat(bmp_data);
  48.    }
  49. }
  50. //*************************定指针坐标***********************
  51. void LCD_Set_Pos(byte x, byte y)    //定坐标,指针的位置
  52. {
  53.          LCD_WrCmd(0xb0+y);               //定初始页 ---P39
  54.          LCD_WrCmd(((x&0xf0)>>4)|0x10);   //坐标在column的位置MSB ---P40
  55.          LCD_WrCmd((x&0x0f)|0x01);        //LSB 0X01 ---P40
  56. }
  57. //************************LCD初始化*************************
  58. void LCD_Init(void)
  59. {
  60.          RST = 0;                //指令表---P37
  61.          delay_ms(10);
  62.          RST = 1;
  63.          delay_ms(0);
  64.          LCD_WrCmd(0xaf);        //0xaf LCD On ---P39
  65.          LCD_WrCmd(0x2f);        //0x2f 设置上电控制模式 ---P44
  66.          LCD_WrCmd(0x81);        //0x81 电量设置模式(显示亮度---P45
  67.          LCD_WrCmd(0x1a);        //指令数据0x0000~0x003f
  68.          LCD_WrCmd(0x24);        //0x24 V5内部电压调节电阻设置---P45
  69.          LCD_WrCmd(0xa2);        //0xa2 5V,0xa1 3V3   LCD偏压设置---P42
  70.          LCD_WrCmd(0xc0);        //0xc8 正常,0xc0 倒置  Com 扫描方式设置
  71.          LCD_WrCmd(0xa1);        //0xa0 正常,0xa1 反向  Segment方向选择---P42
  72.          LCD_WrCmd(0xa4);        //0xa4 全屏点亮/变暗指令 ---P42
  73.          LCD_WrCmd(0xa6);        //0xa6 正向反向显示控制指令 ---P42
  74.          LCD_WrCmd(0xac);        //0xac 关闭静态指示器---P46
  75.          LCD_WrCmd(0x00);        //指令数据  
  76.          LCD_WrCmd(0x40+32);     //0x40+32 设置显示起始行对应RAM---P39
  77.          LCD_Fill(0x00);         //初始清屏
  78.          LCD_Set_Pos(0,0);       //指针的位置
  79. }
  80. /******************************输出字符****************************/
  81. void LCD_P6x8Str(byte x,byte y,byte ch[])    //输入字符
  82. {
  83.          byte c = 0, i = 0, j = 0;
  84.          while(ch[j]!='\0')
  85.    {
  86.                   c = ch[j]-48;      //F6x8[c][i]从032开始建立ASCLL码数组,要查找,需减32
  87.                   if(x>126)
  88.         { x=0;y++; }
  89.       LCD_Set_Pos(x,y);
  90.       for(i=0;i<6;i++)
  91.       LCD_WrDat(F6x8[c][i]);
  92.       x += 6;
  93.       j++;
  94.    }
  95. }
  96. void LCD_P8x16Str(byte x,byte y,byte ch[])
  97. {
  98.          
  99. }
  100. /******************************输出汉字字符串***********************/
  101. void LCD_P14x16Str(byte x,byte y,byte ch[])
  102. {
  103.          byte wm=0,ii = 0;      //字节:0xff
  104.          uint adder = 1;        //字:0xffff
  105.          while(ch[ii] != '\0')
  106.    {
  107.                   wm = 0;
  108.                   adder = 1;
  109.                   while(F14x16_Idx[wm] > 127)  //why
  110.       {
  111.          if(F14x16_Idx[wm] == ch[ii])
  112.          {
  113.             if(F14x16_Idx[wm + 1] == ch[ii + 1])
  114.             {
  115.                adder = wm * 14;
  116.                break;
  117.             }
  118.          }
  119.          wm += 2;
  120.       }
  121.       if(x>118)
  122.         { x=0; y++; }
  123.                         LCD_Set_Pos(x, y);
  124.                         if(adder != 1)          //显示汉字
  125.                   {
  126.          LCD_Set_Pos(x, y);
  127.          for(wm = 0; wm < 14; wm++)
  128.          {
  129.                                     LCD_WrDat(F14x16[adder]);
  130.                                     adder += 1;
  131.                                  }
  132.                                  LCD_Set_Pos(x,y + 1);
  133.                                  for(wm = 0; wm < 14; wm++)
  134.                                  {
  135.                                           LCD_WrDat(F14x16[adder]);
  136.                                           adder += 1;
  137.                                  }
  138.                         }
  139.                         else       //显示空白字符
  140.                         {
  141.          ii += 1;
  142.          LCD_Set_Pos(x,y);
  143.          for(wm = 0; wm < 16; wm++)
  144.          {
  145.             LCD_WrDat(0);
  146.          }
  147.          LCD_Set_Pos(x,y + 1);
  148.          for(wm = 0; wm < 16; wm++)
  149.          {
  150.             LCD_WrDat(0);
  151.          }
  152.       }
  153.       x += 14;
  154.       ii += 2;
  155.    }
  156. }
  157. //******************输出汉字和字符混合字符串**********************
  158. void LCD_Print(byte x, byte y, byte ch[])
  159. {
  160.          byte ch2[3];
  161.          byte ii = 0;
  162.          while(ch[ii] != '\0')
  163.          {
  164.                   if(ch[ii] > 127)       //汉字的码>127
  165.                   {
  166.                           ch2[0] = ch[ii];
  167.                           ch2[1] = ch[ii + 1];
  168.                           ch2[2] = '\0';       //汉字为两个字节
  169.                           LCD_P14x16Str(x, y, ch2);   //显示汉字
  170.                           x += 14;                    //不太理解
  171.                           ii += 2;
  172.       }
  173.                         else
  174.                   {
  175.                                 ch2[0] = ch[ii];
  176.                                 ch2[1] = '\0';              //字母占一个字节
  177.                                 LCD_P8x16Str(x, y, ch2);    //显示字母
  178.                                 x += 8;
  179.         ii += 1;
  180.       }
  181.    }
  182. }
  183. void Draw_BMP(byte x0,byte y0,byte x1,byte y1,byte bmp[])
  184. {
  185.        
  186. }
  187. /**********************主函数*******************************/
  188. main()
  189. {
  190.          LCD_Init();     //LCD初始化
  191.          while(1)
  192.    {
  193.                   LCD_P6x8Str(0,5,"51");
  194.                   LCD_Print(12,4,"黑电子论坛");
  195.                   LCD_P6x8Str(12,7,"51");
  196.                   LCD_Print(24,14,"黑电子论坛");
  197.                   LCD_P6x8Str(24,9,"51");
  198.                   LCD_Print(36,0,"黑电子论坛");
  199.                   LCD_P6x8Str(33,2,"============");
  200.                   LCD_P6x8Str(0,3,"http:www51heicom");
  201.    }
  202. }
复制代码
      2021a.jpg

请教老师
1.void LCD_P8x16Str(byte x,byte y,byte ch[])
    8*16  数字函数 怎么写?
2. 8*16 数字怎么取模?
3.void Draw_BMP(byte x0,byte y0,byte x1,byte y1,byte bmp[])
   显示图片函数 怎么写?


回复

使用道具 举报

ID:44037 发表于 2021-1-11 22:08 | 显示全部楼层
2021.jpg
回复

使用道具 举报

ID:390416 发表于 2021-1-12 11:57 | 显示全部楼层
LCD12864中文资料包 容易看明白  http://www.51hei.com/bbs/dpj-200462-1.html

不知道我分享的资料 是不是和你的LCD一样能用呢?
回复

使用道具 举报

ID:44037 发表于 2021-1-12 14:52 | 显示全部楼层
谢谢  不是我需要的
   上面程序有 14*16 函数   需要写8*16 函数
          8*16 数字取模   不知方法  主要是如文字 取模  需 放倒 反转 取模  才能正确 显示
  显示图片函数
只有  void Draw_BMP(byte x0,byte y0,byte x1,byte y1,byte bmp[])  没有内容
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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