⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hx8227.c

📁 使用SSD1906驱动HX8227的程式
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********************
SSD1906测试程式
2008/04/23
MCU:使用8051
SSD1906 介绍:
CF2:CF1:CF0----VDD:GND:GND //使用普通2接口;
CLKI=12MHZ;
BCLK:总线时钟; 可以为BCLK=CLKI;CF[7:6]=00;
MCLK:内存时钟; 可以为MCLK=BCLK; REG[04H]=0x00;
PCLK:点时钟;   可以为PCLK=CLKI/2=6.0MHZ;REG[05H]=0x10;
注:16BPP时,fMCLK>=fPCLK*2;
*********************/
#include "REG51.H"
#include "nop.h"

#define  DBL    P1    //数据和地址低八位线;
#define  DBH    P0   //数据和地址高八线;
#define  WE0    SSD1906_WE0
#define  WE1    SSD1906_WE1
/****************************************************************************************/
sbit  HIGH_AD_CTAL         =P2^5;//FLASH和SSD1906高地址线锁存信号,控制74HC373(U13)
/*****************************************************************************************/
sbit  FLASH_ADDR16         =P1^0;//39VF160的16位地址线,但要"High_AD_CTAL"锁存
sbit  FLASH_ADDR17         =P1^1;//39VF160的17位地址线,但要"High_AD_CTAL"锁存
sbit  FLASH_ADDR18         =P1^2;//39VF160的18位地址线,但要"High_AD_CTAL"锁存
sbit  FLASH_ADDR19         =P1^3;//39VF160的19位地址线,但要"High_AD_CTAL"锁存
/*****************************************************************************************/
sbit  MCU_TO_SSD1906_DB    =P2^6;//注:P2^7与P2^3必须一高一低.不可同时为低;
sbit  SSD1906_DB_CTAL      =P2^7;//8051向SSD1906写数据或显示数据锁存信号,控制74HC373(U16,U17)
/*****************SSD1906控制信号定义****************************************************/
sbit  SSD1906_CS           =P2^4;//CS
sbit  SSD1906_MR           =P3^7;//选择读写显示内存或内部寄存器。高为显示内存,低为内部寄存器;
sbit  SSD1906_WE0          =P3^6;//低8位数据的写使能信号输入;
sbit  SSD1906_WE1          =P3^5;//高8位数据的写使能信号输入;
/*****************************************************************/
sbit  NEXT                 =P2^0;//按键,显示下一个图片;


/* touch panel interface define */
sbit TP_CLK      =    P3^4;
sbit TP_CS        =    P3^2;
sbit TP_DIN       =    P3^3;
sbit TP_DOUT      =    P3^0;
sbit TP_IRQ       =    P3^1;//检测触摸屏响应信号

unsigned char TPX,TPY;
void display(unsigned int data1);
unsigned char  FLASH_OR_SSD1906_ADDR;
void display_ONE(void);
unsigned char code TP_BMP_30_30[];


void DELAY(int time)

{
int i;
	int  delayLoopCount=10;
	for(;time>0;time--);
		for(i=0;i<delayLoopCount;i++);

}

unsigned char  ReadFromCharFrom7843(unsigned char command) //SPI 读数据
{
unsigned char  temp,i,ack;
ack=0;//等转换结果

/*****************传送指令***************************************/
TP_CS=0;
TP_CLK=0;
temp=0x80;
for(i=0;i<8;i++)
{
 if(command&temp)   TP_DIN=1;
 else               TP_DIN=0;

 TP_CLK=1;
 DELAY(2);
 TP_CLK=0;
 DELAY(2);

 temp=temp>>1;
}
/****************************************************************/
DELAY(10);  //WAIT  BUSY
/****************************************************************/
TP_DIN=0; //数据线清零
TP_CLK=1;//时钟线置高
DELAY(2);
TP_CLK=0;//时钟线清零
DELAY(2);
/*****************接收转换结果***********************************/
for(i=0;i<8;i++)
{
ack=ack<<1;              //左移一位
TP_CLK=1;//时钟线置高
if(TP_DOUT==1)ack++;

DELAY(2);
TP_CLK=0;//时钟线清零
DELAY(2);
}



TP_CS=1;
return ack;
/****************************************************************/
}




void AD7843(void) //外部中断0 用来接受键盘发来的数据
{
unsigned int TEMP;

WAIT_IRQ:
TP_IRQ=1;//IRQ置高电平
if(TP_IRQ!=0)goto WAIT_IRQ;
DELAY(2);
TPX=ReadFromCharFrom7843(0xDC);
TPY=ReadFromCharFrom7843(0x9c);

}




