奇怪的问题,0x8b450883取char为0xcc,取int为0x830845cc

BeanJoy 2013-01-20 04:21:33

上图,注意看570-576行,代码如下:

DWORD dwProtect = 0;
VirtualProtect(GetRoutineAddress(ReThread), 32, PAGE_EXECUTE_READ | PAGE_NOCACHE, &dwProtect);
memcpy(szOpCodes+30, (LPBYTE)GetRoutineAddress(ReThread)+30, 1);
szOpCodes[1] = *((LPBYTE)GetRoutineAddress(ReThread)+30);
LPBYTE ppp = (LPBYTE)GetRoutineAddress(ReThread);
ppp = ppp + 30;
szOpCodes[2] = *ppp;
char c = (char)*ppp;
BYTE byte = (BYTE)*ppp;
BYTE byte1 = 0x8b450883;
int nnn = *ppp;
int *pp = (int*)ppp;
int nn = *pp;
VirtualProtect(GetRoutineAddress(ReThread), 32, dwProtect, &dwProtect);

自动把8b改成了cc,很奇怪,理解不了。用NtWriteVirtualMemory写时,写错了8b,注入后直接飞掉,我以为这个方法不行。后来发现是这么个问题,会自动把8b改成cc。直接使用memcpy也不行,就这个8b错误,其他都正确。右上角汇编窗口红框处是开始出现问题的地方。谁能来解释一下哪里的问题?
操作系统:XP SP3
编译器:VS2008
...全文
395 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyuyanxinshou 2013-06-13
  • 打赏
  • 举报
回复
大小端格式啊,大小端
jimette 2013-01-21
  • 打赏
  • 举报
回复
只是调用ShowWindows(NULL,SW_SHOW)系统返回“err,hr”错误,
BeanJoy 2013-01-21
  • 打赏
  • 举报
回复
引用 6 楼 sha_jinhao 的回复:
,那“err,hr”是上次调用API的结果 你上个传参都是错误的 怎么就能保证以后是对的 前面错误 后面可以正确?
只要我不调用Windows api,“err,hr”可以一直保持,甚至到程序结束。 如果我只是调用ShowWindows(NULL,SW_SHOW)系统返回“err,hr”错误,这如何影响我用int nn = *pp;的结果? 我关注的是一个汇编指令mov cl,byte ptr [eax]结果为什么不正确,而不是一个函数! 难道我调试时Windows还会把这个mov指令给裁成几个指令,这几个指令的执行还受LastError的影响,而只给我们显示一个mov,而且也是一步执行?
jimette 2013-01-21
  • 打赏
  • 举报
回复
,那“err,hr”是上次调用API的结果 你上个传参都是错误的 怎么就能保证以后是对的 前面错误 后面可以正确?
BeanJoy 2013-01-21
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
“执行mov cl,byte ptr [eax]后,cl为0xcc,” 【eax】中 eax 像是 没初始化 的 指针 (0xCCCC)
看我10楼分析,没初始始化是值是0xcc,应该就是为了引起中断,由此判断访问是否合法。
引用 11 楼 lostying 的回复:
你是否正好在ReThread+30这个地方设了一个断点,调试器运行时改成了0xcc,断时又恢复成正常数值,你赋值时正好是0xcc.
10楼忘了把你引上,这儿重新引一下。
BeanJoy 2013-01-21
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
“执行mov cl,byte ptr [eax]后,cl为0xcc,” 【eax】中 eax 像是 没初始化 的 指针 (0xCCCC)
0xcc倒是像没初始化的指针,但看我5楼回复,在调用这个指令前,我能保证eax指向的内容是正确的。 结帖,问题也不用验证了!中断汇编码int 3,opcode正好为0xcc。虽然这个函数在运行的这个进程内不用执行,但我可能还是加了断点。 看来这个地址的值确实被改成了0xcc,但VS调试显示时还是按原来的显示,所以按地址取值时,取出来的是0xcc,出不是原来的值。
无言猪 2013-01-21
  • 打赏
  • 举报
回复
你是否正好在ReThread+30这个地方设了一个断点,调试器运行时改成了0xcc,断时又恢复成正常数值,你赋值时正好是0xcc.
schlafenhamster 2013-01-21
  • 打赏
  • 举报
