数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2754|回复: 3

[PIC] 1.8寸并口彩色液晶驱动,用的8位PIC16F74驱动

[复制链接]
发表于 2020-7-16 17:20:11 | 显示全部楼层 |阅读模式
20脚屏幕,坏的游戏机上的,资料很难找。用的8位PIC16F74驱动。屏是并口驱动型。
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//  功能描述   : 1.8寸LCD
/******************************************************************************/

#include <pic.h>
__CONFIG(0x3B31);
#include"font.h"

//关闭看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护

#define uchar unsigned char
#define uint  unsigned int                     

#define C_S    RA4                       //串行数据输入端
#define RES  RD6                        //数据锁存端
#define R_S   RD5                        //时钟
#define W_R  RD4                        //数据锁存端
#define R_D    RD3
#define _nop_() asm("nop")
/******************

***********************/
void dsp_single_colour(int color);
void  Contrast_Adjust();

const  typFNT_GBK16 hz16[];

void Font_Test(void);
void Output_Pixel(uint x,uint y);

void delay_ms(uint time)
{
uint i,j;
  for(i=0;i<time;i++)
   for(j=0;j<250;j++);
}

//定义常用颜色
#define RED                  0xf800
#define GREEN                0x07e0
#define BLUE                 0x001f
#define WHITE                0xffff
#define BLACK                0x0000
#define YELLOW  0xFFE0
#define GRAY0   0xEF7D   
#define GRAY1   0x8410              
#define GRAY2   0x4208   


///////////////////////
void delay(uint time)
{
uint i,j;
  for(i=0;i<time;i++)
   for(j=0;j<200;j++);
}
///////////////////////////////////
//向液晶屏写一个8位指令
void  Lcd_WriteIndex(uchar Data)
{
               
        R_S=0;//选择指令存储器        
        C_S=0;                                                
        W_R=0;
        R_D=1;
        PORTB=Data;
        R_D=0;
        W_R=1;        
        C_S=1;
}
//向液晶屏写一个8位数据
void  Lcd_WriteData(uchar Data)
{        
        R_S=1;//选择数据存储器,指令执行时间1us
        C_S=0;                                                
        W_R=0;
        R_D=1;
        PORTB=Data;
        R_D=0;
        W_R=1;        
    C_S=1;
}
//向液晶屏写一个16位数据
void  Lcd_WriteData_16(unsigned int Data)
{
uchar  i,j;
i=(Data>>8);
j=Data;
        
        R_S=1;//选择数据存储器,指令执行时间1us
        C_S=0;                                                
        W_R=0;
        R_D=1;
        Lcd_WriteData(i);
        Lcd_WriteData(j);
        R_D=0;
        W_R=1;        
    C_S=1;

}

