找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD12864显示黑屏,怎么解决,想显示汉字

[复制链接]
跳转到指定楼层
楼主

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

使用道具 举报

沙发
ID:96682 发表于 2022-3-30 20:58 来自手机 | 只看该作者
已知的条件出现这结果不意外
回复

使用道具 举报

板凳
ID:155507 发表于 2022-3-30 21:50 | 只看该作者
这个是无字库的12864屏 KS0108驱动


  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/

  4. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  5. /*---------------------------------------------------------------------*/



  6. /*************  本程序功能说明  **************

  7. 驱动LCD128*64黑白点阵屏.

  8. 用户可以修改宏来选择时钟频率.

  9. 显示效果为: 第一行显示模拟的RTC时间, 7、8行显示8个16*16点的汉字. 本程序使用的LCD是有两个片选的.

  10. 注意: LCD接口的16脚是空脚, 本程序要把这个脚接到P2.2做另一页的片选.

  11. ******************************************/


  12. #include    "reg51.h"
  13. #include    "intrins.h"

  14. #define     MAIN_Fosc       11059200L   //定义主时钟

  15. typedef     unsigned char   u8;
  16. typedef     unsigned int    u16;
  17. typedef     unsigned long   u32;

  18. sfr TH2  = 0xD6;
  19. sfr TL2  = 0xD7;
  20. sfr IE2   = 0xAF;
  21. sfr INT_CLKO = 0x8F;
  22. sfr AUXR = 0x8E;
  23. sfr AUXR1 = 0xA2;
  24. sfr P_SW1 = 0xA2;
  25. sfr P_SW2 = 0xBA;
  26. sfr S2CON = 0x9A;
  27. sfr S2BUF = 0x9B;

  28. sfr ADC_CONTR = 0xBC;   //带AD系列
  29. sfr ADC_RES   = 0xBD;   //带AD系列
  30. sfr ADC_RESL  = 0xBE;   //带AD系列
  31. sfr P1ASF = 0x9D;   //只写,模拟输入(AD或LVD)选择

  32. sfr P4   = 0xC0;
  33. sfr P5   = 0xC8;
  34. sfr P6   = 0xE8;
  35. sfr P7   = 0xF8;
  36. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  37. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  38. sfr P0M1 = 0x93;
  39. sfr P0M0 = 0x94;
  40. sfr P2M1 = 0x95;
  41. sfr P2M0 = 0x96;
  42. sfr P3M1 = 0xB1;
  43. sfr P3M0 = 0xB2;
  44. sfr P4M1 = 0xB3;
  45. sfr P4M0 = 0xB4;
  46. sfr P5M1 = 0xC9;
  47. sfr P5M0 = 0xCA;
  48. sfr P6M1 = 0xCB;
  49. sfr P6M0 = 0xCC;
  50. sfr P7M1 = 0xE1;
  51. sfr P7M0 = 0xE2;

  52. sbit P00 = P0^0;
  53. sbit P01 = P0^1;
  54. sbit P02 = P0^2;
  55. sbit P03 = P0^3;
  56. sbit P04 = P0^4;
  57. sbit P05 = P0^5;
  58. sbit P06 = P0^6;
  59. sbit P07 = P0^7;
  60. sbit P10 = P1^0;
  61. sbit P11 = P1^1;
  62. sbit P12 = P1^2;
  63. sbit P13 = P1^3;
  64. sbit P14 = P1^4;
  65. sbit P15 = P1^5;
  66. sbit P16 = P1^6;
  67. sbit P17 = P1^7;
  68. sbit P20 = P2^0;
  69. sbit P21 = P2^1;
  70. sbit P22 = P2^2;
  71. sbit P23 = P2^3;
  72. sbit P24 = P2^4;
  73. sbit P25 = P2^5;
  74. sbit P26 = P2^6;
  75. sbit P27 = P2^7;
  76. sbit P30 = P3^0;
  77. sbit P31 = P3^1;
  78. sbit P32 = P3^2;
  79. sbit P33 = P3^3;
  80. sbit P34 = P3^4;
  81. sbit P35 = P3^5;
  82. sbit P36 = P3^6;
  83. sbit P37 = P3^7;
  84. sbit P40 = P4^0;
  85. sbit P41 = P4^1;
  86. sbit P42 = P4^2;
  87. sbit P43 = P4^3;
  88. sbit P44 = P4^4;
  89. sbit P45 = P4^5;
  90. sbit P46 = P4^6;
  91. sbit P47 = P4^7;
  92. sbit P50 = P5^0;
  93. sbit P51 = P5^1;
  94. sbit P52 = P5^2;
  95. sbit P53 = P5^3;
  96. sbit P54 = P5^4;
  97. sbit P55 = P5^5;
  98. sbit P56 = P5^6;
  99. sbit P57 = P5^7;


  100. /*************  IO口定义    **************/
  101. sbit    P_HC595_SER   = P4^0;   //pin 14    SER     data input
  102. sbit    P_HC595_RCLK  = P5^4;   //pin 12    RCLk    store (latch) clock
  103. sbit    P_HC595_SRCLK = P4^3;   //pin 11    SRCLK   Shift data clock

  104. u8  hour,minute,second;


  105. void  delay_ms(u8 ms);
  106. void DisableHC595(void);
  107. void SetStartAddress(u8 x,u8 y);
  108. void FillPage(u8 y,u8 color);           //Clear Page LCD RAM
  109. void FillAll(u8 color);         //Clear CSn LCD RAM
  110. void Initialize_LCD(void);              //initialize LCD
  111. void WriteAscii6x8(u8 x,u8 y,u8 ascii,u8 color);
  112. void WriteHZ16(u8 x,u8 y,u16 hz,u8 color);
  113. #define P0n_push_pull(bitn)         P0M1 &= ~(bitn),    P0M0 |=  (bitn) //01


  114. /****************  外部函数声明和外部变量声明 *****************/


  115. /********************** 显示时钟函数 ************************/
  116. void    DisplayRTC(void)
  117. {
  118.     if(hour >= 10)  WriteAscii6x8(0,0,hour / 10 + '0',0);
  119.     else            WriteAscii6x8(0,0,':',0);
  120.     WriteAscii6x8(6, 0,hour % 10 +'0',0);
  121.     WriteAscii6x8(12,0,':',0);
  122.     WriteAscii6x8(18,0,minute / 10+'0',0);
  123.     WriteAscii6x8(24,0,minute % 10+'0',0);
  124.     WriteAscii6x8(30,0,':',0);
  125.     WriteAscii6x8(36,0,second / 10 +'0',0);
  126.     WriteAscii6x8(42,0,second % 10 +'0',0);

  127. }

  128. /********************** RTC演示函数 ************************/
  129. void    RTC(void)
  130. {
  131.     if(++second >= 60)
  132.     {
  133.         second = 0;
  134.         if(++minute >= 60)
  135.         {
  136.             minute = 0;
  137.             if(++hour >= 24)    hour = 0;
  138.         }
  139.     }
  140. }



  141. /********************** 主函数 ************************/
  142. void main(void)
  143. {
  144.     u8  i;

  145.     P0M1 = 0;   P0M0 = 0;   //设置为准双向口
  146.     P1M1 = 0;   P1M0 = 0;   //设置为准双向口
  147.     P2M1 = 0;   P2M0 = 0;   //设置为准双向口
  148.     P3M1 = 0;   P3M0 = 0;   //设置为准双向口
  149.     P4M1 = 0;   P4M0 = 0;   //设置为准双向口
  150.     P5M1 = 0;   P5M0 = 0;   //设置为准双向口
  151.     P6M1 = 0;   P6M0 = 0;   //设置为准双向口
  152.     P7M1 = 0;   P7M0 = 0;   //设置为准双向口

  153.     Initialize_LCD();

  154.     DisableHC595();     //禁止掉学习板上的HC595显示,省电
  155.    
  156.     hour   = 12;    //初始化时间值
  157.     minute = 0;
  158.     second = 0;
  159.     DisplayRTC();

  160.     for(i=0; i<8; i++)  WriteHZ16(i*16,4,i,0);

  161.     while(1)
  162.     {
  163.         delay_ms(250);      //延时1秒
  164.         delay_ms(250);
  165.         delay_ms(250);
  166.         delay_ms(250);
  167.         RTC();
  168.         DisplayRTC();
  169.     }
  170. }
  171. /**********************************************/

  172. //========================================================================
  173. // 函数: void  delay_ms(u8 ms)
  174. // 描述: 延时函数。
  175. // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
  176. // 返回: none.
  177. // 版本: VER1.0
  178. // 日期: 2013-4-1
  179. // 备注:
  180. //========================================================================
  181. void  delay_ms(u8 ms)
  182. {
  183.      u16 i;
  184.      do{
  185.           i = MAIN_Fosc / 13000;
  186.           while(--i)    ;   //14T per loop
  187.      }while(--ms);
  188. }

  189. void DisableHC595(void)
  190. {      
  191.     u8  i;
  192.     P_HC595_SER   = 1;
  193.     for(i=0; i<20; i++)
  194.     {
  195.         P_HC595_SRCLK = 1;
  196.         P_HC595_SRCLK = 0;
  197.     }
  198.     P_HC595_RCLK = 1;
  199.     P_HC595_RCLK = 0;                           //锁存输出数据
  200.     P_HC595_RCLK = 1;
  201.     P_HC595_RCLK = 0;                           //锁存输出数据
  202. }


  203. unsigned char code HZK16[]={
  204.     0X10,0X50,0X92,0X14,0XF0,0X10,0X20,0X24,0X24,0XA4,0X24,0XFF,0X20,0X24,0X28,0X00,        //1783斌
  205.     0X20,0X10,0X0D,0X02,0X05,0X18,0X40,0X7F,0X40,0X3F,0X22,0X07,0X38,0X40,0XE0,0X00,
  206.     0X20,0X42,0X0C,0X40,0X7C,0X40,0XFF,0X48,0X4A,0XF2,0X1A,0XD6,0X12,0XFB,0X12,0X00,        //1784濒
  207.     0X04,0X7C,0X03,0X44,0X23,0X10,0X0F,0X84,0X82,0X4F,0X20,0X1F,0X20,0X4F,0XC0,0X00,
  208.     0X20,0X42,0X0C,0XD0,0X0C,0X04,0XE4,0XA4,0XA5,0X96,0X94,0XC4,0X84,0X14,0X0C,0X00,        //1785滨
  209.     0X04,0X04,0XFE,0X09,0X08,0X88,0X6F,0X28,0X08,0X08,0X2F,0X48,0XC8,0X0C,0X08,0X00,
  210.     0X00,0X10,0X0C,0X04,0XE4,0XA4,0XA5,0XA6,0X94,0X94,0XD4,0X84,0X14,0X0C,0X00,0X00,        //1786宾
  211.     0X08,0X08,0X08,0X88,0X6F,0X28,0X08,0X08,0X08,0X2F,0X48,0XC8,0X08,0X0C,0X08,0X00,
  212.     0X10,0X10,0X10,0XFF,0X90,0X5C,0X04,0XE4,0XA4,0XA5,0X96,0XD4,0X84,0X14,0X0C,0X00,        //1787摈
  213.     0X02,0X42,0X81,0X7F,0X08,0X08,0X88,0X6F,0X28,0X08,0X08,0X2F,0X48,0XCC,0X08,0X00,
  214.     0X00,0X00,0X00,0X00,0XFC,0X44,0X44,0X44,0X42,0XC2,0X43,0X62,0X40,0X00,0X00,0X00,        //1788兵
  215.     0X04,0X04,0X84,0X44,0X27,0X34,0X04,0X04,0X04,0X17,0X24,0X64,0XC4,0X06,0X04,0X00,
  216.     0X00,0X02,0X04,0XCC,0X20,0X20,0XA0,0X60,0XFF,0XC0,0X20,0X10,0X08,0X0C,0X00,0X00,        //1789冰
  217.     0X02,0X02,0XFF,0X10,0X08,0X06,0X41,0X80,0X7F,0X00,0X01,0X02,0X0C,0X18,0X08,0X00,
  218.     0X10,0X10,0XD0,0XFF,0X90,0X14,0XC4,0X44,0X44,0XFC,0X44,0X44,0X44,0XE6,0X44,0X00,        //1790柄
  219.     0X04,0X03,0X00,0XFF,0X00,0X01,0XFF,0X08,0X04,0X03,0X02,0X44,0X8C,0X7F,0X00,0X00,
  220. };


  221. unsigned char code ASCII6x8[]={
  222.       0x3E,0x51,0x49,0x45,0x3E,0x00,        //0  0
  223.       0x00,0x42,0x7F,0x40,0x00,0x00,        //1  1
  224.       0x42,0x61,0x51,0x49,0x46,0x00,        //2  2
  225.       0x21,0x41,0x45,0x4B,0x31,0x00,        //3  3
  226.       0x18,0x14,0x12,0x7F,0x10,0x00,        //4  4
  227.       0x27,0x45,0x45,0x45,0x39,0x00,        //5  5
  228.       0x3C,0x4A,0x49,0x49,0x30,0x00,        //6  6
  229.       0x01,0x01,0x79,0x05,0x03,0x00,        //7  7
  230.       0x36,0x49,0x49,0x49,0x36,0x00,        //8  8
  231.       0x06,0x49,0x49,0x29,0x1E,0x00,        //9  9
  232.       0x7E,0x11,0x11,0x11,0x7E,0x00,        //A  A
  233.       0x41,0x7F,0x49,0x49,0x36,0x00,        //B  B
  234.       0x3E,0x41,0x41,0x41,0x22,0x00,        //C  C
  235.       0x41,0x7F,0x41,0x41,0x3E,0x00,        //D  D
  236.       0x7F,0x49,0x49,0x49,0x49,0x00,        //E  E
  237.       0x7F,0x09,0x09,0x09,0x01,0x00,        //F  F

  238.       0x3E,0x51,0x49,0x45,0x3E,0x00,        //10  0
  239.       0x00,0x42,0x7F,0x40,0x00,0x00,        //11  1
  240.       0x42,0x61,0x51,0x49,0x46,0x00,        //12  2
  241.       0x21,0x41,0x45,0x4B,0x31,0x00,        //13  3
  242.       0x18,0x14,0x12,0x7F,0x10,0x00,        //14  4
  243.       0x27,0x45,0x45,0x45,0x39,0x00,        //15  5
  244.       0x3C,0x4A,0x49,0x49,0x30,0x00,        //16  6
  245.       0x01,0x01,0x79,0x05,0x03,0x00,        //17  7
  246.       0x36,0x49,0x49,0x49,0x36,0x00,        //18  8
  247.       0x06,0x49,0x49,0x29,0x1E,0x00,        //19  9
  248.       0x7E,0x11,0x11,0x11,0x7E,0x00,        //1A  A
  249.       0x41,0x7F,0x49,0x49,0x36,0x00,        //1B  B
  250.       0x3E,0x41,0x41,0x41,0x22,0x00,        //1C  C
  251.       0x41,0x7F,0x41,0x41,0x3E,0x00,        //1D  D
  252.       0x7F,0x49,0x49,0x49,0x49,0x00,        //1E  E
  253.       0x7F,0x09,0x09,0x09,0x01,0x00,        //1F  F

  254.       0x00,0x00,0x00,0x00,0x00,0x00,        //20     CHAR address=ASCII*6
  255.       0x00,0x00,0x4F,0x00,0x00,0x00,        //21  !
  256.       0x00,0x07,0x00,0x07,0x00,0x00,        //22  "
  257.       0x14,0x7F,0x14,0x7F,0x14,0x00,        //23  #
  258.       0x24,0x2A,0x7F,0x2A,0x12,0x00,        //24  $
  259.       0x23,0x13,0x08,0x64,0x62,0x00,        //25  %
  260.       0x36,0x49,0x55,0x22,0x50,0x00,        //26  &
  261.       0x00,0x05,0x03,0x00,0x00,0x00,        //27  '
  262.       0x00,0x1C,0x22,0x41,0x00,0x00,        //28  (
  263.       0x00,0x41,0x22,0x1C,0x00,0x00,        //29  )
  264.       0x14,0x08,0x3E,0x08,0x14,0x00,        //2A  *
  265.       0x08,0x08,0x3E,0x08,0x08,0x00,        //2B  +
  266.       0x00,0x50,0x30,0x00,0x00,0x00,        //2C  ,
  267.       0x08,0x08,0x08,0x08,0x08,0x00,        //2D  -
  268.       0x00,0x60,0x60,0x00,0x00,0x00,        //2E  .
  269.       0x20,0x10,0x08,0x04,0x02,0x00,        //2F  /
  270.       
  271.       0x3E,0x51,0x49,0x45,0x3E,0x00,        //30  0
  272.       0x00,0x42,0x7F,0x40,0x00,0x00,        //31  1
  273.       0x42,0x61,0x51,0x49,0x46,0x00,        //32  2
  274.       0x21,0x41,0x45,0x4B,0x31,0x00,        //33  3
  275.       0x18,0x14,0x12,0x7F,0x10,0x00,        //34  4
  276.       0x27,0x45,0x45,0x45,0x39,0x00,        //35  5
  277.       0x3C,0x4A,0x49,0x49,0x30,0x00,        //36  6
  278.       0x01,0x01,0x79,0x05,0x03,0x00,        //37  7
  279.       0x36,0x49,0x49,0x49,0x36,0x00,        //38  8
  280.       0x06,0x49,0x49,0x29,0x1E,0x00,        //39  9
  281.       0x00,0x36,0x36,0x00,0x00,0x00,        //3A  :
  282.       0x00,0x56,0x36,0x00,0x00,0x00,        //3B  ;
  283.       0x08,0x14,0x22,0x41,0x00,0x00,        //3C  <
  284.       0x14,0x14,0x14,0x14,0x14,0x00,        //3D  =
  285.       0x00,0x41,0x22,0x14,0x08,0x00,        //3E  >
  286.       0x02,0x01,0x51,0x09,0x06,0x00,        //3F  ?
  287.       
  288.       0x32,0x49,0x79,0x41,0x3E,0x00,        //40  @
  289.       0x7E,0x11,0x11,0x11,0x7E,0x00,        //41  A
  290.       0x41,0x7F,0x49,0x49,0x36,0x00,        //42  B
  291.       0x3E,0x41,0x41,0x41,0x22,0x00,        //43  C
  292.       0x41,0x7F,0x41,0x41,0x3E,0x00,        //44  D
  293.       0x7F,0x49,0x49,0x49,0x49,0x00,        //45  E
  294.       0x7F,0x09,0x09,0x09,0x01,0x00,        //46  F
  295.       0x3E,0x41,0x41,0x49,0x7A,0x00,        //47  G
  296.       0x7F,0x08,0x08,0x08,0x7F,0x00,        //48  H
  297.       0x00,0x41,0x7F,0x41,0x00,0x00,        //49  I
  298.       0x20,0x40,0x41,0x3F,0x01,0x00,        //4A  J
  299.       0x7F,0x08,0x14,0x22,0x41,0x00,        //4B  K
  300.       0x7F,0x40,0x40,0x40,0x40,0x00,        //4C  L
  301.       0x7F,0x02,0x0C,0x02,0x7F,0x00,        //4D  M
  302.       0x7F,0x06,0x08,0x30,0x7F,0x00,        //4E  N
  303.       0x3E,0x41,0x41,0x41,0x3E,0x00,        //4F  O
  304.       
  305.       0x7F,0x09,0x09,0x09,0x06,0x00,        //50  P
  306.       0x3E,0x41,0x51,0x21,0x5E,0x00,        //51  Q
  307.       0x7F,0x09,0x19,0x29,0x46,0x00,        //52  R
  308.       0x26,0x49,0x49,0x49,0x32,0x00,        //53  S
  309.       0x01,0x01,0x7F,0x01,0x01,0x00,        //54  T
  310.       0x3F,0x40,0x40,0x40,0x3F,0x00,        //55  U
  311.       0x1F,0x20,0x40,0x20,0x1F,0x00,        //56  V
  312.       0x7F,0x20,0x18,0x20,0x7F,0x00,        //57  W
  313.       0x63,0x14,0x08,0x14,0x63,0x00,        //58  X
  314.       0x07,0x08,0x70,0x08,0x07,0x00,        //59  Y
  315.       0x61,0x51,0x49,0x45,0x43,0x00,        //5A  Z
  316.       0x00,0x7F,0x41,0x41,0x00,0x00,        //5B  {
  317.       0x02,0x04,0x08,0x10,0x20,0x00,        /*5C  \*/
  318.       0x00,0x41,0x41,0x7F,0x00,0x00,        //5D  }
  319.       0x04,0x02,0x01,0x02,0x04,0x00,        //5E  ^
  320.       0x40,0x40,0x40,0x40,0x40,0x00,        //5F  _
  321.       
  322.       0x01,0x02,0x04,0x00,0x00,0x00,        //60  '
  323.       0x20,0x54,0x54,0x54,0x78,0x00,        //61  a
  324.       0x7F,0x48,0x44,0x44,0x38,0x00,        //62  b
  325.       0x38,0x44,0x44,0x44,0x28,0x00,        //63  c
  326.       0x38,0x44,0x44,0x48,0x7F,0x00,        //64  d
  327.       0x38,0x54,0x54,0x54,0x18,0x00,        //65  e
  328.       0x00,0x08,0x7E,0x09,0x02,0x00,        //66  f
  329.       0x0C,0x52,0x52,0x4C,0x3E,0x00,        //67  g
  330.       0x7F,0x08,0x04,0x04,0x78,0x00,        //68  h
  331.       0x00,0x44,0x7D,0x40,0x00,0x00,        //69  i
  332.       0x20,0x40,0x44,0x3D,0x00,0x00,        //6A  j
  333.       0x00,0x7F,0x10,0x28,0x44,0x00,        //6B  k
  334.       0x00,0x41,0x7F,0x40,0x00,0x00,        //6C  l
  335.       0x7C,0x04,0x78,0x04,0x78,0x00,        //6D  m
  336.       0x7C,0x08,0x04,0x04,0x78,0x00,        //6E  n
  337.       0x38,0x44,0x44,0x44,0x38,0x00,        //6F  o
  338.       
  339.       0x7E,0x0C,0x12,0x12,0x0C,0x00,        //70  p
  340.       0x0C,0x12,0x12,0x0C,0x7E,0x00,        //71  q
  341.       0x7C,0x08,0x04,0x04,0x08,0x00,        //72  r
  342.       0x58,0x54,0x54,0x54,0x64,0x00,        //73  s
  343.       0x04,0x3F,0x44,0x40,0x20,0x00,        //74  t
  344.       0x3C,0x40,0x40,0x3C,0x40,0x00,        //75  u
  345.       0x1C,0x20,0x40,0x20,0x1C,0x00,        //76  v
  346.       0x3C,0x40,0x30,0x40,0x3C,0x00,        //77  w
  347.       0x44,0x28,0x10,0x28,0x44,0x00,        //78  x
  348.       0x1C,0xA0,0xA0,0x90,0x7C,0x00,        //79  y
  349.       0x44,0x64,0x54,0x4C,0x44,0x00,        //7A  z
  350.       0x00,0x08,0x36,0x41,0x00,0x00,        //7B  {
  351.       0x00,0x00,0x77,0x00,0x00,0x00,        //7C  |
  352.       0x00,0x41,0x36,0x08,0x00,0x00,        //7D  }
  353.       0x02,0x01,0x02,0x04,0x02,0x00,        //7E  ~
  354.       0xFF,0xFF,0xFF,0xFF,0xFF,0x00,        //7F  all display
  355.       0xFF,0x00,0x00,0x00,0x00,0x00};       //80  cursor



  356. /*************  功能说明    **************

  357. LCD12864的基本驱动程序,兼容IC:HD61202 KS0108B SED1520.

  358. ******************************************/



  359. /********************* LCD 128*64 Module, Controler HD61202U *************************************
  360.     R_W     L: write data to LCD;  H: read data from LCD
  361.     RS      L: Instruction Code Input or state output;   H: data input or output
  362.     RESET   H: normal work;     L: reset LCD
  363.     CS1     H: disable Pice 1,  L:enable Pice 1
  364.     CS2     H: disable Pice 2,  L:enable Pice 2
  365.     CS3     H: disable Pice 3,  L:enable Pice 3
  366.     E       L: disable;    H: read State or data from LCD;
  367.             H-->L: write command or data to LCD

  368.     D0~D7   Data bus

  369.     RS  R/W   
  370.     0    0    :write command to LCD
  371.     0    1    :read  status from LCD
  372.     1    0    :write display data to LCD
  373.     1    1    :read  display data from LCD

  374. ;********************************************************************************/

  375. #define C_Busy          0x80
  376. #define C_On_Off        0x20
  377. #define C_Reset         0x10
  378. #define LCD_On          0x3F
  379. #define LCD_Off         0x3E
  380. #define LCD_StartLine0  0xC0    //Set display start line(0~3FH), real start line=(0C0H+Line Number)
  381. #define LCD_Page0       0xB8    //Set Page (X Address)(0~7), real page = 0B8H+Page Number
  382. #define LCD_SetColumn0  0x40    //Set Y address (0~3FH), real column = 40H + column number

  383.                             //  1----VSS
  384.                             //  2----VDD    +5V
  385.                             //  3----Vo     LCD Opration Voltage
  386. sbit RS         =   P2^5;   //  4----RS     L-->Command,H-->Data
  387. sbit R_W        =   P2^6;   //  5----R_W    L-->Write,  H-->Read
  388. sbit LCD_EN     =   P2^7;   //  6----E      H-->L: write command or data to LCD,H: read State or data from LCD;
  389. sfr  LCD_DATA   =   0x80;   //  7~14--D0~D7 Data bus
  390. sbit CS1        =   P2^4;   //  15---CS1    L-->Chip select1
  391. sbit CS2        =   P2^2;   //  16---CS2    L-->Chip select2
  392. sbit LCD_RESET  =   P2^3;   //  17---RESET  L-->Enable
  393.                             //  18---VEE    L-->Chip select3
  394.                             //  19---LED-   LED A   Back Light LED Drive
  395.                             //  20---LED+   LED K   Back Light LED Drive
  396. sbit LCD_BUSY   =   LCD_DATA^7;

  397. #define CMD_WriteCMD()      RS=0, R_W=0
  398. #define CMD_ReadStatus()    RS=0, R_W=1
  399. #define CMD_WriteData()     RS=1, R_W=0
  400. #define CMD_ReadData()      RS=1, R_W=1

  401. #define SELECT      1
  402. #define UNSELECT    0




  403. //******************************************

  404. void    LCD_delay(void)
  405. {
  406.     u8  i;
  407. //  i = (u8)(MAIN_Fosc / 2000000UL);
  408.     i = (u8)(MAIN_Fosc / 1000000UL);
  409.     while(--i)  ;
  410. }

  411. //******************************************
  412. u8  CheckBusy(void) //不需要检测忙
  413. {
  414. /*
  415.     u8  i;
  416.     LCD_DATA = 0xFF;
  417.     CMD_ReadStatus();
  418.     LCD_EN = 1;
  419.     LCD_delay();
  420.     for(i=0; i<100; i++)        //检测忙, 一般最大 大约10us,  这个使用超时退出
  421.     {
  422.         if(LCD_BUSY == 0)   break;      //  11T / loop, 0.5us at 11.0592MHZ
  423.     }
  424.     LCD_EN = 0;
  425.     if(i >= 100)    return 1;   //超时
  426. */
  427.     return  0;                  //正确
  428. }


  429. //******************************************
  430. void WriteCMD(u8 cmd)
  431. {
  432.     if(CheckBusy() > 0)     return; //检测忙错误

  433.     CMD_WriteCMD();
  434.     LCD_DATA = cmd;
  435.     LCD_delay();
  436.     LCD_EN = 1;
  437.     LCD_delay();
  438.     LCD_EN = 0;
  439.     LCD_delay();
  440.     LCD_DATA = 0xFF;
  441. }

  442. //******************************************
  443. void WriteData(u8 dat)          //write display data to LCD
  444. {
  445.     if(CheckBusy() > 0)     return; //检测忙错误

  446.     CMD_WriteData();
  447.     LCD_DATA = dat;
  448.     LCD_delay();
  449.     LCD_EN = 1;
  450.     LCD_delay();
  451.     LCD_EN = 0;
  452.     LCD_DATA = 0xFF;
  453. }

  454. //******************************************
  455. void SetStartAddress(u8 x,u8 y)
  456. {
  457.     WriteCMD(x + LCD_SetColumn0);
  458.     WriteCMD(y + LCD_Page0);
  459. }

  460. //******************************************
  461. void FillPage(u8 y,u8 color)            //Clear Page LCD RAM
  462. {
  463.     u8 j;
  464.     SetStartAddress(0,y);
  465.     for(j=0; j<64; j++) WriteData(color);
  466. }

  467. //******************************************
  468. void FillAll(u8 color)          //Clear CSn LCD RAM
  469. {
  470.     u8 i;
  471.     for(i=0; i<8; i++)  FillPage(i,color);
  472. }


  473. //******************************************
  474. void Initialize_LCD(void)               //initialize LCD
  475. {
  476.     LCD_RESET = 0;
  477.     delay_ms(10);
  478.     LCD_RESET = 1;
  479.     delay_ms(150);

  480. //  CS1 = SELECT;
  481. //  CS2 = SELECT;
  482.     WriteCMD(LCD_Off);          //0x3E    turn off LCD
  483.     WriteCMD(LCD_StartLine0);   //#0C0H    set the start line is the first line
  484.     WriteCMD(LCD_On);           //#3FH    turn on display
  485.     FillAll(0);
  486.     CS1 = UNSELECT;
  487.     CS2 = UNSELECT;
  488. }


  489. //******************************************
  490. void WriteAscii6x8(u8 x,u8 y,u8 ascii,u8 color)
  491. {
  492.     u8 code *p;
  493.     u8 i;
  494.    
  495.     p = ascii * 6 + ASCII6x8;
  496.     if(x < 64)      CS1 = SELECT;
  497.     else            CS2 = SELECT,   x -= 64;
  498.     SetStartAddress(x,y);
  499.     for(i=0; i<6; i++)      {WriteData((*p) ^ color);   p++;}
  500.     CS1 = UNSELECT;
  501.     CS2 = UNSELECT;
  502. }

  503. //******************************************
  504. void WriteHZ16(u8 x,u8 y,u16 hz,u8 color)
  505. {
  506.     u8 code *p;
  507.     u8 i;

  508.     p = hz * 32 + HZK16;

  509.     if(x < 64)      CS1 = SELECT;
  510.     else            CS2 = SELECT,   x -= 64;
  511.     SetStartAddress(x,y);
  512.     for(i=0; i<16; i++)     {WriteData((*p) ^ color);   p++;}
  513.    
  514.     SetStartAddress(x,y+1);
  515.     for(i=0; i<16; i++)     {WriteData((*p) ^ color);   p++;}
  516.     CS1 = UNSELECT;
  517.     CS2 = UNSELECT;
  518. }