回复
“执行mov cl,byte ptr [eax]后,cl为0xcc,” 【eax】中 eax 像是 没初始化 的 指针 (0xCCCC)
BeanJoy 2013-01-21
  • 打赏
  • 举报
回复
引用 8 楼 sha_jinhao 的回复:
只是调用ShowWindows(NULL,SW_SHOW)系统返回“err,hr”错误,
我举例说明并不是LastError随时都有用。
BeanJoy 2013-01-20
  • 打赏
  • 举报
回复
引用 2 楼 sha_jinhao 的回复:
lz 提示参数不正确 问题都没解决!
哥哥,那“err,hr”是上次调用API的结果,并不是后面赋值操作的结果。 我不会患这么低级的错误,而且LastError大多数只在调用Windows API失败的情况下才有用,极少情况下调用成功也需查询LastError。
jimette 2013-01-20
  • 打赏
  • 举报
回复
lz 提示参数不正确 问题都没解决!
BeanJoy 2013-01-20
  • 打赏
  • 举报
回复
还忘了说,ppp指向的地方是代码区域,我以为可能和此区域的属性有关,就用VirtualProtect更改了属性,结果还是一样,8b还是成了cc。
BeanJoy 2013-01-20
  • 打赏
  • 举报
回复
引用 4 楼 stjay 的回复:
可能是调试器改的,是不是在函数ReThread里下了断点?
没有,原程序中ReThread并不运行,只是编译,然后会被拷贝到另一进程的地址空间中,拷贝过程中出现问题。 调试器改这个也没意义啊,ReThread处的0x8b正常,我是将0x8b处的值赋给另一个其他变量时,其他变量变成了0xcc。 单步运行汇编,eax指向8b 45 08 83,执行mov cl,byte ptr [eax]后,cl为0xcc,我就想不通,这么个mov指令到底如何执行的,能将8b改成cc?
stjay 2013-01-20
  • 打赏
  • 举报
