摘要:数据的输入总是低位在前高位在后传输数据输入的开始条件是为高电平时,由高变低结束条件是为高时,由低电平变为高电平。
写 SRAM 数据地址自动加 1 模式:
#include "my_iic.h"#include "sys.h"#include "intrins.h"#define out_H 1#define out_L 0void myI2C_delay_us(unsigned int us){ while(us--){ _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); }}#if(1)/************************************************************************************************函数名 :*函数功能描述 :*函数参数 :*函数返回值 :*作者 :*函数创建日期 :20210928*函数修改日期 :*修改人 :*修改原因 :*版本 :*历史版本 :***********************************************************************************************/void myI2c_Start(void){ MY_SCL_Port = out_H; myI2C_delay_us(2); MY_SDA_Port = out_L; myI2C_delay_us(2); }/************************************************************************************************函数名 :*函数功能描述 :*函数参数 :*函数返回值 :*作者 :*函数创建日期 :20210928*函数修改日期 :*修改人 :*修改原因 :*版本 :*历史版本 :***********************************************************************************************/void myI2c_Stop(void){// myI2C_delay_us(200); MY_SCL_Port = out_L;// myI2C_delay_us(2); MY_SDA_Port = out_L; myI2C_delay_us(2); MY_SCL_Port = out_H;// myI2C_delay_us(2); MY_SDA_Port = out_H; myI2C_delay_us(2); }/************************************************************************************************函数名 :*函数功能描述 :*函数参数 :*函数返回值 :*作者 :*函数创建日期 :20210928*函数修改日期 :*修改人 :*修改原因 :*版本 :*历史版本 :***********************************************************************************************/void myI2c_sendByte(unsigned char dat){ char i=0; for(i=0;i<8;i++){ MY_SCL_Port = out_L; myI2C_delay_us(1); if(dat&0x01){ MY_SDA_Port = out_H; } else { MY_SDA_Port = out_L; } myI2C_delay_us(1); MY_SCL_Port = out_H; dat>>=1; myI2C_delay_us(2); } MY_SCL_Port = out_L; myI2C_delay_us(2);}#endif#if(0) //2021-09-29 20:00void myI2c_Start(void){ MY_SDA_Port = out_H; MY_SCL_Port = out_H; _nop_(); _nop_(); MY_SDA_Port = out_H; _nop_(); _nop_(); MY_SDA_Port = out_L; _nop_(); _nop_(); _nop_(); _nop_(); MY_SCL_Port = out_L; _nop_(); _nop_(); }void myI2c_Stop(void){ MY_SCL_Port = out_H;// _nop_(); _nop_(); MY_SDA_Port = out_L; _nop_(); _nop_(); MY_SDA_Port = out_H;// _nop_(); _nop_(); MY_SCL_Port = out_L; _nop_(); _nop_(); MY_SDA_Port = out_L; }void myI2c_sendByte(unsigned char dat){ char i=0; for(i=0;i<8;i++){ MY_SCL_Port = out_L; if(dat&0x01){ MY_SDA_Port = out_H; } else { MY_SDA_Port = out_L; } _nop_(); _nop_(); _nop_(); MY_SCL_Port = out_H; dat>>=1; } MY_SCL_Port = out_L; _nop_(); _nop_(); _nop_(); MY_SDA_Port = out_L; }#endifvoid myI2c_cmdSend(unsigned char cmd){ myI2c_Start(); myI2c_sendByte(cmd); myI2c_Stop();} void myI2c_nbByte(unsigned char cmd,unsigned char *str,unsigned char len){ unsigned char i=0; myI2c_Start(); myI2c_sendByte(cmd); for(i=0;i
显示驱动
#include "FZHxxx.h"#include "my_iic.h"#include "intrins.h"uint8_t code SEG_CODE[16]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uint8_t fzh_light_grade = 0x8c;int8_t fzh_WriteSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 ) { if( ( len==0 )||( len>16 ) ) { return -1; } myI2c_cmdSend( cmd1 ); myI2c_nbByte(cmd2,str,len ); myI2c_cmdSend( cmd3 ); return 0;}int8_t fzh_cmdWrite( uint8_t cmd ) { myI2c_cmdSend( cmd ); return 0;}int8_t fzh_cmdWriteDat( uint8_t cmd,uint8_t dat ) { myI2c_nbByte( cmd,&dat,1 ); return 0;}void fzh_desplay( uint8_t nb2,uint8_t nb1, uint8_t nb0 ) { uint8_t temp_buff[8]; uint8_t Nunber_Size; Nunber_Size =sizeof( SEG_CODE ); if( Nunber_Size>(nb0&0x7f)) { nb0 &= ~0x7f; nb0 |= Nunber_Size; } if( Nunber_Size>nb1 ){ nb1 &= ~0x7f; nb1 |= Nunber_Size; } if( Nunber_Size>nb2 ) { nb2 &= ~0x7f; nb2 |= Nunber_Size; } (nb0>=0x7f)? temp_buff[0] = (SEG_CODE[nb0]|0x80):SEG_CODE[nb0]; (nb1>=0x7f)? temp_buff[0] = (SEG_CODE[nb1]|0x80):SEG_CODE[nb1]; (nb2>=0x7f)? temp_buff[0] = (SEG_CODE[nb2]|0x80):SEG_CODE[nb2]; fzh_WriteSram( 0x40,START_SRAM,temp_buff,3,fzh_light_grade); //命令1 命令2 数据 数据长度 命令三 //打开显示 11、16}void fzh_DEC_Number(uint16_t nb,uint8_t dip ){ uint8_t number_2=0; uint8_t number_1=0; uint8_t number_0=0; //65536 999 0.99 9.99 if(nb >999){ nb = 999; } (dip>=2)? (number_2 = (nb/100%10)|0x80):(number_2 = (nb/100%10)); (dip==1)? (number_1 = (nb/100%10)|0x80):(number_1 = (nb/100%10)); number_0 = nb%10; fzh_desplay(number_2,number_1,number_0);}void fzh_SetLightGrade(uint8_t grade,uint8_t onff){ if(grade>7)grade=7; fzh_light_grade = 0; if(onff!=0){ fzh_light_grade = FZH_CMD_ON|grade; }else { fzh_light_grade = FZH_CMD_FF; }}void fzh_Init(void){ myI2C_init(); fzh_SetLightGrade(USAER_CMD_CYCLE_11_16,USAER_CMD_SHOW_ON);}头文件--------------------------------------------------------------------------------#ifndef __FZHXXX_H#define __FZHXXX_H#define cmdData //010000#include "sys.h"enum GRID{ grid1=0xc0, grid2, grid3, grid4, grid5, grid6, grid7, grid8, grid9, grid10, grid11, grid12, grid13, grid14, grid15, grid16};#define START_SRAM grid5#define FZH_CMD_ON 0x88 //打开数码管#define FZH_CMD_FF 0x80 //关闭数码管#define USAER_CMD_CYCLE_1_16 0#define USAER_CMD_CYCLE_2_16 1#define USAER_CMD_CYCLE_4_16 2#define USAER_CMD_CYCLE_10_16 3#define USAER_CMD_CYCLE_11_16 4#define USAER_CMD_CYCLE_12_16 5#define USAER_CMD_CYCLE_13_16 6#define USAER_CMD_CYCLE_14_16 7#define USAER_CMD_SHOW_ON 1#define USAER_CMD_SHOW_OFF 0#define SEG_NUMBER(mode,y) if(mode) (y|0x80) else y //未调用接口 int8_t fzh_WriteSram(uint8_t cmd1,uint8_t cmd2,uint8_t *str,uint8_t len,uint8_t cmd3 );int8_t fzh_cmdWrite(uint8_t cmd);int8_t fzh_cmdWriteDat(uint8_t cmd,uint8_t dat);/*************************************************************************************************函数名 :void fzh_desplay( uint8_t nb2,uint8_t nb1, uint8_t nb0 )*函数功能描述 :数据数据显示*函数参数 : nb2 nb1 nb0 显示的文字支持 0-F 支持拓展,对数据高位置1可显示小数点*函数返回值 :无*作者 :SY*函数创建日期 :2021-10-07************************************************************************************************/void fzh_desplay( uint8_t nb2,uint8_t nb1, uint8_t nb0 );/*************************************************************************************************函数名 :void fzh_DEC_Number(uint16_t nb,uint8_t dip )*函数功能描述 :十进制数据显示*函数参数 : nb 显示的数值 dip 放大的倍数,支持0、1、2*函数返回值 :无*作者 :SY*函数创建日期 :20211007************************************************************************************************/void fzh_DEC_Number(uint16_t nb,uint8_t dip );/*************************************************************************************************函数名 :void fzh_SetLightGrade(uint8_t grade,uint8_t onff)*函数功能描述 :亮度设置*函数参数 :grade:亮度等级 支持7个等级 参考宏定义USAER_CMD_CYCLE_ onff 0:关闭显示 其它:显示*函数返回值 :无*作者 :SY*函数创建日期 :20211007************************************************************************************************/void fzh_SetLightGrade(uint8_t grade,uint8_t onff);/*************************************************************************************************函数名 :void fzh_Init(void)*函数功能描述 :数码管初始化数码管显示驱动 并设为等亮度 默认显示*函数参数 :无*函数返回值 :无*作者 :SY*函数创建日期 :20211007************************************************************************************************/void fzh_Init(void);#endif
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/121771.html
摘要:单片机在一片集成电路芯片上集成微处理器存储器接口电路,从而构成了单芯片微型计算机,即单片机。没搞懂专栏咋弄的,慢慢摸索吧,本人纯新手,读书人的事没啥要脸不要脸的,有问题随便指出,随便喷,欢迎来指点 2021-9-25 自己手绘的一张图,算是简单的介绍吧 对照实图看一下 ...
摘要:当小于时,由供电读数据工作时序单字节写入上升沿置高电平,下降沿置低电平。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持然后总线被释放见图。因此,总线控制器在读时序开始后必须停止把脚驱动为低电平以读取脚状态。 目录 一、前言 二、总体的设计思路 (一)使用器材 (二...
摘要:现在,单片机的名称不再是特指公司推出的系列单片机,而是对兼容英特尔指令系统的单片机的统称。单片机主要品牌及其产品英特尔,等艾特梅尔,,等飞利浦华邦达拉斯西门子等公司的许多产品宏晶系列系列系列等。 ...
摘要:所以我必须基于自己现在的情况走出一条适合自己情况的成长路线。下位机上位机的思想下位机上位机这就是我自己探索出来的技术成长路线。对和嵌入式的朋友感兴趣的朋友可以试一下我这条学习路线 ...
阅读 1692·2021-11-22 15:33
阅读 1954·2021-10-08 10:04
阅读 3520·2021-08-27 13:12
阅读 3366·2019-08-30 13:06
阅读 1440·2019-08-29 16:43
阅读 1362·2019-08-29 16:40
阅读 693·2019-08-29 16:15
阅读 2726·2019-08-29 14:13