51单片机main()main函数执行完不退出到最后会复位吗

21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
查看: 1077|回复: 14
51的程序在通电后要复位几次才能运行,是上电复位做得不好吗
&&未结帖(20)
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
最近第一次自己洗板,在开发板上能正确运行程序。可是把单片机插到自己的板上,通电后要按好几次复位才能运行,是不是上电复位没做好?
主题帖子积分
主题帖子积分
专家等级:结帖率:97%打赏:0.00受赏:38.00
主题帖子积分
也可能是你板子上有某些指标临界,不一定是复位的问题,还可能是晶体起振困难,程序操作了E2等问题。总之,在自己身上找问题,这种现象一般都不能推给单片机本身设计不良。
++++看NE5532教学视频,炼就工程技术研发功力++++++++++
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
NE5532 发表于
也可能是你板子上有某些指标临界,不一定是复位的问题,还可能是晶体起振困难,程序操作了E2等问题。总之, ...
我的意思是不是我复位按键那个模块没做好,比如电容焊得不好,选值有问题
主题帖子积分
主题帖子积分
专家等级:结帖率:97%打赏:0.00受赏:38.00
主题帖子积分
深海鱼男 发表于
我的意思是不是我复位按键那个模块没做好,比如电容焊得不好,选值有问题 ...
我的意思是你这种现象我见得多了,不仅是复位可能有问题,还可能其他地方有问题。单一个按键,你焊得再烂,设计得再差,也不大可能会出现这种现象。更多应该在时间配合、工作电源上去找问题。
++++看NE5532教学视频,炼就工程技术研发功力++++++++++
主题帖子积分
初级工程师, 积分 2109, 距离下一级还需 891 积分
初级工程师, 积分 2109, 距离下一级还需 891 积分
主题帖子积分
专家等级:结帖率:97%
主题帖子积分
初级工程师, 积分 2109, 距离下一级还需 891 积分
初级工程师, 积分 2109, 距离下一级还需 891 积分
长按复位按键看看,如果能复位,就是参数不合理;
如果不可以,可能就是有些地方虚焊。
北海虽赊,扶摇可接;东隅已逝,桑榆非晚。
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
NE5532 发表于
我的意思是你这种现象我见得多了,不仅是复位可能有问题,还可能其他地方有问题。单一个按键,你焊得再烂 ...
谢谢!我照你的办法再测一遍!
主题帖子积分
主题帖子积分
专家等级:结帖率:96%打赏:500.91受赏:1151.53
主题帖子积分
你看电源的纹波,选择好点的电源,滤波要做好,还有,你的VCC是否是稳定的5V,4.7.8V的话也会出现这种情况
qq群: 嵌入式系统arm初学者 ←← +→→←←→→←←
主题帖子积分
高级工程师, 积分 7954, 距离下一级还需 46 积分
高级工程师, 积分 7954, 距离下一级还需 46 积分
主题帖子积分
专家等级:结帖率:91%
主题帖子积分
高级工程师, 积分 7954, 距离下一级还需 46 积分
高级工程师, 积分 7954, 距离下一级还需 46 积分
是不是CPU对复位有额外的要求? 比如信号要快还是要慢?
I find it amusing that you didn't even consider a third reason for the problem was an error on your part.
主题帖子积分
助理工程师, 积分 1112, 距离下一级还需 888 积分
助理工程师, 积分 1112, 距离下一级还需 888 积分
主题帖子积分
专家等级:结帖率:90%打赏:0.00受赏:24.00
主题帖子积分
助理工程师, 积分 1112, 距离下一级还需 888 积分
助理工程师, 积分 1112, 距离下一级还需 888 积分
上电复位的波形是怎样的?
主题帖子积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:43.00
主题帖子积分
增大复位的电路的阻容看看;
还有用示波器看看,电源,复位,晶振的波形;
欢迎进入21IC ST、机器人等版块
电子工程师群(北京):
电子工程师群(深圳):
电子工程师群1:1897584;
物联网群:;智能机器人群:; AGV及立体仓库群:;
主题帖子积分
高级技术员, 积分 674, 距离下一级还需 326 积分
高级技术员, 积分 674, 距离下一级还需 326 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 674, 距离下一级还需 326 积分
高级技术员, 积分 674, 距离下一级还需 326 积分
用示波器查一下复位信号,是不是正常…可能是电源不稳造成了复位后状态不稳定,然后就是这个结果
主题帖子积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
主题帖子积分
专家等级:结帖率:75%
主题帖子积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
电压波动可能会出问题。但电压低出这问题的真没见到。我直接用锂电池给STC89C52供电没问题。
主题帖子积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
主题帖子积分
专家等级:结帖率:75%
主题帖子积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
自己洗板?指自己腐蚀么?那倒有可能是某些地方过腐蚀了。你按下去的时候可能让该线路导通,然后就复位正常了。如前面的前辈们所述,好好检查电路。
主题帖子积分
助理工程师, 积分 1585, 距离下一级还需 415 积分
助理工程师, 积分 1585, 距离下一级还需 415 积分
主题帖子积分
专家等级:结帖率:77%
主题帖子积分
助理工程师, 积分 1585, 距离下一级还需 415 积分
助理工程师, 积分 1585, 距离下一级还需 415 积分
努力学习就好
主题帖子积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
提示: 作者被禁止或删除 内容自动屏蔽
时间类勋章
技术新星奖章
人才类勋章
终身成就奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
湍急之河流
发帖类勋章
时间类勋章
技术高手奖章
人才类勋章
社区建设奖章
等级类勋章
核心会员奖章
等级类勋章
技术导师奖章
人才类勋章
时间类勋章
沉静之湖泊
发帖类勋章
无冕之王奖章
等级类勋章
涓涓之细流
发帖类勋章
荣誉元老奖章
等级类勋章
技术奇才奖章
人才类勋章
时间类勋章
热门推荐 /251单片机不停的自动复位,求助!!!_51单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:52,420贴子:
51单片机不停的自动复位,求助!!!收藏
51单片机不停的自动复位,求助!!!描述一下情况:程序在运行过程中,在while(1)的死循环中运行16次之后跳出,程序又重新从main()函数起始位置运行,不是完全的复位,因为如果我在while里边加一个led指示,并让其发光,当跳出循环之后,该led仍然为亮。
期间排除的可能问题有:1、单片机的原因。开始用的是一个89C52,有这个问题。换了12C5A60S之后仍然问题存在。2、里边oled程序问题。
当我单独使用oled程序的时候,问题不存在。3、看门狗问题。 我在程序中没有对看门狗做任何设置,并且当我在程序中加上 WDT_COUNT = 0x00;之后问 题仍然存在。4、板子的问题。 其它程序不存在这个现象。等级有限,上不了传的附件:我在这儿给一个链接,可以的话麻烦帮忙看下: ht谢tp://pa谢谢n.bai各位du.co大神m/s/1hsF了k0gW
单片机开发专业PCB设计,制板,贴片打样一站式服务!软硬件相结合,打造整体产品解决方案提供商.
下面是程序部分代码:依次为 main(), ms_5611.c,ms_5611.h,oled.c;oled.h.i2c.c;i2c.h//**************************************************************////定义于I2C.h中////sbit SCL = P1^0;//定义时钟位////sbit SDA = P1^1;//定义数据位////ms5611CSB接GNDPS引脚选择通讯方式,本程序为I2C////定义于MS5611.h中////sbit MS_PS = P1^3;////////**************************************************************//#include &STC12C5A60S2.h&#include &I2C.h&#include &ms5611.h&//#include &def.h&#include &oled.h&sbit led1 = P1^6;sbit led2 = P1^7;float dt,TEMP,h,Pfloat PRES[5];//存放5次所得的压力值;unsigned char times_flag=0;//存放测试次数void Exchange_Number(long ex_Pressure, unsigned char x, unsigned char y ,bit mode) //将数据转为字符串显示;数字,x坐标,y坐标{unsigned char exchange_num[10],i,j;if(ex_Pressure&0){ex_Pressure=-ex_Pexchange_num[0]='-';}else exchange_num[0]=' ';exchange_num[1]=ex_Pressure/x30;ex_Pressure=ex_Pressure%100000;exchange_num[2]=ex_Pressure/;ex_Pressure=ex_Pressure%10000;exchange_num[3]=ex_Pressure/;ex_Pressure=ex_Pressure%1000;exchange_num[4]=ex_Pressure/100+0x30;ex_Pressure=ex_Pressure%100;exchange_num[5]='.';exchange_num[6]=ex_Pressure/10+0x30;ex_Pressure=ex_Pressure%10;exchange_num[7]=ex_Pressure+0x30;i=1;while(exchange_num[i++] == '0' && i&=7);i--;for(j=1;j&=7,i&=7;j++,i++){exchange_num[j]= exchange_num[i];}if(mode){exchange_num[j++] = 'm';exchange_num[j] = '\0';}elseexchange_num[j] = '\0'; OLED_ShowString(x,y,exchange_num,16);}void main(){WDT_CONTR = 0x00;led1 = 0;//led2=1;MS_PS =1;delayms(10);OLED_Init();//初始化OLED
MS_INIT();OLED_Clear();OLED_ShowCHinese(32,0,0);//高OLED_ShowCHinese(56,0,1);//度OLED_ShowCHinese(80,0,2);//计OLED_ShowCHinese(0,2,7);//温OLED_ShowCHinese(16,2,1);//度OLED_ShowString(30,0,&:&,16);//:OLED_ShowString(40,0,&20.51&,16);//温度值OLED_ShowCHinese(86,2,8);//℃OLED_ShowCHinese(0,4,5);//气OLED_ShowCHinese(16,4,6);//压OLED_ShowString(30,2,&:&,16);//:OLED_ShowString(40,2,&998.51 mbar&,16);//气压值OLED_ShowCHinese(0,6,3);//海OLED_ShowCHinese(16,6,4);//拔OLED_ShowString(30,4,&:&,16);//:OLED_ShowString(40,4,&45.56&,16);//气压值led1 = 1;led1 = 1;led1 = 1;led1 = 1;for(i=1;i&100;i++){while(1){led2 = 0;MS_GETTEMP(MS_D2_OSR);MS_GETPRES(MS_D1_OSR);/*if(times_flag == 5){led2 =1;CALCU_HIGH();Exchange_Number((long)TEMP,34,0,0);
//显示温度Exchange_Number((long)Pressure,34,2,0);//显示气压Exchange_Number((long)(h*100),34,4,1); //显示高度} */led2 =1;CALCU_HIGH();Exchange_Number((long)TEMP,34,0,0);
//显示温度Exchange_Number((long)Pressure,34,2,0);//显示气压Exchange_Number((long)(h*100),34,4,1); //显示高度}}}#include &I2C.h&#include &ms5611.h&#include &PROM_VAL.h&#include &math.h&void MS_RESET(){I2C_Start();I2C_SendByte(MS_ADD);I2C_SendByte(MS_RST);I2C_Stop();}/*void MS_PROM_READ(){unsigned char d1,d2,i;for(i=0;i&8;i++){I2C_Start();I2C_SendByte(MS_ADD);I2C_SendByte(MS_PROM_RD + 2*i);I2C_Stop();I2C_Start();I2C_SendByte(MS_ADD + 0x01);d1 = I2C_RecvByte();I2C_SendACK(0);d2 = I2C_RecvByte();I2C_SendACK(1);
//此处不一样I2C_Stop();delayms(5);Cal_C[i] = ((unsigned int)d1&&8) | d2;}}*/unsigned long MS_DO_CONVER(unsigned char command){unsigned char conv1,conv2,conv3;unsigned long conversion = 0;I2C_Start();// I 2 C Command to initiate a pressure conversionI2C_SendByte(MS_ADD);I2C_SendByte(command);I2C_Stop();delayms(10);I2C_Start();//
I 2 C ADC read sequenceI2C_SendByte(MS_ADD);I2C_SendByte(MS_ADC);I2C_Stop();delayms(10);I2C_Start();// I 2 C answer from MS5611-01BAI2C_SendByte(MS_ADD + 1);conv1 = I2C_RecvByte();I2C_SendACK(0);conv2 = I2C_RecvByte();I2C_SendACK(0);conv3 = I2C_RecvByte();I2C_SendACK(1);I2C_Stop();conversion = conv1*65535 + conv2*256 + conv3; //合成数据}void MS_GETTEMP(unsigned char OSR_Temp){unsigned long int D2_T//存放温度读取值D2_Temp = MS_DO_CONVER(OSR_Temp);delayms(10);dt = D2_Temp - (((unsigned long)Cal_C[5])&&8);TEMP = 2000 + dt*((unsigned long)Cal_C[6])/8388608;}void MS_GETPRES(unsigned char OSR_Pres){unsigned long int D1_P//存放压力读取值float TEMP2,Aux,OFF2,SENS2;//温度校验值double OFF,SENS;D1_Pres = MS_DO_CONVER(OSR_Pres);delayms(10);OFF
= (unsigned long)Cal_C[2]*65535 + ((unsigned long)Cal_C[4]*dt)/128;SENS = (unsigned long)Cal_C[2]*32768 + ((unsigned long)Cal_C[3]*dt)/256;if(TEMP&2000){TEMP2
= (dt*dt)/0x;//Aux
= TEMP*TEMP;Aux
= TEMP - 2000;Aux *= AOFF2
= 2.5*ASENS2 = 1.25*A}else{TEMP2 = 0;OFF2 = 0;SENS2 = 0;}TEMP
-= TEMP2;OFF = OFF - OFF2;SENS
= SENS - SENS2;Pressure = (D1_Pres * SENS/2097152 - OFF)/32768;PRES[times_flag++] = P}void MS_INIT(){MS_RESET();//delayms(10);//MS_PROM_READ();delayms(10);}void CALCU_HIGH(){ ////unsigned char i,j;////
for (i = 0; i & 5; i++)//
for (j = j & 5; j++)//
if (PRES[i] & PRES[j])//
a = PRES[i];//
PRES[i] = PRES[j];//
PRES[j] =//
}//a=0;//for(i=1; i&4; i++)//a += PRES[i];//Pressure = a/3; h = (log(Pressure/133.28) - log(760))*(0-7924);}#ifndef __ms5611_H_#define __ms5611_H_sbit MS_PS = P0^5;#define MS_ADD 0xEE//定义气压传感器在I2C总线中的地址#define MS_D1
0x40//温度转换命令#define MS_D2
0x50//气压值转换命令#define MS_RST 0x1E//气压传感器重置命令#define MS_ADC 0x00//ADC读取命令#define MS_PROM_RD 0xA0//PROM读取#define MS_PROM_CRC 0xAE#define MS_D1_OSR0x48 //#define MS_D2_OSR0x58extern float
dt,TEMP,h,Pextern float PRES[5];extern unsigned char times_void MS_RESET();void MS_RESET();//void MS_PROM_READ();unsigned long MS_DO_CONVER(unsigned char command);void MS_GETTEMP(unsigned char OSR_Temp);void MS_GETPRES(unsigned char OSR_Pres);void MS_INIT();void SeriPushSend(unsigned char send_data);void CALCU_HIGH();#endif
////////////////////////////////////////////////////////////////////////////////// //
接5V或3.3v电源//
P1^0(SCL)//
P1^1(SDA)//
----------------------------------------------------------------//******************************************************************************/。#include &oled.h&#include &oledfont.h&#include &i2c.h&
//OLED的显存//存放格式如下.//[0]0 1 2 3 ... 127//[1]0 1 2 3 ... 127//[2]0 1 2 3 ... 127//[3]0 1 2 3 ... 127//[4]0 1 2 3 ... 127//[5]0 1 2 3 ... 127//[6]0 1 2 3 ... 127//[7]0 1 2 3 ... 127
/**********************************************// IIC Write Command**********************************************/void Write_IIC_Command(unsigned char IIC_Command){
I2C_Start();
I2C_SendByte(0x78);
//Slave address,SA0=0
I2C_SendByte(0x00);//write command
I2C_SendByte(IIC_Command);
I2C_Stop();}/**********************************************// IIC Write Data**********************************************/void Write_IIC_Data(unsigned char IIC_Data){
I2C_Start();
I2C_SendByte(0x78);//D/C#=0; R/W#=0
I2C_SendByte(0x40);//write data
I2C_SendByte(IIC_Data);
I2C_Stop();}void OLED_WR_Byte(unsigned dat,unsigned cmd){if(cmd)Write_IIC_Data(dat);else
Write_IIC_Command(dat);}//坐标设置void OLED_Set_Pos(unsigned char x, unsigned char y) {OLED_WR_Byte(0xb0+y,OLED_CMD);OLED_WR_Byte(((x&0xf0)&&4)|0x10,OLED_CMD);OLED_WR_Byte((x&0x0f),OLED_CMD); }
//开启OLED显示
void OLED_Display_On(void){OLED_WR_Byte(0X8D,OLED_CMD);
//SET DCDC命令OLED_WR_Byte(0X14,OLED_CMD);
//DCDC ONOLED_WR_Byte(0XAF,OLED_CMD);
//DISPLAY ON}//关闭OLED显示
void OLED_Display_Off(void){OLED_WR_Byte(0X8D,OLED_CMD);
//SET DCDC命令OLED_WR_Byte(0X10,OLED_CMD);
//DCDC OFFOLED_WR_Byte(0XAE,OLED_CMD);
//DISPLAY OFF}
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void OLED_Clear(void)
for(i=0;i&8;i++)
OLED_WR_Byte (0xb0+i,OLED_CMD);
//设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD);
//设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);
//设置显示位置—列高地址
for(n=0;n&128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示}void OLED_On(void)
for(i=0;i&8;i++)
OLED_WR_Byte (0xb0+i,OLED_CMD);
//设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD);
//设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);
//设置显示位置—列高地址
for(n=0;n&128;n++)OLED_WR_Byte(1,OLED_DATA); } //更新显示}//在指定位置显示一个字符,包括部分字符//x:0~127//y:0~63//mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size){
unsigned char c=0,i=0;c=chr-' ';//得到偏移后的值if(x&Max_Column-1)x=0;y=y+2;if(Char_Size ==16){OLED_Set_Pos(x,y);for(i=0;i&8;i++)OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);OLED_Set_Pos(x,y+1);for(i=0;i&8;i++)OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);}}//m^n函数u32 oled_pow(u8 m,u8 n){u32 result=1; while(n--)result*=m;
} //显示2个数字//x,y :起点坐标 //len :数字的位数//size:字体大小//mode:模式0,填充模式;1,叠加模式//num:数值(0~); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2){
u8 t,u8 enshow=0;
for(t=0;t&t++){temp=(num/oled_pow(10,len-t-1))%10;if(enshow==0&&t&(len-1)){if(temp==0){OLED_ShowChar(x+(size2/2)*t,y,' ',size2);}else enshow=1;
}OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); }} //显示一个字符号串void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size){unsigned char j=0;while (chr[j]!='\0'){OLED_ShowChar(x,y,chr[j],Char_Size);x+=8;if(x&120){x=0;y+=2;}j++;}}//显示汉字void OLED_ShowCHinese(u8 x,u8 y,u8 no){
u8 t,adder=0;OLED_Set_Pos(x,y);
for(t=0;t&16;t++){OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);adder+=1;
}OLED_Set_Pos(x,y+1);
for(t=0;t&16;t++){OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);adder+=1;
}}//初始化SSD1306
void OLED_Init(void){OLED_RST_Set();OLED_RST_Clr();delayms(100);OLED_RST_Set();OLED_DC_Clr();OLED_CS_Clr(); /*OLED_WR_Byte(0xAE,OLED_CMD);//关闭显示OLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//没有---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//设置显示开始行 [5:0],行数. --set start line address
OLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // 对比度设置contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128
OLED_WR_Byte(0xA1,OLED_CMD);//段重定义设置,bit0:0,0-&0;1,0-&127;set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//设置显示方式;bit0:1,反相显示;0,正常显示--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//设置驱动路数--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//默认0X3F(1/64)--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
没有 OLED_WR_Byte(0xC0,OLED_CMD);OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset 设置显示偏移OLED_WR_Byte(0x00,OLED_CMD);//默认为0OLED_WR_Byte(0xD5,OLED_CMD);//设置时钟分频因子,震荡频率OLED_WR_Byte(0x80,OLED_CMD);//[3:0],分频因子;[7:4],震荡频率OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//设置预充电周期Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//[3:0],PHASE 1;[7:4],PHASE 2OLED_WR_Byte(0xDA,OLED_CMD);//设置COM硬件引脚配置set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//[5:4]配置OLED_WR_Byte(0xDB,OLED_CMD);//设置VCOMH set VcomhOLED_WR_Byte(0x30,OLED_CMD);//[6:4] 000,0.65*001,0.77*011,0.83*OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵设置 set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//bit2,开启/关闭OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panelAEh, X[0]=0b:Display OFF (sleep mode)(RESET)*/OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panelOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address
Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control registerOLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current BrightnessOLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping
0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction
0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6,OLED_CMD);//--set normal displayOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 dutyOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetShift Mapping RAM Counter (0x00~0x3F)OLED_WR_Byte(0x00,OLED_CMD);//-not offsetOLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequencyOLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge periodOLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configurationOLED_WR_Byte(0x12,OLED_CMD);OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomhOLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect LevelOLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WR_Byte(0x02,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disableOLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disableOLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panelOLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear();OLED_Set_Pos(0,0);//AFh X[0]=1b:Display ON in normal mode}
#include &I2C.h&#include &intrins.h&void delayms(unsigned int m) {while(m--){delay1ms();}}void delay1ms(void)
//误差 -0.us{
unsigned char a,b,c;
for(c=8;c&0;c--)
for(b=188;b&0;b--)
for(a=2;a&0;a--);}void delay5us(void) //5us{
for(a=26;a&0;a--);}void I2C_Start()//I2C起始信号
正常{SDA = 1;SCL = 1;delay5us();SDA = 0;delay5us();SCL = 0;_nop_();_nop_();}void I2C_Stop()//I2C停止信号
修改scl=0为1{SDA = 0;SCL = 1;delay5us();SDA = 1;delay5us();}void I2C_SendACK(bit ack)//IIC主机发送应答{if(ack == 1)SDA = 1;elseSDA = 0;SCL = 1;delay5us();SCL = 0;delay5us();}void I2C_RecvACK()//此处大修改//I2C收到数据后应答{SDA = 1;SCL = 1;//while((bit)SDA);delay5us();SCL= 0;delay5us();}void I2C_SendByte(unsigned char dat)//通过IIC发送一个字节数据{ unsigned char BitC for(BitCnt=0;BitCnt&8;BitCnt++)
//要传送的数据长度为8位
if((dat&&BitCnt)&0x80)SDA=1;
//判断发送位
//置时钟线为高,通知被控器开始接收数据位delay5us();
}I2C_RecvACK();}unsigned char I2C_RecvByte()//修改{////
unsigned char BitC//
retc=0; //
//置数据线为输入方式//
for(BitCnt=0;BitCnt&8;BitCnt++)//
//置时钟线为低,准备接收数据位//
delay5us();//
//置时钟线为高使数据线上数据有效//
_nop_();//
_nop_();//
retc=retc&&1;//
if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中//
_nop_();//
_nop_();//
_nop_();//
_nop_();//
return(retc);unsigned char i,dat=0;SDA = 1;for(i=0; i&8; i++){dat &&= 1;SCL = 1;delay5us();dat |= SDA;SCL = 0;delay5us();}SCL = 0;}//******************************************************************************/#ifndef __OLED_H#define __OLED_H#include &STC12C5A60S2.h& //#include &sys.h&//#include &stdlib.h& #define
u8 unsigned char #define
u32 unsigned int #define OLED_CMD
0//写命令#define OLED_DATA 1//写数据#define OLED_MODE 0sbit OLED_SCL = P0^0;//时钟 D0(SCLK?sbit OLED_SDIN = P0^1;//D1(MOSI) 数据sbit OLED_RST = P0^2;sbit OLED_DC = P0^3;sbit OLED_CS = P0^4;#define OLED_CS_Clr()
OLED_CS=0#define OLED_CS_Set()
OLED_CS=1#define OLED_RST_Clr() OLED_RST=0#define OLED_RST_Set() OLED_RST=1#define OLED_DC_Clr() OLED_DC=0#define OLED_DC_Set() OLED_DC=1#define OLED_SCLK_Clr() OLED_SCL=0#define OLED_SCLK_Set() OLED_SCL=1#define OLED_SDIN_Clr() OLED_SDIN=0#define OLED_SDIN_Set() OLED_SDIN=1//OLED模式设置//0:4线串行模式//1:并行8080模式#define SIZE 16#define XLevelL0x02#define XLevelH0x10#define Max_Column128#define Max_Row64#defineBrightness0xFF #define X_WIDTH 128#define Y_WIDTH 64
//-----------------OLED端口定义----------------
//void delay_ms(unsigned int ms);//OLED控制用函数void OLED_WR_Byte(unsigned dat,unsigned cmd);
void OLED_Display_On(void);void OLED_Display_Off(void);
void OLED_Init(void);void OLED_Clear(void);void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size); void OLED_Set_Pos(unsigned char x, unsigned char y);void OLED_ShowCHinese(u8 x,u8 y,u8 no);void Delay_50ms(unsigned int Del_50ms);void Delay_1ms(unsigned int Del_1ms);void Write_IIC_Data(unsigned char IIC_Data);void Write_IIC_Byte(unsigned char IIC_Byte);#endif
#ifndef __I2C_H_#define __I2C_H_#include &STC12C5A60S2.h&sbit SCL = P0^0;//定义时钟位sbit SDA = P0^1;//定义数据位//sbit led = P1^6;void delay5us(void);void delay1ms(void);void delayms(unsigned int m);void I2C_Start();void I2C_Stop();void I2C_SendACK(bit ack);void I2C_RecvACK();void I2C_SendByte(unsigned char dat);unsigned char I2C_RecvByte();#endif
太长了,难得看~
登录百度帐号推荐应用

我要回帖

更多关于 vs main函数如何执行 的文章

 

随机推荐