可以的,但SPI接口的器件有多种工作方式,如高位在前还是低位在前,空闲时时钟线高电平还是低电平 第一个跳变沿还是第二个跳变沿数据有效,程序是不同的,下面程序供参考 sbit CLK=P2^2;sbit MOSI=P2^3; //发送

1.定义三个gpio: p0-sclk, p1-sdi, p2-sdo;p0用于模拟spi的clock,p1用于接收数据,p2用于f发送数据;硬件上单片机A的p0接单片机B的p0,A的p1接B的p2,A的p2接B的p1 2.发送程序:clock拉低,sdo输出0或1(数据

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节 SPI_RW_Reg(WRITE_REG + CONFIG

void spi_start(void){ OEE|=spi_ce+spi_di+spi_clk;OEE &= ~spi_do;SYNCDELAY;IOE&=~(spi_ce|spi_clk);SYNCDELAY;} void spi_stop(void){ IOE |=spi_ce;SYNCDELAY;} void spi_wr(unsigned char command)

能不能让我看看你的液晶,或者多一些液晶的资料,至少能拍张照片看看,应该能找到型号的

include //STC12LE5A60S2单片机自带SPI控制器连接 void init_spi(void)

求51单片机模拟SPI通讯的C程序,最好带详解!谢谢

如果是八位就很方便,下边是16位的你参考一下 ,4X4的键盘显示16个数 FLAG BIT 40H ORG 00H CLR FLAG MAIN: MOV P2,#00H MOV DPTR,#TAB ACALL KEYSCAN AGAIN: ACALL DISP JB FLAG,AGAIN ;无键按下,继续显示

利用51单片机控制lcd12864显示一串数字比如:123456789可际上很简单,刷新而已,你让他按一下就在程序里去一个数字,然后刷新lcd的显示不就得了。

WriteData(string[i]); //将第i个字符数组元素写入LCDi++; //指向下一个数组元素 }WriteAddress(0x46); //写地址,将第二个分号显示在第2行第7列 WriteData(':'); //将分号的字符常量写入LCDWriteAddress(0x49); //写

先实现划线的函数,把相邻的采样点转化为屏幕坐标之后,连接起来就可以了,下面划线函数可以作为参考 void Line(char x1,char y1,char x2,char y2){ char xdelta; // width of rectangle around line char ydelta; /

首先要做的就是 OLED的显示驱动程序,写好这个那你发什么数据都可以了,然后 获取矩阵按键的键值,根据键值判断需要往OLED发送的数据,然后调用显示驱动程序发送就行了。

要有一系列的功能函数将单片机与液晶屏联系起来,根据LCD驱动的时序要编写bit数据函数,写字节函数,写地址函数等等,单片机通过这些函数将要显示的内容写入12864自身的RAM存储器,而后LCD会自己将这些东西映射到屏上,我们就看到

建议你用最下面的显示字符串函数试试看。

51单片机怎么在oled屏幕上面输出数组?

//显示Lled4 = 0;delay(50);led4 = 1;P0 = led_paly[3];//显示Eled5 = 0;delay(50);led5 = 1;P0 = led_paly[4];//显示Oled6 = 0;delay(50);led6 = 1; }void main(void){while(1){display(

又是你?12864分页 行 列 然后设置好你的位置 根据手册 利用软件(字符生成软件)把你需要的字符生成 数组 输入到该位置。。。这是思路 具体看手册。。

LED 屏的操作;与所用的处理器平台没有关系。 因为大家对 C51 单片机相对都比较熟悉;大学里基本上都学习过;在此我以 C51 的程序来作简单说明

void Line(char x1,char y1,char x2,char y2){ char xdelta; // width of rectangle around line char ydelta; // height of rectangle around line char xinc; //increment for moving x coordinate char yinc

型号:OL035DZ_02WN 图像点阵 480×RGB×800行 视域尺寸 46.08*76.8mm 外形尺寸 50.98*102.86mm 视域对角线 3.5英寸 接口方式 总线方式 显示颜色 256/65k色 背光类型 自发光 工作

首先建个显存数组,将要显示的数据写入显存里,再将整个显存通过显示图片的方式写入5110的RAM里显示就OK啦!我的12864OLED也读不出内部的DDRAM,但我刚用这种方法给12864OLED打点了。unsigned char xdata memory[128] ;//显存

怎样用oled12864画一个点?我的是淘宝上常见的0.96‘的OLED。求51单片机的程序。

1.定义三个gpio: p0-sclk, p1-sdi, p2-sdo;p0用于模拟spi的clock,p1用于接收数据,p2用于f发送数据;硬件上单片机A的p0接单片机B的p0,A的p1接B的p2,A的p2接B的p1 2.发送程序:clock拉低,sdo输出0或1(数据

下面就是一个 SPI 输出的函数,时序,在程序里面,表述的非常清楚。sbit sck = P2^7;//移位时钟 sbit da1 = P2^6;//串行数据 void send(char dat){ char i;for(i = 0; i < 8; i++) { if((dat >>

sbit SPI_DI =P0^1; //MMC数据输入 sbit SPI_DO =P0^0;//MMC数据输出,可不接 sbit SPI_SCL=P0^2;//时钟线 void Write_Byte(unsigned char value){ unsigned char i;for (i=0;i<8;i++){ if (((value

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节 SPI_RW_Reg(WRITE_REG + CONFIG

//STC12LE5A60S2单片机自带SPI控制器连接 void init_spi(void)

用51单片机引脚实现spi功能的程序

建议你用最下面的显示字符串函数试试看。

你可以参考这篇文字:51单片机OLED显示时钟

OLED程序很可能只用几个单片机管脚,你这个平衡小车程序用的东西多,估计配置的管脚和OLED有冲突,所以不显示了。可能性较大的是NRF24L01

先实现划线的函数,把相邻的采样点转化为屏幕坐标之后,连接起来就可以了,下面划线函数可以作为参考 void Line(char x1,char y1,char x2,char y2){ char xdelta; // width of rectangle around line char ydelta; /

OLED怎样实时显示51单片机测得的数据?

首先建个显存数组,将要显示的数据写入显存里,再将整个显存通过显示图片的方式写入5110的RAM里显示就OK啦!我的12864OLED也读不出内部的DDRAM,但我刚用这种方法给12864OLED打点了。 unsigned char xdata memory[128] ;//显存 //在随意坐标上画点void OLED_Drawpoint(unsigned char x, unsigned char y,bit dat){//x,y,行列坐标;dat,1写,0擦除 unsigned char rdata;rdata=memory[y/8*128+x]; //先将对应的字节数据从显存数组读出来if(dat==1){memory[y/8*128+x]=rdata|(0x01<<(y%8));//将读出来的数据加上添加点的数据}else{memory[y/8*128+x]=rdata-(0x01<<(y%8));}} OLED_DrawBMP(0,0,128,8,memory);//(显示图片函数)将显存的数据导入显示屏
我会.找我
发给你了,是C的

如下 #include typedef unsigned int uint; typedef unsigned char uchar; #define BIT(x) (1 << (x)) extern const unsigned char shuzi_table[]; void Send(uchar type,uchar transdata); /**********液晶控制IO的宏定义*************/ #define cyCS 0 //P3.0,片选信号 #define cySID 1 //P3.1,串行数据 #define cyCLK 2 //P3.2,同步时钟 #define cyPORT P3OUT #define cyDDR P3DIR /******************************************* 函数名称:delay_Nus 功 能:延时N个us的时间 参 数:n--延时长度 返回值 :无 ********************************************/ void delay_Nus(uint n) { uchar i; for(i = n;i > 0;i--) _NOP(); } /******************************************* 函数名称:delay_1ms 功 能:延时约1ms的时间 参 数:无 返回值 :无 ********************************************/ void delay_1ms(void) { uchar i; for(i = 150;i > 0;i--) _NOP(); } /******************************************* 函数名称:delay_Nms 功 能:延时N个ms的时间 参 数:无 返回值 :无 ********************************************/ void delay_Nms(uint n) { uint i = 0; for(i = n;i > 0;i--) delay_1ms(); } /******************************************* 函数名称:Ini_Lcd 功 能:初始化液晶模块 参 数:无 返回值 :无 ********************************************/ void Ini_Lcd(void) { cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS); //相应的位端口设置为输出 delay_Nms(100); //延时等待液晶完成复位 Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/ delay_Nus(72); Send(0,0x02); /*DDRAM地址归位*/ delay_Nus(72); Send(0,0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/ delay_Nus(72); Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/ delay_Nus(72); Send(0,0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ delay_Nus(72); } /******************************************* 函数名称:Send 功 能:MCU向液晶模块发送1一个字节的数据 参 数:type--数据类型,0--控制命令,1--显示数据 transdata--发送的数据 返回值 :无 ********************************************/ void Send(uchar type,uchar transdata) { uchar firstbyte = 0xf8; uchar temp; uchar i,j = 3; if(type) firstbyte |= 0x02; cyPORT |= BIT(cyCS); cyPORT &= ~BIT(cyCLK); while(j > 0) { if(j == 3) temp = firstbyte; else if(j == 2) temp = transdata&0xf0; else temp = (transdata << 4) & 0xf0; for(i = 8;i > 0;i--) { if(temp & 0x80) cyPORT |= BIT(cySID); else cyPORT &= ~BIT(cySID); cyPORT |= BIT(cyCLK); temp <<= 1; cyPORT &= ~BIT(cyCLK); } //三个字节之间一定要有足够的延时,否则易出现时序问题 if(j == 3) delay_Nus(600); else delay_Nus(200); j--; } cyPORT &= ~BIT(cySID); cyPORT &= ~BIT(cyCS); } /******************************************* 函数名称:Clear_GDRAM 功 能:清除液晶GDRAM内部的随机数据 参 数:无 返回值 :无 ********************************************/ void Clear_GDRAM(void) { uchar i,j,k; Send(0,0x34); //打开扩展指令集 i = 0x80; for(j = 0;j < 32;j++) { Send(0,i++); Send(0,0x80); for(k = 0;k < 16;k++) { Send(1,0x00); } } i = 0x80; for(j = 0;j < 32;j++) { Send(0,i++); Send(0,0x88); for(k = 0;k < 16;k++) { Send(1,0x00); } } Send(0,0x30); //回到基本指令集 } /******************************************* 函数名称:Draw_PM 功 能:在整个屏幕上画一个图片 参 数:ptr--指向保存图片位置的指针 返回值 :无 ********************************************/ void Draw_PM(const uchar *ptr) { uchar i,j,k; Send(0,0x34); //打开扩展指令集 i = 0x80; for(j = 0;j < 32;j++) { Send(0,i++); Send(0,0x80); for(k = 0;k < 16;k++) { Send(1,*ptr++); } } i = 0x80; for(j = 0;j < 32;j++) { Send(0,i++); Send(0,0x88); for(k = 0;k < 16;k++) { Send(1,*ptr++); } } Send(0,0x36); //打开绘图显示 Send(0,0x30); //回到基本指令集 } /******************************************* 函数名称:Draw_TX 功 能:在液晶上描绘一个16*16的图形 参 数:Yaddr--Y地址, Xaddr--X地址 dp--指向保存图形数据的指针 返回值 :无 ********************************************/ void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp) { uchar j; uchar k = 0; Send(0,0x34); //使用扩展指令集,关闭绘图显示 for(j = 0;j < 16;j++) { Send(0,Yaddr++); //Y地址 Send(0,Xaddr); //X地址 Send(1,dp[k++]); //送两个字节的显示数据 Send(1,dp[k++]); } Send(0,0x36); //打开绘图显示 Send(0,0x30); //回到基本指令集模式 }
如图所示连接就可以。