打印
[51单片机]

C8051F040 端口配置问题求教

[复制链接]
3593|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wei9098|  楼主 | 2014-2-23 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"
sbit LCD_SCL=P0^3; //时钟 D0(SCLK)
sbit LCD_SDA=P0^2; //D1(MOSI) 数据
sbit LCD_RST=P1^7; //复位
sbit LCD_DC =P1^6; //数据/命令控制

#define X_WIDTH 128
#define Y_WIDTH 64


void LCD_DLY_ms(unsigned int ms)
{                        
unsigned int a;
while(ms)
{
a=1800;
while(a--);
ms--;
}
return;
}

void LCD_WrDat(unsigned char dat)         
{
unsigned char i;
LCD_DC=1;  
for(i=0;i<8;i++) //发送一个八位数据
{
if((dat << i) & 0x80)
{LCD_SDA  = 1;}
else  LCD_SDA  = 0;
LCD_SCL = 0;
LCD_SCL = 1;
}
}

void LCD_WrCmd(unsigned char cmd)
{
unsigned char i;
LCD_DC=0;
for(i=0;i<8;i++) //发送一个八位数据
{
if((cmd << i) & 0x80)
{LCD_SDA  = 1;}
else  LCD_SDA  = 0;
LCD_SCL = 0;
LCD_SCL = 1;
}
}

/*********************LCD 设置坐标************************************/
void LCD_Set_Pos(unsigned char x, unsigned char y)
{
LCD_WrCmd(0xb0+y);
LCD_WrCmd(((x&0xf0)>>4)|0x10);
LCD_WrCmd((x&0x0f)|0x01);
}

void LCD_Fill(unsigned char bmp_dat)
{
unsigned char y,x;
for(y=0;y<8;y++)
{
LCD_WrCmd(0xb0+y);
LCD_WrCmd(0x01);
LCD_WrCmd(0x10);
for(x=0;x<X_WIDTH;x++)
LCD_WrDat(bmp_dat);
}
}

void LCD_Init(void)     
{  
LCD_SCL=1;
LCD_RST=0;
LCD_DLY_ms(50);
LCD_RST=1;       //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕   
LCD_WrCmd(0xae);//--turn off oled panel
LCD_WrCmd(0x00);//---set low column address
LCD_WrCmd(0x10);//---set high column address
LCD_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
LCD_WrCmd(0x81);//--set contrast control register
LCD_WrCmd(0xcf); // Set SEG Output Current Brightness
LCD_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
LCD_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
LCD_WrCmd(0xa6);//--set normal display
LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
LCD_WrCmd(0x3f);//--1/64 duty
LCD_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
LCD_WrCmd(0x00);//-not offset
LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
LCD_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
LCD_WrCmd(0xd9);//--set pre-charge period
LCD_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
LCD_WrCmd(0xda);//--set com pins hardware configuration
LCD_WrCmd(0x12);
LCD_WrCmd(0xdb);//--set vcomh
LCD_WrCmd(0x40);//Set VCOM Deselect Level
LCD_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
LCD_WrCmd(0x02);//
LCD_WrCmd(0x8d);//--set Charge Pump enable/disable
LCD_WrCmd(0x14);//--set(0x10) disable
LCD_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
LCD_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
LCD_WrCmd(0xaf);//--turn on oled panel
LCD_Fill(0x00);  //初始清屏
LCD_Set_Pos(0,0);        
}


void main(void)
{
        LCD_Init(); //oled 初始化  
        while(1)
{
        LCD_Fill(0xff); //屏全亮

}

}
这是我一个可以再STC51上运行的点亮OLED的程序,4线SPI方式,想移植到C8051F040上,但是没用过C8051F,4线SPI方式,按C8051F040数据手册配置I/O口一直点不亮,求大神指点一下,万分感谢!

相关帖子

沙发
ningling_21| | 2014-2-23 21:28 | 只看该作者
c8051fxxx
关看门狗
需配置时钟
端口方向
端口数据
点灯

使用特权

评论回复
板凳
wei9098|  楼主 | 2014-2-24 09:28 | 只看该作者
ningling_21 发表于 2014-2-23 21:28
c8051fxxx
关看门狗
需配置时钟

我这个程序只是一个把OLED的初始化程序通过4线SPI方式发到C8051F,麻烦问一下SCL和SDA没必要非得用P0^0和P0^1吧?只需要配置您说的那几个信息,其他程序都可以直接移植的是吗?第一次弄C8051F,非常感谢您的指点!

使用特权

评论回复
地板
ningling_21| | 2014-2-24 11:19 | 只看该作者
怎么越说越乱呢
4线SPI和 SDA,SCL (_IIC)有啥关系?
初始化程序发到C8051F,C8051F  是控制OLED ? 是给C8051F下载程序?

使用特权

评论回复
5
wei9098|  楼主 | 2014-2-24 15:22 | 只看该作者
麻烦您给看一下程序好吗?淘宝卖家说是SPI,我觉得就是IIC。。。这个程序在STC上可以运行,我想配置一下IO口运行到C8051F上,就是点不亮OLED
#include "C8051f040.h"
sbit LCD_SCL=P1^3; //时钟 D0(SCLK)
sbit LCD_SDA=P1^2; //D1(MOSI) 数据
sbit LCD_RST=P1^7; //复位
sbit LCD_DC =P1^6; //数据/命令控制

#define X_WIDTH 128
#define Y_WIDTH 64

void ClockInit( void )
{

}