复制代码


回复

使用道具 举报

地板
ID:494908 发表于 2022-3-30 22:02 | 只看该作者
wc86110 发表于 2022-3-30 20:58
已知的条件出现这结果不意外

Proteus里的12864,就是我仿真里用的这个,能通过程序直接显示汉字吗?我查百度说什么无字库?
回复

使用道具 举报

5#
ID:96682 发表于 2022-3-31 03:40 来自手机 | 只看该作者
用板凳的基于 KS0108 的点阵屏,有字库的得下载第三方仿真文件并安装才行
回复

使用道具 举报

6#
ID:91580 发表于 2022-3-31 07:31 | 只看该作者
本身电路图就没画对,黑屏不奇怪了。
回复

使用道具 举报

7#
ID:494908 发表于 2022-3-31 14:43 | 只看该作者
fsss007 发表于 2022-3-31 07:31
本身电路图就没画对,黑屏不奇怪了。

哪个部分没接好?
回复

使用道具 举报

8#
ID:161164 发表于 2022-3-31 16:38 | 只看该作者
米霁113 发表于 2022-3-31 14:43
哪个部分没接好?

CS1/CS2
回复

使用道具 举报

9#
ID:494908 发表于 2022-4-1 13:31 | 只看该作者

我用的并行方式,还需要连接CS吗
回复

使用道具 举报

10#
ID:941205 发表于 2022-4-1 16:53 | 只看该作者
你在论坛里搜LCD12864就能找到无字库仿真的PROTUES程序了。
回复

使用道具 举报

11#
ID:264021 发表于 2022-4-1 18:58 | 只看该作者
仿真图画的不对,CS1,CS2要用I/O口控制的,他分别控制12864的左边和右边的显示,你看一下数据手册就明白了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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