该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
/*************************************************************
* OLED_ZK_430.c
*************************************************************/
#include
#include "OLED_ZK_430.h"
void initial_IO()
{
LCD_SDA_DIR |= LCD_SDA;
LCD_SCLK_DIR |= LCD_SCLK;
ROM_CS_DIR |= ROM_CS;
ROM_SCK_DIR |= ROM_SCK;
ROM_OUT_DIR |= ROM_OUT;
ROM_IN_DIR |= ROM_IN;
}
/**********************************************
//IIC Start
*********************************************/
void IIC_Start()
{
LCD_SCLK_OUT |= LCD_SCLK;
LCD_SDA_OUT |= LCD_SDA;
LCD_SDA_OUT &= ~LCD_SDA;
LCD_SCLK_OUT &= ~LCD_SCLK;
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
LCD_SCLK_OUT &= ~LCD_SCLK;
LCD_SDA_OUT &= ~LCD_SDA;
LCD_SCLK_OUT |= LCD_SCLK;
LCD_SDA_OUT |= LCD_SDA;
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(uchar IIC_Byte)
{
unsigned char i;
for (i = 0; i<8; i++)
{
if (IIC_Byte & 0x80)//1?0?
LCD_SDA_OUT |= LCD_SDA;
else
LCD_SDA_OUT &= ~LCD_SDA;
LCD_SCLK_OUT |= LCD_SCLK;
LCD_SCLK_OUT &= ~LCD_SCLK;
IIC_Byte <<= 1;//loop
}
LCD_SDA_OUT |= LCD_SDA;
LCD_SCLK_OUT |= LCD_SCLK;
LCD_SCLK_OUT &= ~LCD_SCLK;
}
/*****************************************************************************
名称: LED_WrDat
简要: 向OLED写数据
*****************************************************************************/
void transfer_data_lcd(uchar ucData)
{
IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40);//write data
Write_IIC_Byte(ucData);
IIC_Stop();
}
/*****************************************************************************
名称 : LED_WrCmd
简要 : 向OLED写命令
*****************************************************************************/
void transfer_command_lcd(uchar ucCmd)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
Write_IIC_Byte(0x00);//write command
Write_IIC_Byte(ucCmd);
IIC_Stop();
}
/*延时*/
void delay(int n_ms)
{
int j, k;
for (j = 0; j
for (k = 0; k<110; k++);
}
/*LCD模块初始化*/
void initial_lcd()
{
ROM_CS_OUT |= ROM_CS ;
delay(20);
transfer_command_lcd(0xAE); //display off
transfer_command_lcd(0x20);//Set Memory Addressing Mode
transfer_command_lcd(0x10);//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
transfer_command_lcd(0xb0);//Set Page Start Address for Page Addressing Mode,0-7
transfer_command_lcd(0xc8);//Set COM Output Scan Direction
transfer_command_lcd(0x00);//---set low column address
transfer_command_lcd(0x10);//---set high column address
transfer_command_lcd(0x40);//--set start line address
transfer_command_lcd(0x81);//--set contrast control register
transfer_command_lcd(0x7f);
transfer_command_lcd(0xa1);//--set segment re-map 0 to 127
transfer_command_lcd(0xa6);//--set normal display
transfer_command_lcd(0xa8);//--set multiplex ratio(1 to 64)
transfer_command_lcd(0x3F);//
transfer_command_lcd(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
transfer_command_lcd(0xd3);//-set display offset
transfer_command_lcd(0x00);//-not offset
transfer_command_lcd(0xd5);//--set display clock divide ratio/oscillator frequency
transfer_command_lcd(0xf0);//--set divide ratio
transfer_command_lcd(0xd9);//--set pre-charge period
transfer_command_lcd(0x22); //
transfer_command_lcd(0xda);//--set com pins hardware configuration
transfer_command_lcd(0x12);
transfer_command_lcd(0xdb);//--set vcomh
transfer_command_lcd(0x20);//0x20,0.77xVcc
transfer_command_lcd(0x8d);//--set DC-DC enable
transfer_command_lcd(0x14);//
transfer_command_lcd(0xaf);//--turn on oled panel
}
void lcd_address(uchar page, uchar column)
{
transfer_command_lcd(0xb0 + column); /*设置页地址*/
transfer_command_lcd(((page & 0xf0) >> 4) | 0x10);/*设置列地址的高4位*/
transfer_command_lcd((page & 0x0f) | 0x00);/*设置列地址的低4位*/
}
/*********************************************************************
* 名称:clear_screen()
* 简要:清屏
*********************************************************************/
void clear_screen()
{
unsigned char i, j;
ROM_CS_OUT |= ROM_CS ;
for (i = 0; i<8; i++)
{
transfer_command_lcd(0xb0 + i);
transfer_command_lcd(0x00);
transfer_command_lcd(0x10);
for (j = 0; j<128; j++)
{
transfer_data_lcd(0x00);
}
}
}
/*********************************************************************
* 名称:display_128x64(uchar *dp)
* 简要:显示128x64点阵图像
* 参数:page:页 column: 列 dp: 字符串
*********************************************************************/
void display_128x64(uchar *dp)
{
uint i, j;
for (j = 0; j<8; j++)
{
lcd_address(0, j);
for (i = 0; i<128; i++)
{
transfer_data_lcd(*dp);/*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
dp++;
}
}
}
/*********************************************************************
* 名称:display_graphic_16x16(uint page, uint column, uchar *dp)
* 简要:显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标
* 参数:page:页 column: 列 dp: 字符串
*********************************************************************/
void display_graphic_16x16(uint page, uint column, uchar *dp)
{
uint i, j;
ROM_CS_OUT |= ROM_CS ;
for (j = 2; j>0; j--)
{
lcd_address(column, page);
for (i = 0; i<16; i++)
{
transfer_data_lcd(*dp);/*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
dp++;
}
page++;
}
}
/*********************************************************************
* 名称:display_graphic_8x16(uint page, uchar column, uchar *dp)
* 简要:显示8x16点阵图像、ASCII, 或8x16点阵的自造字符、其他图标
* 参数:page:页 column: 列 dp: 字符串
*********************************************************************/
/*显示8x16点阵图像、ASCII, 或8x16点阵的自造字符、其他图标*/
void display_graphic_8x16(uint page, uchar column, uchar *dp)
{
uint i, j;
for (j = 2; j>0; j--)
{
lcd_address(column, page);
for (i = 0; i<8; i++)
{
transfer_data_lcd(*dp);/*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
dp++;
}
page++;
}
}
/*********************************************************************
* 名称:display_graphic_5x7(uint page, uchar column, uchar *dp)
* 简要:显示5*7点阵图像、ASCII, 或5x7点阵的自造字符、其他图标
* 参数:page:页 column: 列 dp: 字符串
* 使用示例:display_graphic_16x16(6, 97, jiong1);在第7页,第81列显示单个自编生僻汉字“囧”
*********************************************************************/
void display_graphic_5x7(uint page, uchar column, uchar *dp)
{
uint col_cnt;
uchar page_address;
uchar column_address_L, column_address_H;
page_address = 0xb0 + page - 1;
column_address_L = (column & 0x0f) - 1;
column_address_H = ((column >> 4) & 0x0f) + 0x10;
transfer_command_lcd(page_address); /*Set Page Address*/
transfer_command_lcd(column_address_H);/*Set MSB of column Address*/
transfer_command_lcd(column_address_L);/*Set LSB of column Address*/
for (col_cnt = 0; col_cnt<6; col_cnt++)
{
transfer_data_lcd(*dp);
dp++;
}
}