/*************************************************************************************/
void SET_H_ADDR(bit ADDR17,bit ADDR16)
{
if(ADDR16==1)  FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR|0x01;    //ADDR16=1;
else           FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR&(~0x01); //ADDR16=0;
if(ADDR17==1)  FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR|0x02;    //ADDR17=1;
else           FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR&(~0x02); //ADDR17=0;
/************************************************************************************/
P1=FLASH_OR_SSD1906_ADDR;
HIGH_AD_CTAL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
HIGH_AD_CTAL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
HIGH_AD_CTAL=0; _nop_();_nop_();_nop_();_nop_();_nop_();
}

/*************************************************************************************/
void SET_29C040(bit ADDR17,bit ADDR16)
{
if(ADDR16==1)  FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR|0x04;    //ADDR16=1;
else           FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR&(~0x04); //ADDR16=0;
if(ADDR17==1)  FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR|0x08;    //ADDR17=1;
else           FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR&(~0x08); //ADDR17=0;
/************************************************************************************/
P1=FLASH_OR_SSD1906_ADDR;
HIGH_AD_CTAL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
HIGH_AD_CTAL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
HIGH_AD_CTAL=0; _nop_();_nop_();_nop_();_nop_();_nop_();
}



void  SET_SSD1906_ADDR(unsigned  long a,unsigned long  b)
{
unsigned  long ADDR;
unsigned   ADDR15_0;

bit ADDR16, ADDR17;
  ADDR=a*960;
  b=b*2;
  ADDR=ADDR+b;


if(ADDR&0x00010000)         ADDR16=1;
else                        ADDR16=0;
if(ADDR&0x00020000)         ADDR17=1;
else                        ADDR17=0;

ADDR15_0=ADDR;

/***********************************************************************************/
if(ADDR16==1)  FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR|0x01;    //ADDR16=1;
else           FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR&(~0x01); //ADDR16=0;
if(ADDR17==1)  FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR|0x02;    //ADDR17=1;
else          FLASH_OR_SSD1906_ADDR=FLASH_OR_SSD1906_ADDR&(~0x02); //ADDR17=0;
/************************************************************************************/
P1=FLASH_OR_SSD1906_ADDR;
HIGH_AD_CTAL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
HIGH_AD_CTAL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
HIGH_AD_CTAL=0; _nop_();_nop_();_nop_();_nop_();_nop_();

DBL=ADDR15_0;
DBH=ADDR15_0>>8;




}






void delay_standard(unsigned int delaytime)
{
  while(delaytime-->0);
}


void WAIT_KEY(void)
{
P2=0xff;
while(P2&0x01);
delay_standard(100);/*去抖动***/
P2=0xff;
while((P2&0x01)==0x00);/*廷时0.1S*/
delay_standard(100);
}




/****************************************************************************************/
void  MCU_DB_TO_SSD1906(unsigned int DATA1)
{

MCU_TO_SSD1906_DB=1;   //SSD1906  DB打开

DBL=DATA1>>8;
DBH=DATA1;//寄存器数据;
_nop_();_nop_();_nop_();_nop_();_nop_();
SSD1906_DB_CTAL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
SSD1906_DB_CTAL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
SSD1906_DB_CTAL=0;_nop_();_nop_();_nop_();_nop_();_nop_();



}

