/**OLED驱动脚***/
#define rse P0_4
#define sda P0_2
#define sck P0_1
/**********************************************
//
//IIC通信开始函数
//
**********************************************/
void ICC_Start()
{
sda=1;
sck=1;
_nop_();
sda=0;
_nop_();
_nop_();
sck=0;
}
/**********************************************
//
//IIC通信停止函数
//
**********************************************/
void ICC_Dtop()
{
sda=0;
_nop_();
sck=1;
_nop_();
_nop_();
sda=1;
}
/**********************************************
//
//向IIC写数据函数
//返回值为acknowledgement位信号
//
**********************************************/
bit write_IIC_Data(unchar Data)
{
uchar i;
bit ack_bit; //应答型号
for(i=0;i<8;i++)
{
if(Data&0x80)
{
sda=1;
}
else
{
sda=0;
}
_nop_();
sck=1;
_nop_();
_nop_();
sck=0;
Data=Data<<1;
}
sda=1; //释放IIC SDA总线为主器件接收从器件产生应答信号
_nop_();
_nop_();
sck=1; //第9个时钟周期
_nop_();
_nop_();
ack_bit=sda; //读取应答信号
sck=0;
return ack_bit;
}
/**********************************************
//
//写命令函数
**********************************************/
//
//
void Write_Command(unchar command)
{
ICC_Start();
write_IIC_Data(0x78); //Salve Adress 从机地址为0,设置为写模式
write_IIC_Data(0x00); //写命令
write_IIC_Data(command);
ICC_Dtop();
}
/**********************************************
//
//写数据函数
//
**********************************************/
//
//
void Write_Data(unchar date)
{
ICC_Start();
write_IIC_Data(0x78); //Salve Adress 从机地址为0,设置为写模式
write_IIC_Data(0x40); //写数据
write_IIC_Data(date);
ICC_Dtop();
}
/**写数据还是写命令***/
void OLED_WR_Byte(unchar dat,bit cmd)
{
if(cmd)
{
Write_Data(dat);
}
else
{
Write_Command(dat);
}
}
/********************************************
// 写满屏
********************************************/
void fill_picture(unsigned char fill_Data)
{
unsigned char m,n;
for(m=0;m<8;m++)
{
OLED_WR_Byte(0xb0+m,0); //page0-page1
OLED_WR_Byte(0x00,0); //low column start address
OLED_WR_Byte(0x10,0); //high column start address
for(n=0;n<128;n++)
{
OLED_WR_Byte(fill_Data,1);
}
}
}
void Init_IC()
{
rse=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
rse=1;
Write_Command(0xAE); //Set Display Off 这个是关闭显示
Write_Command(0xd5); //display divide ratio/osc. freq. mode 分频比/振荡器频率模式设置
Write_Command(0x80); ////分频比/振荡器频率数据设置(80H:+15%,??50H:0%)
Write_Command(0xA8); //multiplex ration mode:63 //多路复用率数据设置?(1:00H,??2:02H,?3:03H,?······??63:3EH,?64:3FH
Write_Command(0x3F);
Write_Command(0xD3); //Set Display Offset //显示偏移数据设置?(COM0:00H,?COM1:02H,?COM2:03H,?······?COM62:3EH,?COM63:3FH)
Write_Command(0x00);
Write_Command(0x40); //Set Display Start Line 设置显示开始的行
Write_Command(0xAD); //DC-DC Control Mode Set 直流转换器电源控制方式设置(打开)
Write_Command(0x8A); //DC-DC ON/OFF Mode Set 直流转换器电源开/关模式设置(直流转换禁用:8AH,显示是直流打开:8BH)
Write_Command(0x32); //Set Pump voltage value
Write_Command(0xA1); //Segment Remap 设置段重新映射(ADC)(正向:A0H,??反向A1H)
Write_Command(0xC8); //Sst COM Output Scan Direction 设置公用边输出扫面的方向(从COM0向COM(N-1)扫描:C0H,从com(N-1)向COM0扫描:C8H)
Write_Command(0xDA); //common pads hardware: alternative 常见的引脚硬件配置模式设置
Write_Command(0x12); //顺序/替代(顺序:02H。替代:12H)
Write_Command(0x81); //contrast control 对比度控制模式设置
Write_Command(0x6A); //对比度控制模式设置(ISEG small:00H,Large:FFH,不使用此功能:80H)
Write_Command(0xD9); //set pre-charge period 预充电周期模式设置
Write_Command(0x22); //无充电周期数据设置
Write_Command(0xDB); //VCOM deselect level mode VCOM取消级别模式设置
Write_Command(0x18); //40 VCOM取消级数据设置(VCOM=0.430*VREF:00H,VCOM=0.77*VREF:35H ,VCOM=1*VREF:40H)
Write_Command(0xA4); //Set Entire Display On/Off //设置全屏显示关/开(正常显示:A4H,全屏显示:A5H)
Write_Command(0xA6); //Set Normal Display //设置正常/反白显示(正常显示:A6H,反白显示:A7H)
Write_Command(0xAF); //Set Display On //这个开显示
OLED_Clear();
}
void All_Screen()
{
uchar page_number,column_number;
for(page_number=0;page_number<8;page_number++)
{
Write_Command(0xb0+page_number); //设置页面地址(1页:B0H,2页:B1H,3页:B2H,4页:B3H,5页:B4H,6页:B5H,7页:B6H)
Write_Command(0x10);//Set?Column?Address?4?lower?bits??设置列地址低4位(00H--0FH)(0,0,0,0,A3?A2?A1?A0 这两个反过来,懒得换
Write_Command(0x02);//Set?Column?Address?4?higher?bits??设置列地址高4位(10H--17H)(0,0,0,1,A7?A6?A5?A4
for(column_number=0;column_number<128;column_number++)
{
Write_Data(0xff);
}
}
}
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,0); //设置页地址(0~7)
OLED_WR_Byte (0x00,0); //设置显示位置—列低地址
OLED_WR_Byte (0x10,0); //设置显示位置—列高地址
for(n=0;n<128;n++)OLED_WR_Byte(0,1);
} //更新显示
}
void Timer0_Initial(void)
{
TCON1 = 0x00; //Tx0定时器时钟为Fosc
TMOD = 0x00; //16位重装载定时器/计数器
//Tim0计算时间 = (65536 - 0xFACB) * (1 / (Fosc /Timer分频系数))
// = 1333 / (16000000 / 12)
// = 1 ms
//定时1ms
//反推初值 = 65536 - ((1/1000) / (1/(Fosc / Timer分频系数)))
// = 65536 - ((1/1000) / (1/(16000000 / 12)))
// = 65536 - 1333
// = 0xFACB
TH0 = 0xff;
TL0 = 0xde; //T0定时时100us ,一个数走3us
IE |= 0x02; //打开T0中断
TCON |= 0x10; //使能T0
EA = 1; //打开总中断
}
void main()
{
POWER_INITIAL();
Init_IC();
All_Screen();
while(1)
{
fill_picture(0xaa);
}
}
void TIMER0_Rpt(void) interrupt TIMER0_VECTOR
{
}
|