[STC单片机] 那位大哥哥给我发下STC8A8K64S4A12单片机液晶显示程序呀,急急急

[复制链接]
 楼主| quanxiang 发表于 2019-11-13 08:59 | 显示全部楼层 |阅读模式
123654789 发表于 2019-11-13 09:59 | 显示全部楼层
这个问题 ,跟你的什么类型的液晶有关系。

128x64

192x64

320x480
叶春勇 发表于 2019-11-13 10:05 | 显示全部楼层
淘宝买的液晶,大部分都有51,特别是那种自带字库的蓝屏128x64液晶。
coody 发表于 2019-11-14 10:27 | 显示全部楼层
LCD卖家一般都有驱动程序,改下IO、增加点延时就是了。使用传统51的黑白LCD驱动程序,用到STC8A8K上一定要增加延时,否则由于速度过快,驱动失败。彩色TFT则一般不需要修改,最多加个NOP。
何程 发表于 2019-11-15 21:49 | 显示全部楼层
  1. /*******************************************************************************
  2. *  描述:                                                                       *
  3. *      12864标准字库液晶演示 数据p0,控制p3                                     *
  4. ********************************************************************************/
  5. #include "stc8.h"
  6. #include <intrins.h>
  7. #define uchar unsigned char
  8. #define uint  unsigned int
  9. /************* 12864LCD引脚定义 *************/
  10. #define LCD_data  P0       //数据口
  11. sbit LCD_RS  =  P3^5;      //寄存器选择输入
  12. sbit LCD_RW  =  P3^6;      //液晶读/写控制
  13. sbit LCD_EN  =  P3^7;      //液晶使能控制
  14. sbit LCD_PSB =  P4^6;      //串/并方式控制
  15. sbit LCD_RST =  P4^7;      //液晶复位端口


  16. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  17. /*********************************************************/
  18. uchar code  DIS1[] = {"    启光电子    "};
  19. uchar code  DIS2[] = {"    STC15       "};
  20. uchar code  DIS3[] = {"   zq281598585  "};
  21. uchar code  DIS4[] = {"    12864test   "};
  22. /*********************************************************/






  23. /*******************************************************************/
  24. /*                                                                 */
  25. /*  延时函数                                                       */
  26. /*                                                                 */
  27. /*******************************************************************/
  28. void delay(int ms)
  29. {
  30.     while(ms--)
  31.         {
  32.       uchar i;
  33.           for(i=0;i<150;i++)  
  34.            {
  35.             _nop_();                          
  36.                 _nop_();
  37.                 _nop_();
  38.                 _nop_();
  39.            }
  40.         }
  41. }       
  42. /*******************************************************************/
  43. /*                                                                 */
  44. /*  延时函数                                                       */
  45. /*                                                                 */
  46. /*******************************************************************/
  47. void delay1(int ms)
  48. {
  49.     while(ms--)
  50.         {
  51.       uchar y;
  52.           for(y=0;y<100;y++) ;
  53.         }
  54. }                       
  55. /*******************************************************************/
  56. /*                                                                 */
  57. /*检查LCD忙状态                                                    */
  58. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  59. /*                                                                 */
  60. /*******************************************************************/
  61. bit lcd_busy()
  62. {                          
  63.     bit result;
  64.     LCD_RS = 0;
  65.     LCD_RW = 1;
  66.     LCD_EN = 1;
  67.     delayNOP();
  68.     result = (bit)(P0&0x80);
  69.     LCD_EN = 0;
  70.     return(result);
  71. }
  72. /*******************************************************************/
  73. /*                                                                 */
  74. /*写指令数据到LCD                                                  */
  75. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  76. /*                                                                 */
  77. /*******************************************************************/
  78. void lcd_wcmd(uchar cmd)
  79. {                          
  80.    while(lcd_busy());
  81.     LCD_RS = 0;
  82.     LCD_RW = 0;
  83.     LCD_EN = 0;
  84.     _nop_();
  85.     _nop_();
  86.     P0 = cmd;
  87.     delayNOP();
  88.     LCD_EN = 1;
  89.     delayNOP();
  90.     LCD_EN = 0;  
  91. }
  92. /*******************************************************************/
  93. /*                                                                 */
  94. /*写显示数据到LCD                                                  */
  95. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  96. /*                                                                 */
  97. /*******************************************************************/
  98. void lcd_wdat(uchar dat)
  99. {                          
  100.    while(lcd_busy());
  101.     LCD_RS = 1;
  102.     LCD_RW = 0;
  103.     LCD_EN = 0;
  104.     P0 = dat;
  105.     delayNOP();
  106.     LCD_EN = 1;
  107.     delayNOP();
  108.     LCD_EN = 0;
  109. }
  110. /*******************************************************************/
  111. /*                                                                 */
  112. /*  LCD初始化设定                                                  */
  113. /*                                                                 */
  114. /*******************************************************************/
  115. void lcd_init()
  116. {
  117.     LCD_PSB = 1;         //并口方式
  118.    
  119.         LCD_RST = 0;                 //液晶复位
  120.     delay(3);                  
  121.     LCD_RST = 1;      
  122.     delay(3);
  123.    
  124.     lcd_wcmd(0x34);      //扩充指令操作
  125.     delay(5);
  126.     lcd_wcmd(0x30);      //基本指令操作
  127.     delay(5);
  128.     lcd_wcmd(0x0C);      //显示开,关光标
  129.     delay(5);
  130.     lcd_wcmd(0x01);      //清除LCD的显示内容
  131.     delay(5);
  132. }
  133. /*********************************************************/
  134. /*                                                       */
  135. /* 设定显示位置                                          */
  136. /*                                                       */
  137. /*********************************************************/
  138. void lcd_pos(uchar X,uchar Y)
  139. {                          
  140.    uchar  pos;
  141.    if (X==1)
  142.      {X=0x80;}
  143.    else if (X==2)
  144.      {X=0x90;}
  145.    else if (X==3)
  146.      {X=0x88;}
  147.    else if (X==4)
  148.      {X=0x98;}
  149.    pos = X+Y ;

  150.    lcd_wcmd(pos);     //显示地址
  151. }
  152. /*********************************************************
  153. *                                                        *
  154. * 闪烁函数                                               *
  155. *                                                        *
  156. *********************************************************/
  157. void lcdflag()
  158. {
  159.    lcd_wcmd(0x08);   
  160.    delay(400);
  161.    lcd_wcmd(0x0c);   
  162.    delay(400);
  163.    lcd_wcmd(0x08);   
  164.    delay(400);
  165.    lcd_wcmd(0x0c);   
  166.    delay(400);
  167.    lcd_wcmd(0x08);   
  168.    delay(200);
  169.    lcd_wcmd(0x0c);   
  170.    delay(5);
  171.    lcd_wcmd(0x01);   
  172.    delay(5);
  173. }
  174. /*********************************************************
  175. *                                                        *
  176. * 图形显示                                               *
  177. *                                                        *
  178. *********************************************************/
  179. void photodisplay(uchar *bmp)       
  180. {
  181.   uchar i,j;

  182.   lcd_wcmd(0x34);        //写数据时,关闭图形显示

  183.   for(i=0;i<32;i++)
  184.   {
  185.     lcd_wcmd(0x80+i);    //先写入水平坐标值
  186.     lcd_wcmd(0x80);      //写入垂直坐标值
  187.     for(j=0;j<16;j++)   //再写入两个8位元的数据   
  188.     lcd_wdat(*bmp++);     
  189.     delay1(1);
  190.   }

  191.   for(i=0;i<32;i++)
  192.   {
  193.     lcd_wcmd(0x80+i);
  194.     lcd_wcmd(0x88);
  195.     for(j=0;j<16;j++)         
  196.         lcd_wdat(*bmp++);   
  197.         delay1(1);
  198.   }
  199.   lcd_wcmd(0x36);       //写完数据,开图形显示
  200. }
  201. /*********************************************************
  202. *                                                        *
  203. * 清屏函数                                               *
  204. *                                                        *
  205. *********************************************************/
  206. void  clr_screen()
  207. {
  208.    lcd_wcmd(0x34);      //扩充指令操作
  209.    delay(5);   
  210.    lcd_wcmd(0x30);      //基本指令操作
  211.    delay(5);
  212.    lcd_wcmd(0x01);      //清屏
  213.    delay(5);     
  214. }
  215. /**********************************************************
  216. ; 显示字符表代码
  217. **********************************************************/
  218. void  bytecode()
  219. {
  220.    uchar  s;
  221.    clr_screen();          //清屏   
  222.    lcd_wcmd(0x80);        //设置显示位置为第一行  
  223.    for(s=0;s<16;s++)
  224.    {
  225.      lcd_wdat(0x30+s);
  226.    }
  227.    lcd_wcmd(0x90);        //设置显示位置为第二行
  228.    for(s=0;s<16;s++)
  229.    {
  230.      lcd_wdat(0x40+s);
  231.    }
  232.    lcd_wcmd(0x88);        //设置显示位置为第三行  
  233.    for(s=0;s<16;s++)
  234.    {
  235.      lcd_wdat(0x50+s);
  236.    }
  237.    lcd_wcmd(0x98);       //设置显示位置为第四行   
  238.    for(s=0;s<16;s++)
  239.    {
  240.      lcd_wdat(0x60+s);
  241.    }
  242. }
  243. /*********************************************************
  244. *                                                        *
  245. * 主函数                                                 *
  246. *                                                        *
  247. *********************************************************/
  248. void main()
  249. {
  250.    uchar i;
  251.    delay(100);                 //上电,等待稳定
  252.    lcd_init();                 //初始化LCD

  253.      lcd_pos(1,0);             //设置显示位置为第一行
  254.      for(i=0;i<16;i++)
  255.      {
  256.        lcd_wdat(DIS1[i]);
  257.        delay(30);
  258.      }

  259.      lcd_pos(2,0);             //设置显示位置为第二行
  260.      for(i=0;i<16;i++)
  261.      {
  262.        lcd_wdat(DIS2[i]);
  263.        delay(30);
  264.      }
  265.      lcd_pos(3,0);             //设置显示位置为第三行
  266.      for(i=0;i<16;i++)
  267.      {
  268.        lcd_wdat(DIS3[i]);
  269.        delay(30);
  270.      }
  271.      lcd_pos(4,0);             //设置显示位置为第四行
  272.      for(i=0;i<16;i++)
  273.      {
  274.        lcd_wdat(DIS4[i]);
  275.        delay(30);
  276.      }
  277.          while(1);

  278. }
  279. /*********************************************************/



不知道适不适合你
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

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