/*************************************************************************************/
void  SSD1906_WR_REG(unsigned char REG,unsigned char DATA1)
{

SET_H_ADDR(0,0);

//SSD1906  DB打开

DBL=DATA1;
DBH=DATA1;//寄存器数据;

MCU_TO_SSD1906_DB=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SSD1906_DB_CTAL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
SSD1906_DB_CTAL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
SSD1906_DB_CTAL=0;_nop_();_nop_();_nop_();_nop_();_nop_();


DBH=0x00;
DBL=REG;//寄存器名称;
/*********SSD1906时序****************/
SSD1906_CS=0;//SSD1906 芯片选择
SSD1906_MR=0;//SSD1906 MR=0;选择寄存器
WE1=0;
SSD1906_WE0=0;
 _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();

SSD1906_WE0=1; _nop_();_nop_();_nop_();_nop_();
WE1=1;
SSD1906_MR=1;
SSD1906_CS=1;
/************************************/
}
void SSD1906_INIT(void)
{

/**************************/
SSD1906_WR_REG(0x04,0x00);//SET MCLK CLOCK:MCLK=BCLK;
SSD1906_WR_REG(0x05,0x20);//SET PCLK CLOCK:PCLK=CLKI/2;6MHZ   0x30)
/*************************/
SSD1906_WR_REG(0x10,0x61);//SET Panel TYPE: TFT 18BITS
SSD1906_WR_REG(0x11,0x13);//SET MOD Rate:	LDEN:N LLINE

/************HSYNC 水平时钟设置*************/
//HT:408 水平总时钟
SSD1906_WR_REG(0x12,65);  //Horizontal Total	HT>HDPS+HDP;(408/8)-1=50 normal
//HDP:   水平显示周期320
SSD1906_WR_REG(0x14,59);  //Horizontal Display Size  (320/8)-1=39;HDP
//HDPS:
SSD1906_WR_REG(0x16,39);  //63//Horizontal Period Start   HDPS[BIT7:0]
SSD1906_WR_REG(0x17,00);  //Horizontal Period Start   HDPS[BIT9:8]


//HPW:
SSD1906_WR_REG(0x20,0x1d);//SET LLINE pulse width   0x1d
//HPS:
SSD1906_WR_REG(0x22,0x00);//SET LLINE pulse start
SSD1906_WR_REG(0x23,0x00);//SET LLINE pulse start

/************VSYNC 垂直时钟设置*************/
//VT:262LINE
SSD1906_WR_REG(0x18,0x1d);//Vertical Total HT[BIT7:0]   HT:262LINE,MAX:1024
SSD1906_WR_REG(0x19,0x01);//Vertical Total HT[BIT9:8]	  Vertical Total in number of lines = Bits [9:0]+ 1
//VDP:240
SSD1906_WR_REG(0x1C,0X0F); //VDP[BIT7:0]  240-1=239
SSD1906_WR_REG(0x1D,0x01);//VDP[BIT9:8]
//VDPS:
SSD1906_WR_REG(0x1E,12);  //VDPS[BIT7:0]
SSD1906_WR_REG(0x1F,0x00);//VDPS[BIT9:8]  VT>VDP+VDPS
/***********************/

SSD1906_WR_REG(0x24,0x07);//SET LFRAME WIDTH 0x1d
SSD1906_WR_REG(0x26,0x00);//SET LFRAME start
SSD1906_WR_REG(0x27,0x00);//SET LFRAME start
SSD1906_WR_REG(0x30,0x00);//LFRAME Pulse Start Offset
SSD1906_WR_REG(0x31,0x00);//LFRAME Pulse Start Offset
SSD1906_WR_REG(0x34,0x00);//LFRAME Pulse Stop Offset
SSD1906_WR_REG(0x35,0x00);//LFRAME Pulse Stop Offset

SSD1906_WR_REG(0x45,0x01);//set STN color depth DB0=0;32K,,DB0=1;256K;
SSD1906_WR_REG(0x50,0x00);//Dithering/FRC Control;; dynamic dithering is disabled.
SSD1906_WR_REG(0x70,0x04);//display mode 64K;
SSD1906_WR_REG(0x71,0x40);//Special Effects
SSD1906_WR_REG(0x74,0x00);//Main Windows address Start bit7:0
SSD1906_WR_REG(0x75,0x00);//Main Windows address Start bit15:8
SSD1906_WR_REG(0x76,0x00);//Main Windows address Start bit16
SSD1906_WR_REG(0x78,240);//Main Windows Offset Address  bit7:0; 320*240;160
SSD1906_WR_REG(0x79,0x00);//Main Windows Offset Address  bit15:8
SSD1906_WR_REG(0xA0,0x00);//Power Saving

}

void SSD906_WR_DISPLAY_DATA(void)
{
//SSD1906_CS=0;//SSD1906 芯片选择
//SSD1906_MR=1;//SSD1906 MR=0;选择寄存器
////SSD1906_CS=0;//SSD1906 芯片选择

WE1=0;WE0=0;WE0=1;WE1=1;
//WE0=0;
//WE0=1;

//SSD1906_CS=1;
}

/*****写单显示图片**********/
void display(unsigned int data1)
{
unsigned char z,m;



MCU_DB_TO_SSD1906(data1);
SSD1906_CS=0;//SSD1906 芯片选择
SSD1906_MR=1;//SSD1906 MR=0;选择寄存器
SSD1906_CS=0;//SSD1906 芯片选择

SET_H_ADDR(0,0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -