为什么80%的码农都做不了架构师?>>>   

简单理解下什么是IIC
I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。
总线信号 :

  SDA :串行数据线

  SCL :串行时钟

总线空闲状态 :

  SDA :高电平

  SCL :高电平

起始位:SCL为高电平期间 SDA出现下降沿
终止位:SCL为高电平期间 SDA出现上升沿

数据传输 :SDA的数据在SCL高电平期间被写入从机。所以SDA的数据变化要发生在SCL低电平期间。
先简单写出IIC.h头文件

#ifndef _IIC_H
#define _IIC_H
#include    "msp430f5529.h"
//IIC通信接口引脚输出宏定义
#define   SCL_HIGH    P6OUT|=BIT3  //定义引脚6.3为高电平时的输出
#define   SCL_LOW     P6OUT&=~BIT3//定义引脚6.3为低电平时的输出
#define   SDA_HIGH    P6OUT|=BIT4//定义引脚6.4为高电平时的输出
#define   SDA_LOW     P6OUT&=~BIT4//定义引脚6.4为低电平时的输出#define XLevelL           0x00//低位地址
#define XLevelH           0x10//高位地址
#define XLevel            ((XLevelH&0x0F)*16+XLevelL)
#define Max_Column        128//最大屏幕像素宽度
#define Max_Row           64 //最大屏幕像素宽度
#define Brightness        0xCF //IIC起始地址
#define X_WIDTH           128//屏幕像素宽度
#define Y_WIDTH           64 //屏幕像素高度
void IIC_delayus(unsigned int i);
void IIC_ioinit(void);//初始化IIC
void IIC_start(void);//开始IIC通信
void IIC_stop(void);//结束IIC通信
void IIC_writebyte(unsigned char IIC_byte);//写字节
void IIC_writecmd(unsigned char IIC_command);//写命令
void IIC_writedata(unsigned char IIC_data);//写数据
void LCD_Set_Pos(unsigned char x, unsigned char y);//设置显示位置
void LCD_CLS(void);//清屏
void LCD_Init(void);//OLED屏初始化
void LCD_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size);//显示字符
void LCD_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char Char_Size);//显示字符串
void LCD_ShowNum(unsigned char x,unsigned char y,unsigned long num,unsigned char len,unsigned char size2);//显示数字
unsigned long oled_pow(unsigned char m,unsigned char n);//字符求幂函数
#endif //_IIC_H
#include        "IIC.h"
#include "font.h"
//延时函数延时=4*i
void IIC_delayus(unsigned int i)
{unsigned int j,k;for(k=0;k<i;k++)for(j=0;j<4;i++);
}//IIC初始化函数
void IIC_ioinit()
{P6DIR|=BIT1|BIT2|BIT3|BIT4; //配置IIC IO口为输出方向P6REN|=BIT3|BIT4; //配置IIC IO口使能上拉电阻P6OUT&=~BIT1;//6.1 拉高P6OUT|=BIT2;//6.2 拉低
}//开始一个IIC通信
void IIC_start()
{//产生信号上升沿SCL_HIGH;//SCL拉高SDA_HIGH;//SDA拉高
//接下来产生SDA信号下降沿,注意,这里SDA一定比SCL先拉低//IIC_delayus(2);SDA_LOW;//SDA拉低//IIC_delayus(2);SCL_LOW;//SCL拉低
//主机开始读写信号产生完毕
}//停止IIC通信
void IIC_stop()
{SCL_LOW;SDA_LOW;//IIC_delayus(2);
//接下来产生SDA信号上升沿,注意,这里SCL一定比SDA先拉高SCL_HIGH;SDA_HIGH;//IIC_delayus(2);
}//IIC发送一个byte
void IIC_writebyte(unsigned char IIC_byte)
{unsigned char i;
//一个字节8bit因此,循环从0开始到7共8次写数据for(i=0;i<8;i++)  {if(IIC_byte&0x80)  //如果写满8字节且不为0SDA_HIGH;//拉高SDA信号else//没有写满8字节SDA_LOW;//写入0SCL_HIGH;//拉高SCL结束一bit的写SCL_LOW;//拉低SCL使得SDA可写IIC_byte<<=1;   //IIC_byte左移一位,故名思意了
//假设IIC_byte数据为字符c 那么它的二进制就是01100011写入寄存器就是
//第一遍循环11000110
//第二遍循环10001100
//第三遍循环00011000
//第四遍循环00110000
//第五遍循环01100000
//第六遍循环11000000
//第七遍循环10000000
//第八遍循环00000000 全为0拉高SDA}SDA_HIGH;//恢复拉高SDASCL_HIGH;//恢复拉高SCLSCL_LOW;//拉低SCL等待SDA电平变动
}void IIC_writecmd(unsigned char IIC_command)
{IIC_start();IIC_writebyte(0x78);   //Slave address,SA0=0 从机寄存器地址IIC_writebyte(0x00);   //发送指令写指令IIC_writebyte(IIC_command);//写入指令IIC_stop();//结束IIC通信
}void IIC_writedata(unsigned char IIC_data)
{IIC_start();IIC_writebyte(0x78);   //IIC写从机起始地址IIC_writebyte(0x40);   //write data写数据IIC_writebyte(IIC_data);//写入字符数据IIC_stop();
}/**************************LCD 设置坐标*******************************/
void LCD_Set_Pos(unsigned char x, unsigned char y)
{
//OLED寄存器指令集查看OLED芯片手册IIC_writecmd(0xb0+y);IIC_writecmd(((x&0xf0)>>4)|0x10);IIC_writecmd((x&0x0f)|0x01);
}/***************************LCD复位************************************/
void LCD_CLS(void)
{unsigned char y,x;        for(y=0;y<8;y++){IIC_writecmd(0xb0+y);IIC_writecmd(0x01);IIC_writecmd(0x10);for(x=0;x<X_WIDTH;x++)IIC_writedata(0);}
}/***************************LCD初始化************************************/
void LCD_Init(void)
{IIC_ioinit();IIC_writecmd(0xAE);   //display offIIC_writecmd(0x20); //Set Memory Addressing ModeIIC_writecmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,InvalidIIC_writecmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7IIC_writecmd(0xc8); //Set COM Output Scan DirectionIIC_writecmd(0x00);//---set low column addressIIC_writecmd(0x10);//---set high column addressIIC_writecmd(0x40);//--set start line addressIIC_writecmd(0x81);//--set contrast control registerIIC_writecmd(0x7f);IIC_writecmd(0xa1);//--set segment re-map 0 to 127IIC_writecmd(0xa6);//--set normal displayIIC_writecmd(0xa8);//--set multiplex ratio(1 to 64)IIC_writecmd(0x3F);//IIC_writecmd(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM contentIIC_writecmd(0xd3);//-set display offsetIIC_writecmd(0x00);//-not offsetIIC_writecmd(0xd5);//--set display clock divide ratio/oscillator frequencyIIC_writecmd(0xf0);//--set divide ratioIIC_writecmd(0xd9);//--set pre-charge periodIIC_writecmd(0x22); //IIC_writecmd(0xda);//--set com pins hardware configurationIIC_writecmd(0x12);IIC_writecmd(0xdb);//--set vcomhIIC_writecmd(0x20);//0x20,0.77xVccIIC_writecmd(0x8d);//--set DC-DC enableIIC_writecmd(0x14);//IIC_writecmd(0xaf);//--turn on oled panelLCD_CLS();LCD_Set_Pos(0,0);
}//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示
//size:选择字体 16/12
void LCD_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
{       unsigned char c=0,i=0;    c=chr-' ';//得到偏移后的值          if(x>Max_Column-1)//如果,字符坐标大于行最大像素值写到下一行开始位置{x=0;y=y+2;}if(Char_Size ==16)//如果字符刚好等于16字符{LCD_Set_Pos(x,y);   for(i=0;i<8;i++)IIC_writedata(F8X16[c*16+i]);LCD_Set_Pos(x,y+1);for(i=0;i<8;i++)IIC_writedata(F8X16[c*16+i+8]);}else //否则写到下一行{ LCD_Set_Pos(x,y);for(i=0;i<6;i++)IIC_writedata(F6x8[c][i]);           }
}//显示一个字符号串
void LCD_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char Char_Size)
{unsigned char j=0;while (chr[j]!='\0')//遍历字符串,x+8相当于每个字符间隔8个坐标 循环调用显示字符函数,直到字符串为空{      LCD_ShowChar(x,y,chr[j],Char_Size); x+=8;if(x>128){x=0;y+=2;}j++; }
}//m^n函数
unsigned long oled_pow(unsigned char m,unsigned char n)
{unsigned long result=1;    while(n--)result*=m;    return result;
}   //显示一个数字将数字取模获取每一位的数字,以字符的形式显示
//当输入数字为9876时坐标为0,0时
//取得每一位数
//第一遍循环 9876%10=987 余6 6+'0'='6' 坐标 x=0 y=0
//第二遍循环 987%10=98 余7 7+'0'='7‘ 坐标 x=0+8=8 y=0
//第三遍循环 98%10=9 余6 6+'0'='7' 坐标 x=8+8=16 y=0
//第四遍循环 9%10=0 余9 9+'0'='9' 坐标 x=16+8=24 y=0
//其他以此类推
void LCD_ShowNum(unsigned char x,unsigned char y,unsigned long num,unsigned char len,unsigned char size2)
{           unsigned char t,temp;//unsigned char enshow=0;                        for(t=0;t<len;t++){temp=(num/oled_pow(10,len-t-1))%10;LCD_ShowChar(x+(size2/2)*t,y,temp+'0',size2); }
}

