|
发表于 2012-9-24 12:23:00
|
显示全部楼层
#ifndef _SH1101A_H_
#define _SH1101A_H_
#include <util/delay.h>
//#include <zimo.h>
#define PAR //定义为并行模式,如不是,注释掉即可,并请一定注意把模块上的跳线改到S,否则可能烧坏IO!!
#define SET_BIT(PORT,BIT) PORT|=(1<<BIT)
#define CLR_BIT(PORT,BIT) PORT&=~(1<<BIT)
#define CON_PORT PORTB
#define DATA_PORT PORTD
#define PS_mode PB3
#define serial_mode CLR_BIT(CON_PORT,PS_mode)
#define par_mode SET_BIT(CON_PORT,PS_mode)
//以下为接口定义,用户根据自己的板子自行定义
#ifdef PAR
#define R_D PB6
#define W_R PB7
#define DC PB4
#define RST PB5
#define CS PB2
#define RD_high SET_BIT(CON_PORT,R_D)
#define RD_low CLR_BIT(CON_PORT,R_D)
#define WR_high SET_BIT(CON_PORT,W_R)
#define WR_low CLR_BIT(CON_PORT,W_R)
#define DC_high SET_BIT(CON_PORT,DC)
#define DC_low CLR_BIT(CON_PORT,DC)
#define RST_high SET_BIT(CON_PORT,RST)
#define RST_low CLR_BIT(CON_PORT,RST)
#define CS_high SET_BIT(CON_PORT,CS)
#define CS_low CLR_BIT(CON_PORT,CS)
#else
#define CLK PD0
#define DATA PD1
#define DC PB5
#define RST PB4
#define CS PB2
#define CLK_high SET_BIT(DATA_PORT,CLK)
#define CLK_low CLR_BIT(DATA_PORT,CLK)
#define DATA_high SET_BIT(DATA_PORT,DATA)
#define DATA_low CLR_BIT(DATA_PORT,DATA)
#define DC_high SET_BIT(CON_PORT,DC)
#define DC_low CLR_BIT(CON_PORT,DC)
#define RST_high SET_BIT(CON_PORT,RST)
#define RST_low CLR_BIT(CON_PORT,RST)
#define CS_high SET_BIT(CON_PORT,CS)
#define CS_low CLR_BIT(CON_PORT,CS)
#endif
//****************************主要操作函数************************************
void WriteCommand(unsigned com); //写命令程序
void WriteData(unsigned dat); //写数据程序
void esbusini(void); //初始化总线程序
void ini_oled(void); //OLED初始化
void ini_dis(void); //显示初始化(清除缓冲区)
void tu(unsigned char X,unsigned char Y,unsigned char * t);
/**************************实现函数********************************************
*函数原型: WriteCommand(unsigned com);
*功 能: 写指令到OLED显示屏。
*******************************************************************************/
void WriteCommand(unsigned com)
{
// unsigned char temp;
#ifdef PAR
CS_high;
DC_low;
WR_low;
RD_high;
CS_low;
// temp=((com&0x55)<<1)|((com&0xaa)>>1);
DATA_PORT=com;
CS_high;
#else
unsigned char i;
CS_high;
DC_low;
CS_low;
for(i=0;i<8;i++)
{
CLK_low;
if(com&0x80)
DATA_high;
else
DATA_low;
com<<=1;
CLK_high;
}
CS_high;
#endif
}
/**************************实现函数********************************************
*函数原型: void WriteData(unsigned dat);
*功 能: 写数据到oled显示屏。
*******************************************************************************/
void WriteData(unsigned dat)
{
unsigned char temp;
#ifdef PAR
CS_high;
DC_high;
WR_low;
RD_high;
CS_low;
//temp=((dat&0x55)<<1)|((dat&0xaa)>>1);zhushidiaole
DATA_PORT=dat;
CS_high;
#else
unsigned char i;
CS_high;
DC_high;
CS_low;
for(i=0;i<8;i++)
{
CLK_low;
if(dat&0x80)
DATA_high;
else
DATA_low;
dat<<=1;
CLK_high;
}
CS_high;
#endif
}
/**************************实现函数********************************************
*函数原型: void esbusini(void);
*功 能: 总线初始化。
*******************************************************************************/
void esbusini(void)
{
RST_high;
_delay_ms(1);
RST_low;
_delay_ms(1);
RST_high;
}
/**************************实现函数********************************************
*函数原型: void ini_dis(void);
*功 能: 显示初始化。
*******************************************************************************/
void ini_dis(void)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
WriteCommand (0xb0+i); //设置显示位置—行
WriteCommand (0x02); //设置显示位置—列低地址
WriteCommand (0x10); //设置显示位置—列高地址
for(j=0;j<128;j++)
WriteData(0x00); //屏幕显示,全亮
}
WriteCommand(0xaf);
}
/**************************实现函数********************************************
*函数原型: void ini_oled(void);
*功 能: oled显示的准备工作。
*******************************************************************************/
void ini_oled(void)
{
esbusini();
/*************************************************
// SSD1303 Initialization Command
*************************************************/
// Lower Column Address
WriteCommand(0x00); /* Set Lower Column Address */
// High Column Address
WriteCommand(0x10); /* Set Higher Column Address*/
// Display Start Line
WriteCommand(0x40); /* Set Display Start Line */
// Contrast Control Register
WriteCommand(0x81); /* Set Contrast Control */
WriteCommand(0xff); /* 0 ~ 255 */
// Re-map
WriteCommand(0xA1); /* [A0]:column address 0 is map to SEG0 , [A1]: columnaddress 131 is map to SEG0*/
// Entire Display ON/OFF
WriteCommand(0xA4); /* A4=ON */
// Normal or Inverse Display
WriteCommand(0XA6); /* Normal Display*/
// Multiplex Ratio
WriteCommand(0xA8); /* Set Multiplex Ratio */
WriteCommand(0x3f); /* Set to 36 Mux*/
// Set DC-DC
WriteCommand(0x8D); /* Set DC-DC */
WriteCommand(0x14); /* 0x14=ON */
// Display ON/OFF
WriteCommand(0xAE); /* AF=ON , AE=OFF*/
// Display Offset
WriteCommand(0xD3); /* Set Display Offset */
WriteCommand(0x00); /* No offset */
// Display Clock Divide
WriteCommand(0xD5); /* Set Clock Divide */
WriteCommand(0x20); /* Set to 80Hz */
// Area Color Mode
WriteCommand(0xD8); /* Set Area Color On or Off*/
WriteCommand(0x00); /* Mono Mode */
// COM Pins Hardware Configuration
WriteCommand(0xDA); /* Set Pins HardwareConfiguration */
WriteCommand(0x12);
// VCOMH
WriteCommand(0xDB); /* Set VCOMH */
WriteCommand(0x00);
// VP
WriteCommand(0xD9); /* Set VP */
WriteCommand(0x22); /* P1=2 , P2=2 */
WriteCommand(0xc0);//配置成标准应用
ini_dis();
}
/*******************************function************************************************************/
//*******************显示X,Y坐标处的一个字符。一行可以显示16个字符。X为0到15,Y为0到3**************
void disc(unsigned char X,unsigned char Y,unsigned char * c)
{
unsigned char n;
WriteCommand (0xb7-(Y<<1));
if(X%2)
WriteCommand (0x08);//偏移3列
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=0;n<16;n+=2)
WriteData(*(c+n));
WriteCommand (0xb7-(Y<<1)-1);
if(X%2)
WriteCommand (0x08);
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=1;n<16;n+=2)
WriteData(*(c+n));
}
void dish(unsigned char X,unsigned char Y,unsigned char * h)
{
unsigned char n;
WriteCommand (0xb7-(Y<<1));
if(X%2)
WriteCommand (0x08);
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=0;n<32;n+=2)
WriteData(*(h+n));
WriteCommand (0xb7-(Y<<1)-1);
if(X%2)
WriteCommand (0x08);
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=1;n<32;n+=2)
WriteData(*(h+n));
}
void tu(unsigned char X,unsigned char Y,unsigned char * t)
{
unsigned char m,n;
WriteCommand (0xb7-(Y<<1));
if(X%2)
WriteCommand (0x08);
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=0;n<128;n+=1,m+=1)
WriteData(*(t+n));
WriteCommand (0xb7-(Y<<1)-1);
if(X%2)
WriteCommand (0x08);
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=0;n<128;n+=1)
WriteData(*(t+n+128));
WriteCommand (0xb7-(Y<<1)-1);
if(X%2)
WriteCommand (0x08);
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=0;n<128;n+=1)
WriteData(*(t+n+256));
WriteCommand (0xb7-(Y<<1)-1);
if(X%2)
WriteCommand (0x08);
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=0;n<128;n+=1)
WriteData(*(t+n+384));
WriteCommand (0xb7-(Y<<1)-1);
if(X%2)
WriteCommand (0x08);
else
WriteCommand (0x00);
WriteCommand (0x10+(X>>1));
for(n=0;n<128;n+=1)
WriteData(*(t+n+512));
}
#endif
|
|