回复
可能是调试器改的,是不是在函数ReThread里下了断点?
USB摄像头的1080p的JPEG格式的图片20180608_1806.7z 电脑上的系统:ubuntu14.04 // http://www.linuxidc.com/Linux/2011-03/33020.htm // V4L2摄像头获单幅图片测试程序(MMAP模式) // [日期:2011-03-06] 来源:Linux社区 作者:aokikyon [字体:大 中 小] // // #加了点注释 // // #Rockie Cheng // printf #include #include // memset #include #include #include #include // close write usleep read #include #include #include #include #include #include // mmap #include #include #include #include // pthread_create pthread_join #include #define CLEAR(x) memset (&(x), 0, sizeof (x)) #define REQ_COUNT 6 #define uchar unsigned char struct buffer { void * start; size_t length; }; static char * dev_name = "/dev/video0";//摄像头设备名 static int fd = -1; struct buffer * buffers = NULL; // static unsigned int n_buffers = 0; // 2012-7-13 11:33 camera flag // static int iFlagCamera = 0; volatile int iFlagCamera = 0; // 函数名称:thread1 // 函数功能:用于接受键盘的输入,之后通知thread2抓图 // 参数列表: // 返回值 : void thread1(void) { char ch; printf("\n !!!!Warning!!!!\n Max 1000 color bmp\n Input the char: \n"); printf("\n !!!!press o an capture 1 frame picture! \n"); printf("\n !!!!press t an capture 10 frame picture! \n"); printf("\n !!!!press h an capture 100 frame picture! \n"); while(1) { while((ch=getchar()) != '\n') { printf("%c\n", ch); if('o'==ch) { iFlagCamera = 1; printf("thread1=%d\n", iFlagCamera); } else if('t'==ch) { iFlagCamera = 10; printf("thread1=%d\n", iFlagCamera); } else if('h'==ch) { iFlagCamera = 101; printf("thread1=%d\n", iFlagCamera); } else if('q'==ch) { iFlagCamera = 10001; printf("thread1=%d\n", iFlagCamera
#include //引用头文件 #define uchar unsigned char #define uint unsigned int #define p1 P1 sbit E=P3^2; //定义读写使能信号,高电平有效 sbit RW=P3^1; //定义读写选择信号,1为读选通,0为写选通 sbit RS=P3^0; //数据指令选择信号,1为数据操作,0为写指令或读状态 unsigned char addr[32]= //定义地址 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f}; unsigned char mx[32][2]= //定义汉字字符的去码数组 {0x20,0x20, 0x20,0x20, 0xb9,0xe3,//广 0xd6,0xdd,//州 0xb4,0xf3,//大 0xd1,0xa7,//学 0x20,0x20, 0x20,0x20, 0x20,0x20, 0x20,0x20, 0xbf,0xce,//课 0xb3,0xcc,//程 0xc9,0xe8,//设 0xbc,0xc6,//计 0x20,0x20, 0x20,0x20, 0x20,0x20, 0xd7,0xf7,//作 0xd5,0xdf,//者 0xa1,0xc3,//: 0xce,0xe2,//吴 0xd4,0xbd,//越 0xbb,0xd4,//辉 0x20,0x20, 0x20,0x20, 0xa3,0xb0,//0 0xa3,0xb9,//9 0xb5,0xe7,//电 0xc6,0xf8,//气 0xd7,0xd4,//自 0xb6,0xaf,//动 0xbb,0xaf//化 }; void delay (int n) //延时子程序 { int j; while(n--) { for(j=0;j<123;j++); } } void zhiling(unsigned char d) //写指令 { delay(2); RW=0; //写选通 RS=0; //写指令 p1=d; //将要写的数据送给P1口 E=1; //使能有效 E=0; //关闭使能信号 delay(10); } void shuju(unsigned char d) //写数据 { delay(2); RS=1; //数据操作 RW=0; //写选通 p1=d; //将要写的数据送给P1口 E=1; //使能有效 E=0; //关闭使能信号 delay(10); } void qingping() //清屏 { zhiling(0x01); //清除显示 } void init() //初始化子函数 { E=0; //关闭使能信号 zhiling(0x38); //功能设定 zhiling(0x08); //关显示指令 zhiling(0x06); //游标右移 zhiling(0x0c); //开显示指令 qingping(); //清屏 } void hanzi (unsigned char w, unsigned char wb1,unsigned char wb2 ) { zhiling(w);//指令 //设置起始地址 shuju(wb1);//数据 //数据送液晶显示 shuju(wb2);//数据 } void main() { int i; init(); //调用初始化函数进行初始化操作 while(1) { for(i=0;i<32;i++) { hanzi(addr[i],mx[i][0],mx[i][1] ); //调用汉字显示,向液晶送数据显示 } while(1); } }
微型计算机技术及应用实验指导书#include #include<intrins.h> #define uchar unsigned char #define somenop {_nop_();_nop_();_nop_();} uchar code overtemperature[]={"OVERTEMPERATURE!"}; uchar code digit[]={"0123456789"}; uchar mode,TH,TL,TN,TD,tempswitch; uchar Maxtemp=29,amode,alarmmode,minutes,hours,weeks,minutea,seconds,houra=12,days,months,years; sbit SCLK=P1^7; //DS1302时钟输入 sbit DATE=P2^3; //DS1302数据输入 sbit REST=P1^3; //DS1302复位端口 sbit SET=P3^0; //DS1302设置模式选择位 sbit RS=P2^0; sbit RW=P2^1; sbit E=P1^2; sbit BF=P0^7; sbit beep=P0^6; sbit ADD=P3^1; //增加 sbit RED=P3^2; //减小 sbit CANL=P3^3; sbit DQ=P1^4; bit IntDS18B20(void); uchar ReadDS18B20(void); void WriteDS18B20(unsigned char date); void ReadyreadDS18B20(void); void Display_Integer(unsigned char x); void Display_Decimal(unsigned char x); void displayovert(void); void Temperature(void); void delay1ms(int i) { int j,k; while(i--); for(j=76;j>1;j--); for(k=29;k>1;k--); } void delaynus(unsigned char n) { uchar i; for(i=0;ichar i; for(i=250;i>0;i--) { _nop_(); } } void baojing(uchar n) { uchar x,i; while(n--) { beep=0; P2|=0xa0; P2&=0x00; for(i=0;i<5;i++) { for(x=0;x<200;x++) { beep=~beep; P2|=0xa0; P2&=0x00; dely500(); } } for(i=0;i<3;i++) { for(x=0;x<200;x++) { beep=~beep; P2|=0xa0; P2&=0x00; dely500(); dely500(); } } } } /*******DS1302模块*************/ void Write1302(uchar date)//向1302写数据 { uchar i; SCLK=0; delaynus(2); for(i=0;i<8;i++) { DATE=date&0x01; SCLK=1; // delaynus(2); date>>=1; SCLK=0; // delaynus(2); } } void WriteSet1302(uchar cmd,uchar date) //根据相应的命令输入相应的数据 { REST=0; SCLK=0; REST=1; Write1302(cmd); delaynus(5); Write1302(date); DATE=0; REST=0; } uchar Read1302(void) //读1302数据 { uchar i,date; SCLK=0; delaynus(2); for(i=0;i<8;i++) { date>>=1; if(DATE==1) date|=0x80; SCLK=1; // delaynus(2); SCLK=0; // delaynus(2); } return date; } uchar ReadSet1302(uchar cmd)//根据命令读1302相应的值 { uchar date; REST=0; SCLK=0; REST=1; Write1302(cmd); delaynus(2); date=Read1302(); DATE=0; REST=0; return date; } void IntDS1302(void) //DS1302初始化 { uchar flag; flag= ReadSet1302(0x81); if(flag&0x80;) //判断时钟芯片是否关闭 { WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((0/10)<<4|(0))); //根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((50/10)<<4|(9))); //根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((20/10)<<4|(3))); //根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((30/10)<<4|(1))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((0/10)<<4|(8))); //根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8a,((0/10)<<4|(7))); WriteSet1302(0x8c,((10/10)<<4|(2))); //根据写年寄存器命令字,写入年的初始值 WriteSet1302(0x90,0xa5); //打开充电功能 选择2K电阻充电方式 WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令 } } /***************液晶显示模块*****************/ /*液晶忙检测*/ bit BusyTest(void) { bit result; RS=0; RW=1; E=1; somenop; result=BF; somenop; E=0; return result; } /*写指令*/ void Write_com(uchar command) { while(BusyTest()!=0); RS=0; RW=0; E=0; somenop; P0=command; somenop; E=1; somenop; E=0; } /*写地址*/ void Write_Address(uchar address) { Write_com(address|0x80); delay1ms(5); } /*写数据*/ void Write_Date(uchar date) { RS=1; RW=0; E=0; somenop; P0=date; somenop; E=1; somenop; E=0; delay1ms(1); } /*初始化*/ void Lcd_Int(void) { Write_com(0x38); Write_com(0x01); Write_com(0x06); Write_com(0x0c); } void displaymainpart(void)//显示液晶主要部分(不变化部分) { Write_Address(0x00); delay1ms(1); Write_Date('D'); Write_Date('A'); Write_Date(':'); delay1ms(1); Write_Address(0x07); delay1ms(1); Write_Date('-'); Write_Address(0x0A); Write_Date('-'); Write_Address(0x40); Write_Date('T'); Write_Date('E'); Write_Date(':'); Write_Address(0x45); Write_Date('-'); Write_Address(0x48); Write_Date('-'); Write_Address(0x03); Write_Date('2'); Write_Date('0'); Write_Address(0x4E); Write_Date('.'); } void display_week(uchar week)//写星期函数 { Write_Address(0x0E);//星期字符的显示位置 switch(week) { case 1:Write_Date('W');//星期数为1时显示 Write_Date('1'); break; case 2:Write_Date('W');//星期数据为2时显示 Write_Date('2'); break; case 3:Write_Date('W');//星期数据为3时显示 Write_Date('3'); break; case 4:Write_Date('W');//星期数据为4是显示 Write_Date('4');break; case 5:Write_Date('W');//星期数据为5时显示 Write_Date('5');break; case 6:Write_Date('W');//星期数据为6时显示 Write_Date('6');break; case 7:Write_Date('W');//星期数据为7时显示 Write_Date('7');break; } } void display_Second(char second) //在液晶上显示秒 { uchar i,j; i=second/10; j=second; Write_Address(0x49); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Minute(char minute) //在液晶上显示分 { uchar i,j; i=minute/10; j=minute; Write_Address(0x46); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Hour(char hour) //在液晶上显示时 { uchar i,j; i=hour/10; j=hour; Write_Address(0x43); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Day(uchar day) //在液晶上显示日 { uchar i,j; i=day/10; j=day; Write_Address(0x0B); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Month(uchar month) //在液晶上显示月 { uchar i,j; i=month/10; j=month; Write_Address(0x08); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Year(uchar year) //在液晶上显示年 { uchar i,j; i=year/10; j=year; Write_Address(0x05); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_houra(unsigned char x) //闹钟小时部分显示 { unsigned char i,j; i=x/10; j=x; Write_Address(0x44); Write_Date(digit[i]); Write_Date(digit[j]); } void display_minutea(unsigned char x)//闹钟分钟部分显示 { unsigned char i,j; i=x/10; j=x; Write_Address(0x47); Write_Date(digit[i]); Write_Date(digit[j]); } void display_Time(void) //显示实时时间 { uchar value; Write_com(0x0c); value=ReadSet1302(0x81); //读数据(1302的读寄存器与写寄存器不一样) seconds=(((value&0x70;)>>4)*10+(value&0x0f;)); //BCD码转十进制,输入BCD返回十进制 display_Second(seconds); value=ReadSet1302(0x83); minutes=(((value&0x70;)>>4)*10+(value&0x0f;)); display_Minute(minutes); value=ReadSet1302(0x85); hours=(((value&0x70;)>>4)*10+(value&0x0f;)); display_Hour(hours); value=ReadSet1302(0x8b); weeks=(((value&0x70;)>>4)*10+(value&0x0f;)); display_week(weeks); value=ReadSet1302(0x87); days=(((value&0x70;)>>4)*10+(value&0x0f;)); display_Day(days); value=ReadSet1302(0x89); months=(((value&0x70;)>>4)*10+(value&0x0f;)); display_Month(months); value=ReadSet1302(0x8D); years=(((value&0x70;)>>4)*10+(value&0x0f;)); display_Year(years); Temperature(); } void gbdisplay(uchar address) //时间调整时光标闪烁 { Write_Address(address); delay1ms(5); Write_com(0x0f); delay1ms(5); } void displaymaxt(uchar x) //显示最大温度 { uchar j,k; Write_com(0x0c); delay1ms(2); Write_Address(0x44); j=x/10; k=x; Write_Date(digit[j]); Write_Date(digit[k]); } /*****************时间调整部分*********************/ void hourset(void) //调时 { char timevalue,hour; delay1ms(500); //防止多次触发 WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 timevalue=ReadSet1302(0x85); //读此时的数值 hour=(((timevalue&0x70;)>>4)*10+(timevalue&0x0f;)); //BCD码转十进制,输入BCD返回十进制 while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { hour++; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { hour--; if(hour<0) hour=23; while(RED==0); } } timevalue=(((hour)/10)<<4|(hour)); WriteSet1302(0x84,timevalue); delay1ms(1); display_Hour(hour); Write_Address(0x44); delay1ms(5); if(hour>23) hour=0; delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void minuteset(void) //调分 { char timevalue,minute; delay1ms(500); WriteSet1302(0x8e,0x00); timevalue=ReadSet1302(0x83); minute=(((timevalue&0x70;)>>4)*10+(timevalue&0x0f;)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { minute++; if(minute>=60) timevalue=0; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { minute--; if(minute<0) minute=59; while(RED==0); } } timevalue=((minute/10)<<4|(minute)); WriteSet1302(0x82,timevalue); delay1ms(1); display_Minute(minute); Write_Address(0x47); delay1ms(5); if(minute>=60) minute=0; delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void secondset(void) //秒归零 { char second; delay1ms(500); WriteSet1302(0x8e,0x00); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { second++; while(ADD==0); } } delay1ms(1); display_Second(second); Write_Address(0x4A); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void weekset(void) //调周 { unsigned char weekvalue,week; delay1ms(500); WriteSet1302(0x8e,0x00); weekvalue=ReadSet1302(0x8b); week=(((weekvalue&0x70;)>>4)*10+(weekvalue&0x0f;)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { week++; if(week>=8) week=1; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { week--; if(week==0) week=7; while(RED==0); } } weekvalue=((week/10)<<4|(week)); WriteSet1302(0x8a,weekvalue); delay1ms(1); display_week(week); Write_Address(0x0f); delay1ms(5); if(week>=8) week=1; delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void yearset(void) //调年 { unsigned char datevalue,year; delay1ms(500); WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x8d); year=(((datevalue&0x70;)>>4)*10+(datevalue&0x0f;)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { year++; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { year--; while(RED==0); } } datevalue=((year/10)<<4|(year)); WriteSet1302(0x8c,datevalue); delay1ms(5); display_Year(year); delay1ms(5); Write_Address(0x06); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void monthset(void) //调月 { unsigned char datevalue,month; delay1ms(500); WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x89); month=(((datevalue&0x70;)>>4)*10+(datevalue&0x0f;)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { month++; if(month>12) month=1; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { month--; if(month==0) month=12; while(RED==0); } } datevalue=((month/10)<<4|(month)); WriteSet1302(0x88,datevalue); delay1ms(1); display_Month(month); Write_Address(0x09); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void dayset(void) //调日 { unsigned char datevalue,day; delay1ms(500); WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x87); day=(((datevalue&0x70;)>>4)*10+(datevalue&0x0f;)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { day++; if(day>31) day=1; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { day--; if(day==0) day=31; while(RED==0); } } datevalue=((day/10)<<4|(day)); WriteSet1302(0x86,datevalue); delay1ms(1); display_Day(day); Write_Address(0x0c); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void alarmhourset(void) //闹钟小时调整 { unsigned char value; value=houra; while(1) { if(ADD==0) { delay1ms(20); if(ADD==0) { Write_com(0x0c); delay1ms(5); value++; if(value>23) value=0; while(ADD==0); } } if(RED==0) { delay1ms(20); if(RED==0) { value--; if(value==0) value=23; while(RED==0); } } houra=value; display_houra(houra); gbdisplay(0x45); if(CANL==0) { delay1ms(500); break; } } } void alarmminuteset(void) //闹钟分钟调整 { while(1) { if(ADD==0) { delay1ms(20); if(ADD==0) { minutea++; if(minutea>59) minutea=0; while(ADD==0) ; } } if(RED==0) { delay1ms(20); if(RED==0) { minutea--; if(minutea==0) minutea=59; while(RED==0) ; } } display_minutea(minutea); gbdisplay(0x48); if(CANL==0) { delay1ms(500); break; } } } void TimeSet(void) //时间调整函数 { display_Time(); if(SET==0) { delay1ms(10); if(SET==0) { while(!SET); mode++; delay1ms(20); switch(mode) { case(1):{gbdisplay(0x44);hourset(); delay1ms(500);} break; case(2):{gbdisplay(0x47);minuteset();delay1ms(500);} break; case(3):{gbdisplay(0x49);secondset();delay1ms(500);} break; case(4):{gbdisplay(0x0f);weekset();delay1ms(500);} break; case(5):{gbdisplay(0x06);yearset();delay1ms(500);} break; case(6):{gbdisplay(0x09);monthset();delay1ms(500);} break; case(7):{gbdisplay(0x0c);dayset();delay1ms(500);} break; } if(mode==8) mode=0; } } } /***************显示温度模块********************/ uchar flag; uchar time; /**********************DS18B20初始化****************************/ bit IntDS18B20(void) { bit temp; DQ=1; for(time=0;time<2;time++); DQ=0; for(time=0;time<200;time++); DQ=1; for(time=0;time<10;time++); temp=DQ; for(time=0;time<200;time++); return temp; } /**************************读DS18B20**********************/ uchar ReadDS18B20(void) { uchar i; uchar dat; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; _nop_(); DQ=1; for(time=0;time<2;time++); dat>>=1; if(DQ==1) dat=dat|0x80; else dat=dat|0x00; for(time=0;time<10;time++); } return dat; } /*********************向DS18B20写数据**************************/ void WriteDS18B20(uchar date) { unsigned char i; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; DQ=date&0x01; for(time=0;time<10;time++); DQ=1; for(time=0;time<1;time++); date>>=1; } for(time=0;time<4;time++); } /*******************为读温度做好准备************************/ void ReadyreadDS18B20(void) { IntDS18B20(); WriteDS18B20(0XCC); //跳过ROM WriteDS18B20(0X44);//启动温度转换 delay1ms(200); IntDS18B20(); WriteDS18B20(0XCC); WriteDS18B20(0XBE); //读暂存器的内容,从0字节开始 } /*********************显示温度整数部分*************************/ void Display_Integer(uchar x) { unsigned char j,k; j=x/10; k=x; Write_Address(0x4C); if(flag==1) Write_Date('-'); Write_Date(digit[j]); Write_Date(digit[k]); } /************显示温度小数部分*********************/ void Display_Decimal(uchar x) { Write_Address(0x4F); Write_Date(digit[x]); } void displayovert(void) { unsigned char i; Write_com(0x01); delay1ms(10); Write_Address(0x03); delay1ms(10); Write_Date('W'); Write_Date('A'); Write_Date('R'); Write_Date('N'); Write_Date('I'); Write_Date('N'); Write_Date('G'); Write_Date('!'); Write_Address(0x40); while(overtemperature[i]!='\0') { Write_Date(overtemperature[i]); i++; } } /*******************温度主函数********************/ void Temperature(void) { unsigned char i; if(IntDS18B20()==0) { delay1ms(1); for(i=0;i<1;i++) { flag=0; ReadyreadDS18B20(); TL=ReadDS18B20(); TH=ReadDS18B20(); if((TH&0XF8;)!=0X00) { flag=1; TL=~TL; TH=~TH; TL+=1; if(TL>255) TH+=1; TN=TH*16+TL/16; TD=(TL)*10/16; } TN=TH*16+TL/16; TD=(TL)*10/16; Display_Integer(TN); //温度整数 Display_Decimal(TD); //小数 } if(tempswitch==1) { if(TN>=Maxtemp) { Write_Address(0x03); displayovert(); while(1) { baojing(1); if(CANL==0) { Write_com(0x01); break; } } } } } } void tempset(void) { if(ADD==0) { delay1ms(10); if(ADD==0) { Maxtemp++; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { Maxtemp--; while(RED==0); } } } void Maxtempset(void) //高温报警设置 { Write_com(0x01); delay1ms(10); Write_Address(0x03); delay1ms(10); Write_Date('T'); Write_Date('E'); Write_Date('M'); Write_Date('P'); Write_Address(0x09); Write_Date('S'); Write_Date('E'); Write_Date('T'); Write_Address(0x40); Write_Date('M'); Write_Date('A'); Write_Date('X'); Write_Date(':'); while(1) { if(SET==0) { delay1ms(20); if(SET==0) { Write_Address(0x4e); Write_com(0x0f); while(1) { if(ADD==0) { delay1ms(20); if(ADD==0) { Write_Address(0x4b); delay1ms(5); Write_Date('O'); Write_Date('N'); Write_Date(' '); tempswitch=1; } } if(RED==0) { delay1ms(20); if(RED==0) { Write_Address(0x4b); Write_Date('O'); Write_Date('F'); Write_Date('F'); tempswitch=0; } } if(CANL==0) { delay1ms(500); break; } } } } if(tempswitch==1) { Write_Address(0x4b); Write_Date('O'); Write_Date('N'); Write_Date(' '); tempset(); displaymaxt(Maxtemp); if(CANL==0) { Write_com(0x01); displaymainpart(); break; } } if(tempswitch==0) { Write_com(0x0c); Write_Address(0x4b); Write_Date('O'); Write_Date('F'); Write_Date('F'); } if(CANL==0) { Write_com(0x01); displaymainpart(); break; } } } void alarmswitchset(void) { while(1) { if(ADD==0) { delay1ms(100); if(ADD==0) { alarmmode=1; Write_Address(0x4c); Write_Date('O'); Write_Date('N'); Write_Date(' '); } } if(RED==0) { alarmmode=0; Write_Address(0x4c); Write_Date('O'); Write_Date('F'); Write_Date('F'); } if(CANL==0) { delay1ms(500); break; } } } /**************** 设置模块 ******************/ void Set(void) { // ENK = 0; if(SET==0) { delay1ms(10); if(SET==0) { Write_com(0x0f); delay1ms(1000); Write_com(0x0c); while(1) { TimeSet(); if(ADD==0) { delay1ms(20); if(ADD==0) { Write_com(0x01); Write_Address(0x00); delay1ms(5); Write_Date('S'); delay1ms(10); Maxtempset(); } } if(RED==0) { delay1ms(20); if(RED==0) { Write_com(0x01); delay1ms(5); Write_Address(0x01); delay1ms(10); Write_Date('T'); Write_Date('I'); Write_Date('M'); Write_Date('E'); Write_Address(0x09); Write_Date('S'); Write_Date('E'); Write_Date('T'); Write_Address(0x46); Write_Date('-'); display_houra(houra); display_minutea(minutea); if(alarmmode==1) { Write_Address(0x4c); Write_Date('O'); Write_Date('N'); Write_Date(' '); } if(alarmmode==0) { Write_Address(0x4c); Write_Date('O'); Write_Date('F'); Write_Date('F'); } while(1) { if(SET==0) { delay1ms(100); if(SET==0) { amode++; switch(amode) { case(1):{gbdisplay(0x45);alarmhourset();Write_com(0x0c);delay1ms(500);} break; case(2):{gbdisplay(0x48);alarmminuteset();Write_com(0x0c);delay1ms(500);} break; case(3):{gbdisplay(0x4c);alarmswitchset();Write_com(0x0c);delay1ms(500);} break; } if(amode==4) amode=0; } } if(CANL==0) { Write_com(0x01); delay1ms(5); displaymainpart(); break; } } } } if(CANL==0) { Write_Address(0x40); Write_Date(' '); Write_com(0x0c); break; } } } } } /***************主函数**********************/ void main() { IE=0X82; //打开定时中断 TMOD=0X01; //选择定时器0工作在方式1 TR0=0; //启动定时器0 bee IntDS1302(); //初始化DS1302 delay1ms(1); Lcd_Int(); //1602液晶初始化 delay1ms(2); while(1) { displaymainpart(); display_Time( ); Set( ); if(ADD==0) { Write_com(0x01); // Temperature(); Write_com(0x01); displaymainpart(); } if((hours==houra)&&(minutes==minutea)&&(seconds==0)) { if(alarmmode==1) { Write_com(0x01); delay1ms(5); Write_Address(0x03); Write_Date('T'); Write_Date('I'); Write_Date('M'); Write_Date('E'); Write_Address(0x08); Write_Date('U'); Write_Date('P'); Write_Date('!'); delay1ms(5); while(1) { baojing(1); if(CANL==0) { Write_com(0x01); delay1ms(5); displaymainpart(); break; } } } } } }
#include #define uchar unsigned char #define uint unsigned int sbit led=P2^5; sbit wei=P2^7; sbit duan=P2^6; sbit DQ=P2^2; uchar mazhi_duan[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; uchar mazhi_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff}; void delayl(uint n) { uint i,j; for(i=n;i>0;i--) for(j=114;j>0;j--); } void delays(uchar i) { while(i--); } bit init_DS18B20() //DS8B20初始化 { bit x; DQ=1; //DQ复位 delays(8); DQ=0; //单片机将DQ拉低 delays(75); DQ=1; //拉高总线 delays(15); x=DQ; //延时过后 若x=0则初始化成功 若x=1则初始化失败 delays(5); return x; } void write_data(uchar dat) { uchar i,temp; temp=dat; DQ=1; for(i=0;i>=1; } } uchar read_data() { uchar i,dat; DQ=1; for(i=0;i>=1; DQ=1;//配置为输入 if(DQ) dat|=0x80; delays(4); } return dat; } uint readtemp() { uchar temph,templ; uint temp; float wendu; init_DS18B20(); write_data(0xcc);//跳过ROM write_data(0x44);//启动温度转换 //delayl(100); init_DS18B20(); write_data(0xcc);//跳过ROM write_data(0xBE);//读温度 //以下读温度,低八位在前 //高8位在后 templ=read_data(); temph=read_data(); temp = (temph<<8)|templ; wendu = temp*0.625+0.5;//温度扩大10倍,四舍五入 temp = wendu;//10倍温度 return temp; } void STC_init() { P1=0x00;//关闭led led=0; //锁存 wei=0; duan=0; } void display(uchar weil,uchar duanl,bit dp) { wei=1; P0=mazhi_wei[weil-1]; wei=0; duan=1; if(dp==1) P0=(mazhi_duan[duanl]|0x80); else P0=mazhi_duan[duanl]; duan=0; } void main() { uchar i; uint wendu; STC_init(); wendu=readtemp(); delayl(500); wendu=readtemp(); delayl(500); while(1) { wendu=readtemp(); for(i=0;i<80;i++) { display(1,wendu/100,0); delayl(3); display(2,wendu0/10,1); delayl(3); display(3,wendu,0); delayl(3); } } }

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