转载于:https://my.oschina.net/VenusV/blog/1796004

MSP430F5529LP(一)IIC与OLED的HELLOWRLD相关推荐

  1. 利用51单片机+0.96寸iic接口oled显示图片或动图

    利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...

  2. IIC 驱动OLED

    IIC总线可以驱动很多器件,比较常见的有OLED.EEPROM存储器(AT24C02).温度传感器(LM75A).温湿度传感器(DHT11)等.有关IIC总线协议的基本原理可以看我之前的文章介绍.这一 ...

  3. 12. STM32——硬件IIC驱动OLED屏幕显示

    STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...

  4. 15. STM32——软件IIC驱动OLED屏幕显示字符、字符串、数字、汉字

    STM32--软件IIC驱动OLED屏幕显示 OLED屏幕 写命令 写内容 对OLED写入一个字节 设置光标 启动OLED 关闭OLED 全屏填充(清屏) 显示字符 显示字符串 获取次方 显示数字 显 ...

  5. 51单片机IIC 12864 OLED屏幕滚动显示仿真

    51单片机IIC 12864 OLED屏幕滚动显示仿真 程序代码接着前面文章<STC15W408AS单片机IIC驱动0.96寸OLED显示> 这里不再贴出代码了,前面有一篇有实物效果演示, ...

  6. RA4M2开发(2)----基于IIC驱动OLED

    概述 在e2studio中创建新的工程并导入必要的文件,包括I2C驱动代码和SSD1306 OLED显示驱动代码. 配置RA4M2的I2C接口,使其作为I2C master进行通信. 初始化SSD13 ...

  7. IIC的OLED显示程序

    基于物联网的智能窗户Day2 OLED显示 模块介绍 IIC接口模块 代码程序 ending OLED显示 因为是打算先完成硬件部分再与app对接,为了初期各模块功能测试,及自动状态的调试,加一块0. ...

  8. 一知半解学CubeMX——IIC:OLED屏显示

    一知半解学习环境:     1.CubeMX 4.23.0     2.uVision 5.14.2     3.MCU 启明 STM32F407 开发板(高配版) V3.1     4.中景园电子0 ...

  9. 0.96寸4引脚(IIC协议)OLED驱动程序

    使用STM32F103xxx对0.96寸OLED进行驱动显示. 1.IIC协议代码  iic.c #include "iic.h" #include "delay.h&q ...

