📄 hx8227.c
字号:
/**********************
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 + -