void GPIOInit( void )
{
    XBR0 = 0x00;
    XBR1 = 0x00;
    XBR2 = 0x40;

        P1MDOUT=0XF3;
}
void LCD_DLY_ms(unsigned int ms)
{                        
unsigned int a;
while(ms)
{
a=1800;
while(a--);
ms--;
}
return;
}

void LCD_WrDat(unsigned char dat)         
{
unsigned char i;
LCD_DC=1;  
for(i=0;i<8;i++) //发送一个八位数据
{
if((dat << i) & 0x80)
{LCD_SDA  = 1;}
else  LCD_SDA  = 0;
LCD_SCL = 0;
LCD_SCL = 1;
}
}

void LCD_WrCmd(unsigned char cmd)
{
unsigned char i;
LCD_DC=0;
for(i=0;i<8;i++) //发送一个八位数据
{
if((cmd << i) & 0x80)
{LCD_SDA  = 1;}
else  LCD_SDA  = 0;
LCD_SCL = 0;
LCD_SCL = 1;
}
}

/*********************LCD 设置坐标************************************/
void LCD_Set_Pos(unsigned char x, unsigned char y)
{
LCD_WrCmd(0xb0+y);
LCD_WrCmd(((x&0xf0)>>4)|0x10);
LCD_WrCmd((x&0x0f)|0x01);
}

void LCD_Fill(unsigned char bmp_dat)
{
unsigned char y,x;
for(y=0;y<8;y++)
{
LCD_WrCmd(0xb0+y);
LCD_WrCmd(0x01);
LCD_WrCmd(0x10);
for(x=0;x<X_WIDTH;x++)
LCD_WrDat(bmp_dat);
}
}

void LCD_Init(void)     
{  
LCD_SCL=1;
LCD_RST=0;
LCD_DLY_ms(50);
LCD_RST=1;       //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕   
LCD_WrCmd(0xae);//--turn off oled panel
LCD_WrCmd(0x00);//---set low column address
LCD_WrCmd(0x10);//---set high column address
LCD_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
LCD_WrCmd(0x81);//--set contrast control register
LCD_WrCmd(0xcf); // Set SEG Output Current Brightness
LCD_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
LCD_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
LCD_WrCmd(0xa6);//--set normal display
LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
LCD_WrCmd(0x3f);//--1/64 duty
LCD_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
LCD_WrCmd(0x00);//-not offset
LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
LCD_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
LCD_WrCmd(0xd9);//--set pre-charge period
LCD_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
LCD_WrCmd(0xda);//--set com pins hardware configuration
LCD_WrCmd(0x12);
LCD_WrCmd(0xdb);//--set vcomh
LCD_WrCmd(0x40);//Set VCOM Deselect Level
LCD_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
LCD_WrCmd(0x02);//
LCD_WrCmd(0x8d);//--set Charge Pump enable/disable
LCD_WrCmd(0x14);//--set(0x10) disable
LCD_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
LCD_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
LCD_WrCmd(0xaf);//--turn on oled panel
LCD_Fill(0x00);  //初始清屏
LCD_Set_Pos(0,0);        
}


void main(void)
{
        WDTCN = 0xDE;
    WDTCN = 0xAD;
        ClockInit( );
    GPIOInit( );                    
        LCD_Init(); //oled 初始化  
        while(1)
{
        LCD_Fill(0xff); //屏全亮

}

}

使用特权

评论回复
6
ningling_21| | 2014-2-24 17:24 | 只看该作者
sbit LCD_SCL=P0^3; //时钟 D0(SCLK)
sbit LCD_SDA=P0^2; //D1(MOSI) 数据
sbit LCD_RST=P1^7; //复位
sbit LCD_DC =P1^6; //数据/命令控制

这几个 应该是输出

把对应的PxMDOUT 的对应位置为1 (推挽输出)就可以了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
wei9098 + 2 很给力!
7
wei9098|  楼主 | 2014-2-25 10:31 | 只看该作者
ningling_21 发表于 2014-2-24 17:24
sbit LCD_SCL=P0^3; //时钟 D0(SCLK)
sbit LCD_SDA=P0^2; //D1(MOSI) 数据
sbit LCD_RST=P1^7; //复位  ...

非常感谢,成功点亮了,不过我把端口改在了P3.0-P3.3,在P1.0-p1.3点不亮,这是为什么呢?

使用特权

评论回复
8
ningling_21| | 2014-2-25 10:56 | 只看该作者
wei9098 发表于 2014-2-25 10:31
非常感谢,成功点亮了,不过我把端口改在了P3.0-P3.3,在P1.0-p1.3点不亮,这是为什么呢? ...

多看看芯片资料,是不是P1口,是模拟输入的或其他功能...

使用特权

评论回复
9
cdf1214| | 2015-3-28 16:57 | 只看该作者
本公司主营TI. NXP. IR. ON. SiLicon                                                                                                       等著名世界品牌产品。
MSP430F一系列TI储存芯片 微控处理器
MSP430F149IPMR MSP430F5438AIPZR MSP430F5438IPZR等。
C8051F 一系列SILICON 单片机 微控处理器
C8051F020 C8051F120 C8051F340 C8051F040等
LPC一系列NXP单片机  
LPC2132FBD64 LPC2134FBD64 LPC2214FBD144  
LPC2378FBD144 LPC2292FBD144等一系列供应
专营:低压差 基准源 三 五 七端稳压 二三极管 场效应 快恢复 肖特基二极管 可控硅 达林顿 整流桥 TVS管 光藕 MAX AD 集成电路
                   北京长实拓展电子销售:陈冬锋
                                     QQ:2850327057
                      电话:15711002528,13641144498

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

22

帖子

0

粉丝