最新文章

  1. 取代MybatisPlus?阿里推出了新 ORM 框架!(两者对比参考)
  2. 企鹅科技获蚂蚁金服亿元战略投资,利用智慧物联赋能商用洗衣设备
  3. vc2010中开始执行不调试灰的_反编译动态调试smali全过程
  4. Linux C++线程池
  5. TypeScript 学习一 参数,函数,析构表达式
  6. smoke中文_smoke的意思在线翻译,解释smoke中文英文含义,短语词组,音标读音,例句,词源【澳典网ODict.Net】...
  7. 工业交换机的几大“择机”标准,你学会了吗?
  8. 【LeetCode笔记】54. 螺旋矩阵(Java、迭代、递归)
  9. 循环结构, while, do……while
  10. java正则表达式 分词_[Java]使用正则表达式实现分词
  11. 一套即时通讯聊天程序源码 VUE写的
  12. haproxy负载均衡_Haproxy+keepalived高可用集群实战
  13. 如何保护网页按钮不被XSS自动点击
  14. Selinux学习笔记----术语
  15. PyTips 0x14 - Python 描述符
  16. 【常用 JS 插件】jQuery TreeTable 树表格插件
  17. fsearch:适用于linux的快速查找软件(类似everything)安装教程
  18. halcon 1维测量
  19. uni-app微信小程序短信验证、微信支付
  20. 毕业即失业,转行软件测试的辛酸泪只有自己知道

热门文章

  1. 新冠治愈之旅和未来的时光
  2. [BJOI2019]勘破神机(第一类斯特林数,斐波那契数列)
  3. webpack雪碧图生成
  4. 查看电脑曾经连接过的WiFi名称和密码的方法
  5. ssm+vue基本微信小程序的校园二手商城系统 计算机毕业设计
  6. 两个服务共用一个微信支付
  7. JS学习之路,菜鸟总结的注意事项及错误更正
  8. 《安富莱嵌入式周报》第251期:2022.01.31--2022.02.06
  9. jenkins 出现“Error 403 No valid crumb was included in the request ”的解决方案
  10. 联邦学习学习笔记——论文理解《Communication-Efficient Learning of Deep Networks from Decentralized Data》