返回列表 发新帖我要提问本帖赏金: 500.00元(功能说明)

[通用8051核FLASH系列] 【HC89S001P芯片试用】2、彩色显示屏驱动--刷屏

[复制链接]
 楼主| tlled 发表于 2019-3-23 18:05 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-24 14:58 编辑

    使员工HC89S001P芯片驱动LCD显示屏,刷屏显示

    一、电路图

    P04 -- SCLK
    P03 -- SDA  
    P00 -- RES
    P02 -- RS
    03233.png

    二、程序
  1. #include "config.h"
  2. #include "lcd.h"
  3. #include "oledfont.h"
  4. //#include "delay.h"


  5. //延时函数 1MS
  6. void delay_ms(uchar dt)
  7. {
  8.         uchar di,dj,dk;

  9.         for(dk=0;dk<dt;dk++)
  10.         {
  11.                 for(dj=0;dj<16;dj++)
  12.                 {
  13.                         for(di=0;di<196;di++);
  14.                 }
  15.         }
  16. }



  17. u16 BACK_COLOR, POINT_COLOR;   //背景色,画笔色
  18. void LCD_Writ_Bus(char dat)   //串行数据写入
  19. {        
  20.         u8 i;                          
  21.         for(i=0;i<8;i++)
  22.         {                          
  23.                 OLED_SCLK_Clr();
  24.                 if(dat&0x80)
  25.                    OLED_SDIN_Set();
  26.                 else
  27.                         OLED_SDIN_Clr();
  28.                         OLED_SCLK_Set();
  29.                 dat<<=1;   
  30.         }                        
  31. }

  32. void LCD_WR_DATA8(char da) //发送数据-8位参数
  33. {        
  34.         OLED_DC_Set();
  35.         LCD_Writ_Bus(da);  

  36. }  
  37. void LCD_WR_DATA(int da)
  38. {
  39.         OLED_DC_Set();
  40.         LCD_Writ_Bus(da>>8);
  41.         LCD_Writ_Bus(da);

  42. }         
  43. void LCD_WR_REG(char da)         
  44. {        
  45.         OLED_DC_Clr();
  46.         LCD_Writ_Bus(da);
  47. //        OLED_CS_Set();
  48. }
  49. void LCD_WR_REG_DATA(int reg,int da)
  50. {
  51.         LCD_WR_REG(reg);
  52.         LCD_WR_DATA(da);
  53. }

  54. void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
  55. {
  56.         LCD_WR_REG(0x2a);
  57.    LCD_WR_DATA8(x1>>8);
  58.    LCD_WR_DATA8(x1);
  59.    LCD_WR_DATA8(x2>>8);
  60.    LCD_WR_DATA8(x2);
  61.   
  62.    LCD_WR_REG(0x2b);
  63.    LCD_WR_DATA8(y1>>8);
  64.    LCD_WR_DATA8(y1);
  65.    LCD_WR_DATA8(y2>>8);
  66.    LCD_WR_DATA8(y2);

  67.    LCD_WR_REG(0x2C);                                                                                          
  68. }

  69. void lcd_port_init(void)
  70. {
  71.         
  72.         P0M0 = P0M1&0xF0|0x08;                                        //P00设置为推挽输出
  73.         P0M1 = P0M1&0xF0|0x08;                                        //P02设置为推挽输出
  74.         P0M1 = P0M1&0x0F|0x80;                                        //P03设置为推挽输出
  75.         P0M2 = P0M2&0xF0|0x08;                                        //P04设置为推挽输出               

  76. }

  77. void Lcd_Init(void)
  78. {
  79.         uint32_t i;
  80.         lcd_port_init();
  81.         
  82.         OLED_RST_Clr();
  83.         delay_ms(5);
  84.         OLED_RST_Set();
  85.         delay_ms(5);
  86.         
  87.         LCD_WR_REG(0x11);
  88.         OLED_RST_Clr();
  89.         delay_ms(5);
  90.         OLED_RST_Set();
  91.         delay_ms(5);
  92.         

  93.         //************* Start Initial Sequence **********//

  94.         LCD_WR_REG(0x36);
  95.         LCD_WR_DATA8(0x70);

  96.         LCD_WR_REG(0x3A);
  97.         LCD_WR_DATA8(0x05);

  98.         LCD_WR_REG(0xB2);
  99.         LCD_WR_DATA8(0x0C);
  100.         LCD_WR_DATA8(0x0C);
  101.         LCD_WR_DATA8(0x00);
  102.         LCD_WR_DATA8(0x33);
  103.         LCD_WR_DATA8(0x33);

  104.         LCD_WR_REG(0xB7);
  105.         LCD_WR_DATA8(0x35);  

  106.         LCD_WR_REG(0xBB);
  107.         LCD_WR_DATA8(0x19);

  108.         LCD_WR_REG(0xC0);
  109.         LCD_WR_DATA8(0x2C);

  110.         LCD_WR_REG(0xC2);
  111.         LCD_WR_DATA8(0x01);

  112.         LCD_WR_REG(0xC3);
  113.         LCD_WR_DATA8(0x12);   

  114.         LCD_WR_REG(0xC4);
  115.         LCD_WR_DATA8(0x20);  

  116.         LCD_WR_REG(0xC6);
  117.         LCD_WR_DATA8(0x0F);   

  118.         LCD_WR_REG(0xD0);
  119.         LCD_WR_DATA8(0xA4);
  120.         LCD_WR_DATA8(0xA1);

  121.         LCD_WR_REG(0xE0);
  122.         LCD_WR_DATA8(0xD0);
  123.         LCD_WR_DATA8(0x04);
  124.         LCD_WR_DATA8(0x0D);
  125.         LCD_WR_DATA8(0x11);
  126.         LCD_WR_DATA8(0x13);
  127.         LCD_WR_DATA8(0x2B);
  128.         LCD_WR_DATA8(0x3F);
  129.         LCD_WR_DATA8(0x54);
  130.         LCD_WR_DATA8(0x4C);
  131.         LCD_WR_DATA8(0x18);
  132.         LCD_WR_DATA8(0x0D);
  133.         LCD_WR_DATA8(0x0B);
  134.         LCD_WR_DATA8(0x1F);
  135.         LCD_WR_DATA8(0x23);

  136.         LCD_WR_REG(0xE1);
  137.         LCD_WR_DATA8(0xD0);
  138.         LCD_WR_DATA8(0x04);
  139.         LCD_WR_DATA8(0x0C);
  140.         LCD_WR_DATA8(0x11);
  141.         LCD_WR_DATA8(0x13);
  142.         LCD_WR_DATA8(0x2C);
  143.         LCD_WR_DATA8(0x3F);
  144.         LCD_WR_DATA8(0x44);
  145.         LCD_WR_DATA8(0x51);
  146.         LCD_WR_DATA8(0x2F);
  147.         LCD_WR_DATA8(0x1F);
  148.         LCD_WR_DATA8(0x1F);
  149.         LCD_WR_DATA8(0x20);
  150.         LCD_WR_DATA8(0x23);

  151.         LCD_WR_REG(0x21);
  152.         LCD_WR_REG(0x11);
  153.         LCD_WR_REG(0x29);

  154. }

  155. //清屏函数
  156. //Color:要清屏的填充色
  157. void LCD_Clear(u16 Color)
  158. {
  159.         u16 i,j;         
  160.         Address_set(0,0,LCD_W-1,LCD_H-1);
  161.     for(i=0;i<LCD_W;i++)
  162.          {
  163.           for (j=0;j<LCD_H;j++)
  164.                    {
  165.                 LCD_WR_DATA(Color);                                 
  166.             }

  167.           }
  168. }

  169. //main.c

  170. //main.c
  171. #define ALLOCATE_EXTERN

  172. #include "config.h"
  173. #include "lcd.h"

  174. //系统初始化
  175. void SystemInit(void)
  176. {
  177.         /************************************系统初始化****************************************/
  178.         WDTCCR = 0x00;                                                //关闭看门狗
  179.         while((CLKCON&0x20)!=0x20);                        //等待内部高频RC起振
  180.         CLKSWR = 0x51;                                                //选择内部高频时钟为主时钟,内部高频RC2分频,Fosc=16MHz
  181.         while((CLKSWR&0xC0)!=0x40);                        //等待内部高频切换完成
  182.         CLKDIV = 0x01;                                                //Fosc1分频得到Fcpu,Fcpu=16MHz
  183. }

  184. void main(void)
  185. {
  186.         uint i;
  187.         uchar j=0x01;
  188.         uchar k=0;
  189.         SystemInit();                //系统初始化
  190.         Lcd_Init();
  191.         LCD_Clear(BRRED);
  192.         
  193.         while(1)
  194.         {
  195.                 LCD_Clear(BRRED);
  196.                 for(i=0;i<50000;i++);
  197.                 LCD_Clear(WHITE);
  198.                 for(i=0;i<50000;i++);
  199.                 LCD_Clear(BLUE);
  200.                 for(i=0;i<50000;i++);
  201.                 LCD_Clear(BRED);
  202.                 for(i=0;i<50000;i++);
  203.                 LCD_Clear(GRED);
  204.                 for(i=0;i<50000;i++);
  205.                 LCD_Clear(GBLUE);
  206.                 for(i=0;i<50000;i++);
  207.                 LCD_Clear(RED );
  208.                 for(i=0;i<50000;i++);
  209.                 LCD_Clear(MAGENTA);
  210.                 for(i=0;i<50000;i++);
  211.         }
  212. }

    三、执行结果

    03234.gif









打赏榜单

芯圣电子官方QQ 打赏了 500.00 元 2019-04-08
理由:001P试用一等奖

零三翟邢止胃 发表于 2019-3-25 11:23 | 显示全部楼层
真是不错的啊! 好帖子啊! 不顶,对不起啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

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