[活动专区] 【赛元95F】 + 4、SC95F8617驱动16位并行总线LCD扫屏

[复制链接]
1715|6
 楼主| tlled 发表于 2020-3-23 08:18 | 显示全部楼层 |阅读模式
    使用SC95F8617驱动16位总线LCD显示屏,刷屏显示红、绿、蓝三色。


   一、电路图


    使用SC95F8617的P3口+74LVC16245+74HC573扩展成16位总线的方式。电路如下:
    01.png


    二、程序

    2.1、main.c

  1. #include "config.h"

  2. void main(void)
  3. {
  4.         uint i=0;
  5.         Init_led();
  6.         Init_lcd();
  7.         LCD_Fill(0,0,LCD_X,LCD_Y,RED);
  8.         while(1)
  9.         {
  10.                 LED0=0;
  11.                 LED1=1;
  12.                 LED2=0;
  13.                 LED3=1;
  14.                 //LCD_BK=0;
  15.                 LCD_Fill(0,0,LCD_X,LCD_Y,GREEN);
  16.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  17.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  18.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  19.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  20.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  21.                 LCD_Fill(0,0,LCD_X,LCD_Y,BLUE);
  22.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  23.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  24.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  25.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  26.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  27.                 LCD_Fill(0,0,LCD_X,LCD_Y,RED);
  28.                 LED0=1;
  29.                 LED1=0;
  30.                 LED2=1;
  31.                 LED3=0;
  32.                 //LCD_BK=1;
  33.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  34.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  35.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  36.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  37.                 for(i=0;i<50000;i++);for(i=0;i<50000;i++);
  38.                
  39.         }
  40. }

    2.2、lcd.c
  1. #include "config.h"

  2. void delay(uint ds)
  3. {
  4.         uint dsi,dsj;
  5.         for(dsj=0;dsj<ds;dsj++)
  6.         {
  7.                 for(dsi=0;dsi<200;dsi++);
  8.         }
  9. }


  10. static void lcd_Reset(void)
  11. {
  12.     LCD_RST=1;   
  13.     delay(1);
  14.     LCD_RST=0;  
  15.     delay(500);
  16.           LCD_RST=1;   
  17.     delay(500);            
  18. }

  19. void lcd_sendat(uint16_t dat)
  20. {
  21.         uchar i;
  22.         LCD_DIR=1;    //A->B
  23.         LCD_EN=0;     //2A->2B
  24.         P3=dat;                //D7..D0;
  25.         LCD_LE=1;
  26.         for(i=0;i<10;i++);
  27.         LCD_LE=0;
  28.         P3=dat>>8;   //D7..D0;
  29. }

  30. void LCD_WR_CMD(uint16_t LCD_Reg)
  31. {
  32.         LCD_CS=0;  //cs=0
  33.   LCD_RS=0;  //rs=0
  34.         LCD_RD=1;  //rd=1
  35.        
  36.   LCD_WR=0;  //wr=0
  37.         lcd_sendat(LCD_Reg);
  38.         //GPIO_Write(GPIOE, LCD_Reg);
  39.   LCD_WR=1;   //wr=1
  40.   LCD_CS=1;   //cs=1
  41.         LCD_RS=1;   //rs=1
  42. }

  43. void LCD_WR_DATA(uint16_t LCD_Data)       
  44. {
  45.         LCD_RS=1;  //rs=1
  46.   LCD_CS=0;  //cs=0
  47.   LCD_RD=1;  //rd=1       
  48.         LCD_WR=0;  //wr=0
  49.         lcd_sendat(LCD_Data);
  50.        
  51.         LCD_WR=1;   //wr=1
  52.   LCD_CS=1;   //cs=1
  53.        
  54. }

  55. void LCD_WriteReg(uint16_t reg,uint16_t val)
  56. {
  57.         LCD_WR_CMD(reg);
  58.         LCD_WR_DATA(val);
  59. }










  60. void Init_lcd(void)
  61. {
  62.         P4CON |= 0xff;  
  63.         P3CON |= 0xff;
  64.         P5CON |= 0x20; //0010 0000
  65.        
  66.         LCD_BK=1;
  67.         lcd_Reset();
  68.        
  69.         LCD_WriteReg(0x0000,0x0001);
  70.         delay(10);
  71.         LCD_WriteReg(0x00A4,0x0001);
  72.         delay(10);
  73.         LCD_WriteReg(0x0070,0x9B00);
  74.         delay(10);
  75.         LCD_WriteReg(0x0007,0x0031);
  76.         delay(10);
  77.         //power supply setting
  78.         LCD_WriteReg(0x0018,0x0001);
  79.         delay(5);
  80.         LCD_WriteReg(0x0010,0x16B0);     
  81.         delay(5);
  82.         LCD_WriteReg(0x0011,0x0200);
  83.         delay(5);
  84.         LCD_WriteReg(0x0012,0x1118);
  85.         delay(5);
  86.         LCD_WriteReg(0x0013,0x880F);
  87.         delay(5);
  88.         LCD_WriteReg(0x0014,0x0000);
  89.         delay(5);
  90.         LCD_WriteReg(0x0012,0x1138);
  91.         delay(5);
  92.         LCD_WriteReg(0x0090,0x0004);
  93.         LCD_WriteReg(0x0091,0x0000);
  94.         LCD_WriteReg(0x0092,0x0007);
  95.         LCD_WriteReg(0x0098,0x0002);
  96.         //display contral
  97.         LCD_WriteReg(0x0001,0x0100);
  98.         LCD_WriteReg(0x0002,0x0400);
  99.         LCD_WriteReg(0x0003,0x1030);
  100.         LCD_WriteReg(0x0008,0x0708);
  101.         LCD_WriteReg(0x0070,0x1B00);
  102.         LCD_WriteReg(0x0071,0x0001);
  103.         //gamma contral
  104.         LCD_WriteReg(0x0030,0x0305);
  105.         LCD_WriteReg(0x0031,0x0005);
  106.         LCD_WriteReg(0x0032,0x0000);
  107.         LCD_WriteReg(0x0033,0x0003);
  108.         LCD_WriteReg(0x0034,0x0900);
  109.         LCD_WriteReg(0x0035,0x0607);
  110.         LCD_WriteReg(0x0036,0x0307);
  111.         LCD_WriteReg(0x0037,0x0305);
  112.         LCD_WriteReg(0x0038,0x1305);
  113.         LCD_WriteReg(0x0039,0x1C00);
  114.         LCD_WriteReg(0x003A,0x1500);
  115.         //panel interface
  116.         LCD_WriteReg(0x0020,0x0000);
  117.         LCD_WriteReg(0x0021,0x0000);
  118.         //address set
  119.         LCD_WriteReg(0x0050,0x0000);
  120.         LCD_WriteReg(0x0051,LCD_X);
  121.         LCD_WriteReg(0x0052,0x0000);
  122.         LCD_WriteReg(0x0053,LCD_Y);//176*220
  123.         //display on
  124.         delay(5);

  125.         LCD_WriteReg(0x0007,0x0001);
  126.         delay(10);
  127.         LCD_WriteReg(0x0007,0x0021);
  128.         delay(10);
  129.         LCD_WriteReg(0x0007,0x0233);
  130. }



  131. void LCD_SetPos(uint16_t x,uint16_t y)
  132. {
  133.     LCD_WriteReg(0x0020, x & 0xFF);
  134.     LCD_WriteReg(0x0021, y & 0x1FF);
  135.        
  136.     LCD_WR_CMD(0x0022);//?GRAM
  137. }

  138. void LCD_Fill(uint16_t x,uint16_t y,uint16_t x_len,uint16_t y_len,uint16_t Color)
  139. {
  140.    uint16_t i,j;
  141.        
  142.         for(i = y;i < y+y_len;i ++)
  143.         {
  144.                 j = x;
  145.                 LCD_SetPos(j,i);
  146.                
  147.                 for(;j < x+x_len;j ++)
  148.                 {
  149.                         LCD_WR_DATA(Color);
  150.                 }
  151.         }
  152. }

    2.3、lcd.h
  1. #ifndef _LCD_H_
  2. #define _LCD_H_
  3. #include "mytype.h"

  4. sbit LCD_BK = P4^0;   
  5. sbit LCD_RST = P4^1;

  6. sbit LCD_RD = P4^2;
  7. sbit LCD_WR = P4^3;
  8. sbit LCD_RS = P4^4;
  9. sbit LCD_CS = P4^5;
  10. sbit LCD_EN = P4^6;
  11. sbit LCD_DIR = P4^7;
  12. sbit LCD_LE = P5^5;



  13. #define LCD_X 176
  14. #define LCD_Y 220

  15. #define        BLACK        0x0000
  16. #define        BLUE        0x001F
  17. #define        RED         0xF800
  18. #define        GREEN         0x07E0
  19. #define CYAN        0x07FF
  20. #define MAGENTA 0xF81F
  21. #define YELLOW        0xFFE0
  22. #define WHITE        0xFFFF       
  23. #define BACKCOLOR 0xFFFF       
  24. #define        WORDCOLOR 0x0000





  25. void Init_lcd(void);
  26. void LCD_Fill(uint16_t x,uint16_t y,uint16_t x_len,uint16_t y_len,uint16_t Color);
  27.        

  28. #endif



   三、运行结果

100.gif


   
WoodData 发表于 2020-3-23 09:23 | 显示全部楼层
支持一下,效果不错啊,就是屏刷新不够快啊。
 楼主| tlled 发表于 2020-3-23 09:29 | 显示全部楼层
WoodData 发表于 2020-3-23 09:23
支持一下,效果不错啊,就是屏刷新不够快啊。

手机拍摄的效果不好。刷屏颜色之间加有延时
qwe123zxc 发表于 2020-3-23 09:42 来自手机 | 显示全部楼层
程序都有,支持,这么好的程序
 楼主| tlled 发表于 2020-3-23 09:59 | 显示全部楼层
qwe123zxc 发表于 2020-3-23 09:42
程序都有,支持,这么好的程序

共同学习
xiaoqizi 发表于 2020-4-3 18:23 | 显示全部楼层
非常感谢楼主分享
wowu 发表于 2020-4-3 18:23 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

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