//LCD复位时序
void Reset(void)
{
    reset=0;
    delay(100);
    reset=1;
    delay(100);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//液晶屏初始化
void lcd_initial(void)
{
        Reset();//Reset before LCD Init.
               
        //LCD Init
        Lcd_WriteIndex(0x11);//Sleep exit
        delay (120);
               
        //ST7735R Frame Rate
        Lcd_WriteIndex(0xB1);
        Lcd_WriteData(0x01);
        Lcd_WriteData(0x2C);
        Lcd_WriteData(0x2D);

        Lcd_WriteIndex(0xB2);
        Lcd_WriteData(0x01);
        Lcd_WriteData(0x2C);
        Lcd_WriteData(0x2D);

        Lcd_WriteIndex(0xB3);
        Lcd_WriteData(0x01);
        Lcd_WriteData(0x2C);
        Lcd_WriteData(0x2D);
        Lcd_WriteData(0x01);
        Lcd_WriteData(0x2C);
        Lcd_WriteData(0x2D);
        
        Lcd_WriteIndex(0xB4); //Column inversion
        Lcd_WriteData(0x07);
        
        //ST7735R Power Sequence
        Lcd_WriteIndex(0xC0);
        Lcd_WriteData(0xA2);
        Lcd_WriteData(0x02);
        Lcd_WriteData(0x84);
        Lcd_WriteIndex(0xC1);
        Lcd_WriteData(0xC5);

        Lcd_WriteIndex(0xC2);
        Lcd_WriteData(0x0A);
        Lcd_WriteData(0x00);

        Lcd_WriteIndex(0xC3);
        Lcd_WriteData(0x8A);
        Lcd_WriteData(0x2A);
        Lcd_WriteIndex(0xC4);
        Lcd_WriteData(0x8A);
        Lcd_WriteData(0xEE);
        
        Lcd_WriteIndex(0xC5); //VCOM
        Lcd_WriteData(0x0E);
        
        Lcd_WriteIndex(0x36); //MX, MY, RGB mode
        Lcd_WriteData(0xC0);
        
#ifdef USE_LANDSCAPE
        Lcd_WriteData(0xA8); //竖屏C8 横屏08 A8
#else
        Lcd_WriteData(0xC8); //竖屏C8 横屏08 A8
#endif


        //ST7735R Gamma Sequence
        Lcd_WriteIndex(0xe0);
        Lcd_WriteData(0x0f);
        Lcd_WriteData(0x1a);
        Lcd_WriteData(0x0f);
        Lcd_WriteData(0x18);
        Lcd_WriteData(0x2f);
        Lcd_WriteData(0x28);
        Lcd_WriteData(0x20);
        Lcd_WriteData(0x22);
        Lcd_WriteData(0x1f);
        Lcd_WriteData(0x1b);
        Lcd_WriteData(0x23);
        Lcd_WriteData(0x37);
        Lcd_WriteData(0x00);         
        Lcd_WriteData(0x07);
        Lcd_WriteData(0x02);
        Lcd_WriteData(0x10);

        Lcd_WriteIndex(0xe1);
        Lcd_WriteData(0x0f);
        Lcd_WriteData(0x1b);
        Lcd_WriteData(0x0f);
        Lcd_WriteData(0x17);
        Lcd_WriteData(0x33);
        Lcd_WriteData(0x2c);
        Lcd_WriteData(0x29);
        Lcd_WriteData(0x2e);
        Lcd_WriteData(0x30);
        Lcd_WriteData(0x30);
        Lcd_WriteData(0x39);
        Lcd_WriteData(0x3f);
        Lcd_WriteData(0x00);
        Lcd_WriteData(0x07);
        Lcd_WriteData(0x03);
        Lcd_WriteData(0x10);  
        
        Lcd_WriteIndex(0x2a);
        Lcd_WriteData(0x00);
        Lcd_WriteData(0x00+2);
        Lcd_WriteData(0x00);
        Lcd_WriteData(0x80+2);

        Lcd_WriteIndex(0x2b);
        Lcd_WriteData(0x00);
        Lcd_WriteData(0x00+3);
        Lcd_WriteData(0x00);
        Lcd_WriteData(0x80+3);
        
        Lcd_WriteIndex(0xF0); //Enable test command  
        Lcd_WriteData(0x01);
        Lcd_WriteIndex(0xF6); //Disable ram power save mode
        Lcd_WriteData(0x00);
        
        Lcd_WriteIndex(0x3A); //65k mode
        Lcd_WriteData(0x05);
        
        
        Lcd_WriteIndex(0x29);//Display on

}
/*************************************************
函数名:LCD_Set_Region
功能:设置lcd显示区域,在此区域写点数据自动换行
入口参数:xy起点和终点
返回值:无
*************************************************/
void Lcd_SetRegion(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end)
{               
#ifdef USE_LANDSCAPE//使用横屏模式
        Lcd_WriteIndex(0x2a);
        Lcd_WriteData(0x02);
        Lcd_WriteData(x_start+2);
        Lcd_WriteData(0x02);
        Lcd_WriteData(x_end+2);

        Lcd_WriteIndex(0x2b);
        Lcd_WriteData(0x01);
        Lcd_WriteData(y_start+1);
        Lcd_WriteData(0x01);
        Lcd_WriteData(y_end+1);

#else//竖屏模式        
        Lcd_WriteIndex(0x2a);
        Lcd_WriteData(0x02);
        Lcd_WriteData(x_start+2);
        Lcd_WriteData(0x02);
        Lcd_WriteData(x_end+2);

        Lcd_WriteIndex(0x2b);
        Lcd_WriteData(0x01);
        Lcd_WriteData(y_start+1);
        Lcd_WriteData(0x01);
        Lcd_WriteData(y_end+1);        
#endif
        Lcd_WriteIndex(0x2c);
}

//全屏填充函数
void LCD_Clear(unsigned int Color)
{
        uchar i,j;
        Lcd_SetRegion(0,0,127,159);
        for (i=0;i<160;i++)
        {
            for (j=0;j<128;j++)
                {
                Lcd_WriteData_16(Color);
                }
        }
}
void dsp_single_colour(int color)
{
         uchar i,j;
        Lcd_SetRegion(0,0,128-1,160-1);
         for (i=0;i<160;i++)
            for (j=0;j<128;j++)
                Lcd_WriteData_16(color);
}

void PutPixel(uint x_start,uint y_start,uint color)
{
        Lcd_SetRegion(x_start,y_start,x_start+1,y_start+1);
        Lcd_WriteData_16(color);
        
}

//采用设置窗口方法填充字库数据,相比Gui_DrawFont_GBK16更快速
void Fast_DrawFont_GBK16(uint x, uint y, uint fc, uint bc, uchar *s)
{
        unsigned char i,j;
        unsigned short k;
        uint HZnum;
        HZnum=sizeof(hz16)/sizeof(typFNT_GBK16);
        while(*s)
        {        
                if((*s) >= 128)
                {               
                        for (k=0;k<HZnum;k++)
                        {
                          if ((hz16[k].Index[0]==*(s))&&(hz16[k].Index[1]==*(s+1)))
                          {         Lcd_SetRegion(x,y,x+16-1,y+16-1);
                                    for(i=0;i<16*2;i++)
                                    {
                                                for(j=0;j<8;j++)
                                            {
                                                        if(hz16[k].Msk&(0x80>>j))        Lcd_WriteData_16(fc);
                                                        else
                                                        {
                                                        if (fc!=bc) Lcd_WriteData_16(bc);
                                                        }
                                                }
                                        }
                                       
                                       
                                }
                        }
                s+=2;x+=16;
                }
                        
               
                else
                s+=1;
               
        }
}

//此方法描绘汉字较慢
void Gui_DrawFont_GBK16(uint x, uint y, uint fc, uint bc, uchar *s)
{
        unsigned char i,j;
        unsigned short k,x0;
        x0=x;

        while(*s)
        {        
                if((*s) >= 128)
                {               
                        for (k=0;k<hz16_num;k++)
                        {
                          if ((hz16[k].Index[0]==*(s))&&(hz16[k].Index[1]==*(s+1)))
                          {
                                    for(i=0;i<16;i++)
                                    {
                                                for(j=0;j<8;j++)
                                                        {
                                                            if(hz16[k].Msk[i*2]&(0x80>>j))        PutPixel(x+j,y+i,fc);
                                                                else {
                                                                        if (fc!=bc) PutPixel(x+j,y+i,bc);
                                                                }
                                                        }
                                                for(j=0;j<8;j++)
                                                        {
                                                            if(hz16[k].Msk[i*2+1]&(0x80>>j))        PutPixel(x+j+8,y+i,fc);
                                                                else
                                                                {
                                                                        if (fc!=bc) PutPixel(x+j+8,y+i,bc);
                                                                }
                                                        }
                                    }
                                }
                          }
                        s+=2;x+=16;
                }
                else
                s+=1;
               
        }
}



//取模方式 水平扫描 从左到右 低位在前
void showimage(const unsigned char *p) //显示40*40 QQ图片
{
          int i,j,k;
        unsigned char picH,picL;
        dsp_single_colour(GREEN); //清屏  
        
        for(k=0;k<4;k++)
        {
                   for(j=0;j<3;j++)
                {        
                        Lcd_SetRegion(40*j,40*k,40*j+39,40*k+39);                //坐标设置
                    for(i=0;i<40*40;i++)
                         {        
                                 picL=*(p+i*2);        //数据低位在前
                                picH=*(p+i*2+1);                                
                                Lcd_WriteData_16(picH<<8|picL);                                                  
                         }        
                 }
        }               
}







void Font_Test(void)
{//中文显示测试全动迎您因为专业所以注
        dsp_single_colour(WHITE);
        Fast_DrawFont_GBK16(16,10,BLUE,YELLOW,        "******");
        Fast_DrawFont_GBK16(32,30,RED,WHITE,        "感温探测");
        Fast_DrawFont_GBK16(40,50,BLUE,WHITE,        "欢迎您");
        Fast_DrawFont_GBK16(32,70,WHITE,BLUE,         "因为专注");
        Fast_DrawFont_GBK16(32,90,WHITE,BLUE,        "所以专业");

        delay_ms(1800);        
}
main()
{
TRISD=0X00;
TRISB=0X00;


        lcd_initial();

  while(1)
  {
        Font_Test();
    delay_ms(3500);        
    }
}

/******************/
font.h
//////////
typedef struct
{
       unsigned char Index[2];        
       char Msk[32];
}typFNT_GBK16;
//宋体5号
#define hz16_num   50
//中文显示测试青岛中阳消防感温探测欢迎您因为专注所以专业 
const  typFNT_GBK16 hz16[] = {
"*",0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x00,
0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x50,0x10,0x20,/*0*/
"*",0x01,0x00,0x02,0x00,0x1F,0xF0,0x10,0x10,0x12,0x10,0x11,0x50,0x10,0x20,0x10,0x00,
0x1F,0xFC,0x02,0x04,0x22,0x24,0x22,0x24,0x3F,0xE4,0x00,0x04,0x00,0x28,0x00,0x10,/*1*/
"*",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,
0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,/*2*/
"*",0x00,0x00,0x7C,0x00,0x45,0xFC,0x49,0x04,0x49,0x04,0x51,0x04,0x49,0x04,0x49,0x04,
0x45,0xFC,0x45,0x04,0x45,0x04,0x69,0x04,0x51,0x04,0x41,0x04,0x41,0xFC,0x41,0x04,/*3*/
"*",0x00,0x40,0x22,0x48,0x11,0x48,0x11,0x50,0x80,0x40,0x43,0xF8,0x4A,0x08,0x0A,0x08,
0x13,0xF8,0x12,0x08,0xE2,0x08,0x23,0xF8,0x22,0x08,0x22,0x08,0x22,0x28,0x02,0x10,/*4*/
"*",0x00,0x40,0x7C,0x20,0x44,0x20,0x4B,0xFE,0x48,0x80,0x50,0x80,0x48,0x80,0x48,0xFC,
0x44,0x84,0x44,0x84,0x44,0x84,0x68,0x84,0x51,0x04,0x41,0x04,0x42,0x28,0x44,0x10,/*5*/
"感",0x00,0x28,0x00,0x24,0x3F,0xFE,0x20,0x20,0x2F,0xA4,0x20,0x24,0x2F,0xA8,0x28,0x98,
0x28,0x92,0x4F,0xAA,0x40,0x46,0x80,0x82,0x01,0x00,0x48,0x84,0x48,0x12,0x87,0xF2,/*6*/
"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*7*/
"探",0x20,0x00,0x27,0xFC,0x24,0x04,0x24,0xA4,0xF9,0x10,0x22,0x08,0x20,0x40,0x28,0x40,
0x37,0xFC,0xE0,0x40,0x20,0xE0,0x21,0x50,0x22,0x48,0x2C,0x46,0xA0,0x40,0x40,0x40,/*8*/
"测",0x00,0x04,0x27,0xC4,0x14,0x44,0x14,0x54,0x85,0x54,0x45,0x54,0x45,0x54,0x15,0x54,
0x15,0x54,0x25,0x54,0xE5,0x54,0x21,0x04,0x22,0x84,0x22,0x44,0x24,0x14,0x08,0x08,/*9*/
"欢",0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,
0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,/*10*/
"迎",0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,
0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00,/*11*/
"您",0x09,0x00,0x09,0x00,0x11,0xFC,0x32,0x04,0x54,0x48,0x99,0x50,0x11,0x48,0x12,0x44,
0x14,0x44,0x11,0x40,0x10,0x80,0x02,0x00,0x51,0x04,0x51,0x12,0x90,0x12,0x0F,0xF0,/*12*/
"因",0x00,0x00,0x7F,0xFC,0x40,0x04,0x41,0x04,0x41,0x04,0x41,0x04,0x5F,0xF4,0x41,0x04,
0x42,0x84,0x42,0x44,0x44,0x24,0x48,0x14,0x50,0x14,0x40,0x04,0x7F,0xFC,0x40,0x04,/*13*/
"为",0x01,0x00,0x21,0x00,0x11,0x00,0x11,0x00,0x01,0x00,0x7F,0xF8,0x02,0x08,0x02,0x08,
0x02,0x88,0x04,0x48,0x04,0x48,0x08,0x08,0x10,0x08,0x20,0x08,0x40,0x50,0x80,0x20,/*14*/
"专",0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x02,0x00,0x02,0x00,0xFF,0xFE,0x04,0x00,
0x08,0x00,0x0F,0xF0,0x00,0x10,0x00,0x20,0x06,0x40,0x01,0x80,0x00,0x40,0x00,0x20,/*15*/
"业",0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x44,0x44,0x24,0x44,0x24,0x48,0x14,0x48,
0x14,0x50,0x14,0x60,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0xFF,0xFE,0x00,0x00,/*16*/
"所",0x02,0x08,0x07,0x1C,0x38,0xE0,0x20,0x80,0x20,0x80,0x3E,0x80,0x22,0xFE,0x22,0x88,
0x22,0x88,0x3E,0x88,0x20,0x88,0x20,0x88,0x41,0x08,0x41,0x08,0x82,0x08,0x04,0x08,/*17*/
"以",0x00,0x10,0x04,0x10,0x22,0x10,0x21,0x10,0x21,0x10,0x20,0x10,0x20,0x10,0x20,0x20,
0x20,0x20,0x20,0x20,0x24,0x40,0x28,0x50,0x30,0x88,0x21,0x04,0x02,0x02,0x04,0x02,/*18*/
"注",0x00,0x80,0x20,0x40,0x10,0x00,0x17,0xFC,0x80,0x40,0x40,0x40,0x40,0x40,0x10,0x40,
0x13,0xFC,0x20,0x40,0xE0,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x2F,0xFE,0x00,0x00,/*19*/
" ",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",20*/
};

有需要的可以一块学习。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +30 收起 理由
家睦 + 30

查看全部打赏

 楼主| 发表于 2020-7-16 18:55:28 来自手机浏览器 | 显示全部楼层
junyee 发表于 2020-7-16 18:48
PIC 的IDE\调试\下载 都不好用

不过功耗控制实在强.

公司里以前做的产品有剩余的PIC单片机,就买了个开发板鼓捣鼓捣。其它类型的单片机没去研究。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-25 15:42 , Processed in 0.202800 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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