完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
老师您觉得avr怎么样,您用的多吗?我看arduino最近特别火,简单玩了一下,功能挺强大,编程简单,但是总觉得差点什么,感觉像给不是学电子的人用的就像说的一样,像乐高积木
|
|
|
|
|
|
本帖最后由 ylmfwy 于 2013-1-10 23:50 编辑
还有就是我挺喜欢单片机的,觉得可以做很多特别好玩的小东西。 而我是学电子工程的可是我们专业偏向通信和信号分析。老师都用fpga,dsp,asic。 自己什么都想学,还学了pcb画图,但是现在都大三了,感觉自己特别贪心,而自己没有那么多精力,最后感觉什么都没有学精。除了做做小实验什么都项目做不了,老师的项目都太大太难了,也没时间理我,现在在学校的时间也不多了。有点不知道方向了。 或者说就是把握不了主次,我还在学mfc(觉得要编写上位机)但是看的云里雾里。不知道老师能不能帮我理一理学习的思路。 我也是想做机器人才报的电子工程 |
|
|
|
|
|
|
|
|
|
还有就是我挺喜欢单片机的,觉得可以做很多特别好玩的小东西。
而我是学电子工程的可是我们专业偏向通信和信号分析。老师都用fpga,dsp,asic。 自己什么都想学,还学了pcb画图,但是现在都大三了,感觉自己特别贪心,而自己没有那么多精力,最后感觉什么都没有学精。除了做做小实验什么都项目做不了,老师的项目都太大太难了,也没时间理我,现在在学校的时间也不多了。有点不知道方向了。 或者说就是把握不了主次,我还在学mfc(觉得要编写上位机)但是看的云里雾里。不知道老师能不能帮我理一理学习的思路。 我也是想做机器人才报的电子工程 |
|
|
|
|
|
|
|
|
|
第十三节:液晶屏第一大类定律--纵向显示八个点(SED1520驱动12232屏)
第一大类定律:纵向显示八个点的类型。 这类液晶屏在纵向上以八个点(一个字节)为基本单位,因此Y坐标数值的最大范围是纵向上的点阵数除以八,然后再减去一(因为从零开始)。而X坐标数值的最大范围就直接是横向上的点阵数减去一(因为从零开始)。 (1) 开场白: 这节 我以驱动芯片为SED1520的12232液晶屏为例子,来继续深入了解第一大类定律:纵向显示八个点的类型。12232液晶屏实际上是由左右两块6132的液晶屏合并在一起的,跟前面提到的驱动芯片为KS0107的12864屏稍微有点不一样,它不是由两根IO口来片选不同的屏,而是通过两根不同的时钟线来区分不同的屏。因此,我们只要弄懂了一块6132液晶屏的显示方法就够了。6132屏在横向上是61个点,纵向上是32个点,也就是一个长方形的屏。因为它属于第一大类的屏,所以X轴坐标数值的最大范围是61-1=60,而纵向坐标数值的最大范围是(32/8)-1=3.正常的操作思路是这样的,先发送Y轴与X轴的位置数据,确定位置后,再发送一个字节(八个点)的显示数据。这类屏跟之前介绍KS0107驱动12864的屏稍微有点不一样,每发送一次显示数据时,都要先重新设置一下Y与X轴的位置, X地址不会自动加一。 字节正序与倒序的概念解释:当我们一次在纵向上显示八个点的基本单位时,实际上等于我们发送了一个字节的显示数据,比如0x01,如果是正序的屏,那么从上到下的八个点中,只有第8个点是显示的,其它的是空白,而如果是倒序的屏,则只有第1个点是显示的,其它是空白的。12232这个屏是属于倒序的屏。 取模软件是必须的,读者可以在网上自己下载,资料很多。 (2)功能需求: 在12232屏上的左屏和右屏分别显示8X16的字符,16X16的汉字,24X24的汉字。 (3)硬件原理: 这类屏跟之前介绍KS0107驱动12864的屏稍微有点不一样,它没有的VEE这个端口。20K可调电阻的左边端口直接悬空,VO接可调电阻的中间端口,可调电阻的右边端口接电源负极,此可调电阻在这里用来调节液晶屏的对比度。模块的复位引脚直接用一个15K的电阻跟一个104电容搭成上电低电平硬件复位电路,省一个IO口,也就是此IO口接一个15K的上拉电阻,然后对地再接一个104电容。模块与背光的电源线接上5V,其它数据线跟单片机的IO口连接上。这个大家都懂。 (4)源码适合的单片机:PIC18f4520,晶振为11.0592MHz。 (5)源代码讲解如下: #include //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的//IO后缀都//是_sr,凡是数据总线后缀都是_bus #define E1_dr LATD4 #define E2_dr LATD5 #define RW_dr LATD6 #define RS_dr LATD7 #define LcmDataBus PORTB void delay(unsigned int t); //时序延时函数声明 void chk_busy_left () ; //左屏忙检测,液晶驱动时序的一部分 void chk_busy_right () ; //左屏忙检测,液晶驱动时序的一部分 void write_com_left(unsigned char cmdcode); //往左液晶模块写入指令 void write_com_right(unsigned char cmdcode); //往右液晶模块写入指令 void write_data_left(unsigned char Di_drspdata); //往左液晶模块写入数据 void write_data_right(unsigned char Di_drspdata); //往右液晶模块写入数据 void screen_clear(); //清空屏的内容 void ***_display816_left(unsigned char col, unsigned char pag,const unsigned char * zk,unsigned char opposite_flag); //左显示8X16的字符函数,本节的核心内容 void ***_display816_right(unsigned char col, unsigned char pag,const unsigned char * zk,unsigned char opposite_flag); //右显示8X16的字符函数,本节的核心内容 void hz_display1616_left(unsigned char col, unsigned char pag,const unsigned char * zk,unsigned char opposite_flag); //左屏,显示16X16的汉字函数,本节的核心内容 void hz_display1616_right(unsigned char col, unsigned char pag,const unsigned char * zk,unsigned char opposite_flag); //右屏,显示16X16的汉字函数,本节的核心内容 void hz_display2424_left(unsigned char col, unsigned char pag,const unsigned char * zk,unsigned char opposite_flag); //左屏,显示24X24的汉字函数,本节的核心内容 void hz_display2424_right(unsigned char col, unsigned char pag,const unsigned char * zk,unsigned char opposite_flag); //右屏,显示24X24的汉字函数,本节的核心内容 void init_lcd(); //初始化液晶模块 //补充说明:吴坚鸿程序风格是这样的,凡是字库内容,如果是字符,则前缀用***,然后紧//跟着点阵数,接着下划线,最后紧跟显示的字符。如果有重复的,则多加一个序列号标////识。如果是汉字,则前缀用hz,其它的一样。 const unsigned char ***816_V[]=//从取模软件中复制的字库,纵向取模,字节倒序 { /*-- 文字: V --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00, }; const unsigned char ***816_5[]= { /*-- 文字: 5 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, }; const unsigned char hz1616_hong[]= { /*-- 文字: 鸿 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x61,0x86,0x60,0x08,0xF8,0x08,0x00,0xFC,0x0E,0x35,0x04,0x44,0x7C,0x00,0x00, 0x04,0x7C,0x03,0x04,0x04,0x03,0x0A,0x08,0x09,0x09,0x09,0x09,0x49,0x81,0x7F,0x00, }; const unsigned char hz1616_ge[]= { /*-- 文字: 哥 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x02,0x02,0x7A,0x2A,0x2A,0x2A,0x2A,0x7A,0x02,0x02,0x7E,0x02,0x82,0x00,0x00, 0x01,0x01,0x01,0x3D,0x15,0x15,0x15,0x15,0x3D,0x41,0x81,0x7F,0x01,0x01,0x01,0x00, }; const unsigned char hz2424_hong[]= { /*-- 文字: 鸿 --*/ /*-- 宋体18; 此字体下对应的点阵为:宽x高=24x24 --*/ 0x00,0x80,0x00,0x04,0x18,0x90,0x40,0x40,0x40,0xC0,0x40,0x60,0x40,0xE0,0x20,0x30, 0xAC,0x24,0x20,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x03,0x06,0xF8,0x07,0x00,0x00, 0x80,0xFF,0x80,0x40,0x00,0x7F,0x40,0x40,0x41,0x49,0x58,0x4F,0xC0,0xE0,0x00,0x00, 0x00,0x00,0x01,0x7F,0x60,0x00,0x01,0x01,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04, 0x24,0x22,0x62,0x64,0x3F,0x03,0x00,0x00, }; const unsigned char hz2424_ge[]= { /*-- 文字: 哥 --*/ /*-- 宋体18; 此字体下对应的点阵为:宽x高=24x24 --*/ 0x00,0x00,0x00,0x08,0x08,0x08,0xE8,0x48,0x48,0x48,0x48,0x48,0xE8,0x08,0x08,0x08, 0x08,0xF8,0x08,0x0C,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xD0,0xD3,0x52, 0x52,0x52,0x52,0x52,0xD3,0x10,0x10,0x10,0x10,0xF7,0x10,0x10,0x08,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x04,0x04,0x04,0x04,0x04,0x0F,0x00,0x20,0x20, 0x60,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, }; //主程序 main() { ADCON0=0x00; ADCON1=0x0f; ADCON2=0x00; TRISA=0x02; TRISE=0x00; TRISC=0x7f; TRISD=0x0f; TRISB=0x00; RBPU=0; SSPEN=0; //决定RA5作为IO TRISE2=1; //补充说明,以上的内容为寄存器配置,每种不同的单片机会有点差异, //大家不用过度关注以上寄存器的配置,只要知道有这么一回事即可 init_lcd(); //初始化液晶屏 screen_clear ();//清空整屏显示内容 //左6132屏,正显,16X16的汉字,“鸿哥V5” hz_display1616_left(0, 0,hz1616_hong,0); hz_display1616_left(16, 0,hz1616_ge,0); ***_display816_left(32, 0,***816_V,0); ***_display816_left(40, 0,***816_5,0); //右6132屏,反显,24X24的汉字,“鸿哥” hz_display2424_right(0, 0,hz2424_hong,1); hz_display2424_right(24, 0,hz2424_ge,1); while(1) { CLRWDT(); //喂看门狗,大家不用过度关注此行 } } //------------------时序延时子程序----------------------------- void delay(unsigned int t) { unsigned int i; for(i=0;i } //------------------左屏忙闲检查,驱动液晶程序的一部分------------------------------ void chk_busy_left () { RS_dr = 0; RW_dr = 1; E1_dr = 1; //左屏时钟线 TRISB=0xff; while(LcmDataBus & 0x80); TRISB=0x00; } //------------------右屏忙闲检查,驱动液晶程序的一部分------------------------------ void chk_busy_right () { RS_dr = 0; RW_dr = 1; E2_dr = 1; //右屏时钟线 TRISB=0xff; while(LcmDataBus & 0x80); TRISB=0x00; } //------------------写命令到左LCD,,驱动液晶程序的一部分------------------------------ void write_com_left(unsigned char cmdcode) { chk_busy_left (); //左屏忙检测 E1_dr = 0; //左屏时钟线 LcmDataBus = cmdcode; RS_dr = 0; RW_dr = 0; E1_dr = 1; delay(3); E1_dr = 0; delay(3); } //------------------写命令到右LCD,,驱动液晶程序的一部分------------------------------ void write_com_right(unsigned char cmdcode) { chk_busy_right (); //右屏忙检测 E2_dr = 0; //右屏时钟线 LcmDataBus = cmdcode; RS_dr = 0; RW_dr = 0; E2_dr = 1; delay(3); E2_dr = 0; delay(3); } //-------------------写数据到左LCD,,驱动液晶程序的一部分---------------------------- void write_data_left(unsigned char Di_drspdata) { chk_busy_left ();//左屏忙检测 E1_dr = 0; //左屏时钟线 LcmDataBus =Di_drspdata; RS_dr = 1; RW_dr = 0; E1_dr = 1; delay(3); E1_dr = 0; delay(3); } //-------------------写数据到右LCD,,驱动液晶程序的一部分---------------------------- void write_data_right(unsigned char Di_drspdata) { chk_busy_right ();//右屏忙检测 E2_dr = 0; //右屏时钟线 LcmDataBus =Di_drspdata; RS_dr = 1; RW_dr = 0; E2_dr = 1; delay(3); E2_dr = 0; delay(3); } //*------------------清空屏幕的内容,本节的核心内容 ---------------*/ void screen_clear () { unsigned char j,i; //清空左屏 for(j =0; j <4; j ++) //此处的j代表Y轴的坐标,范围是(0到3),(32/8)-1=3. { for(i=0; i <61; i ++) //此处i代表X轴,范围是(0到60),61-1=60 { write_com_left(0x03&j|0xB8); //每发送一次显示数据,都重新设定一次Y轴的当前位置 write_com_left(0x7F&i); //每发送一次显示数据,都重新设定一次X轴的当前位置 write_data_left(0x00); //都显示空内容,达到清空的目的 } } //清空右屏 for(j =0; j <4; j ++) //此处的j代表Y轴的坐标,范围是(0到3),(32/8)-1=3. { for(i=0; i <61; i ++) //此处i代表X轴,范围是(0到60),61-1=60 { write_com_right(0x03&j|0xB8); //每发送一次显示数据,都重新设定一次Y轴的当前位置 write_com_right(0x7F&i); //每发送一次显示数据,都重新设定一次X轴的当前位置 write_data_right(0x00); //都显示空内容,达到清空的目的 } } } //左屏,显示8X16的字符函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相对//应的字库,opposite_flag代表是否反显,0表示正常显示,1表示反显 void ***_display816_left(unsigned char col, unsigned char pag,const unsigned char *zk,unsigned char opposite_flag) { unsigned char j=0,i=0; for(j=0;j<2;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个8X16字符只占用//两行,每行8个点,两行的高度就是16个点, { for(i=0;i<8;i++) //此处i代表X轴的数据,因为一个字符的宽度是8个点,因此范围是(0到7),8-1=7. { write_com_left(0x03&(pag+j)|0xB8); //每发送一次显示数据,都重新设定一次Y轴的当前位置 write_com_left(0x7F&(col+i)); //每发送一次显示数据,都重新设定一次X轴的当前位置 if(opposite_flag ==1) //反显 { write_data_left(~zk [8*j+i]); //发送显示的字节数据,纵向显示八个点,一行8个///点,因此8*j } else //正显 { write_data_left(zk [8*j+i]); //发送显示的字节数据,纵向显示八个点 ,一行8个点,//因此8*j } } } } //右屏,显示8X16的字符函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相对//应的字库,opposite_flag代表是否反显,0表示正常显示,1表示反显 void ***_display816_right(unsigned char col, unsigned char pag,const unsigned char *zk,unsigned char opposite_flag) { unsigned char j=0,i=0; for(j=0;j<2;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个8X16字符只占用//两行,每行8个点,两行的高度就是16个点, { for(i=0;i<8;i++) //此处i代表X轴的数据,因为一个字符的宽度是8个点,因此范围是(0到7),8-1=7. { write_com_right(0x03&(pag+j)|0xB8); //每发送一次显示数据,都重新设定一次Y轴的当前位置 write_com_right(0x7F&(col+i)); //每发送一次显示数据,都重新设定一次X轴的当前位置 if(opposite_flag ==1) //反显 { write_data_right(~zk [8*j+i]); //发送显示的字节数据,纵向显示八个点,一行8个///点,因此8*j } else //正显 { write_data_right(zk [8*j+i]); //发送显示的字节数据,纵向显示八个点 ,一行8个点,//因此8*j } } } } //左屏,显示16X16的汉字函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相//对应的字库,opposite_flag代表是否反显,0表示正常显示,1表示反显 void hz_display1616_left(unsigned char col, unsigned char pag,const unsigned char *zk,unsigned char opposite_flag) { unsigned char j=0,i=0; for(j=0;j<2;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个16X16汉字只占//用两行,每行8个点,两行的高度就是16个点, { for(i=0;i<16;i++) //此处i代表X轴的数据,因为一个16X16汉字的宽度是16个点,因此范围是(0到15),16-1=15. { write_com_left(0x03&(pag+j)|0xB8); //每发送一次显示数据,都重新设定一次Y轴的当前位置 write_com_left(0x7F&(col+i)); //每发送一次显示数据,都重新设定一次X轴的当前位置 if(opposite_flag ==1) //反显 { write_data_left(~zk [16*j+i]); //发送显示的字节数据,纵向显示八个点,一行16个///点,因此16*j } else //正显 { write_data_left(zk [16*j+i]); //发送显示的字节数据,纵向显示八个点 ,一行16个点,//因此16*j } } } } //右屏,显示16X16的汉字函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相//对应的字库,opposite_flag代表是否反显,0表示正常显示,1表示反显 void hz_display1616_right(unsigned char col, unsigned char pag,const unsigned char *zk,unsigned char opposite_flag) { unsigned char j=0,i=0; for(j=0;j<2;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个16X16汉字只占//用两行,每行8个点,两行的高度就是16个点, { for(i=0;i<16;i++) //此处i代表X轴的数据,因为一个16X16汉字的宽度是16个点,因此范围是(0到15),16-1=15. { write_com_right(0x03&(pag+j)|0xB8); //每发送一次显示数据,都重新设定一次Y轴的当前位置 write_com_right(0x7F&(col+i)); //每发送一次显示数据,都重新设定一次X轴的当前位置 if(opposite_flag ==1) //反显 { write_data_right(~zk [16*j+i]); //发送显示的字节数据,纵向显示八个点,一行16个///点,因此16*j } else //正显 { write_data_right(zk [16*j+i]); //发送显示的字节数据,纵向显示八个点 ,一行16个点,//因此16*j } } } } //左屏,显示24X24的汉字函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相//对应的字库,opposite_flag代表是否反显,0表示正常显示,1表示反显 void hz_display2424_left(unsigned char col, unsigned char pag,const unsigned char *zk,unsigned char opposite_flag) { unsigned char j=0,i=0; for(j=0;j<3;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个24X24汉字只占//用三行,每行8个点,三行的高度就是24个点, { for(i=0;i<24;i++) //此处i代表X轴的数据,因为一个24X24汉字的宽度是24个点,因此范围是(0到23),24-1=23. { write_com_left(0x03&(pag+j)|0xB8); //每发送一次显示数据,都重新设定一次Y轴的当前位置 write_com_left(0x7F&(col+i)); //每发送一次显示数据,都重新设定一次X轴的当前位置 if(opposite_flag ==1) //反显 { write_data_left(~zk [24*j+i]); //发送显示的字节数据,纵向显示八个点,一行24///个点,因此24*j } else //正显 { write_data_left(zk [24*j+i]); //发送显示的字节数据,纵向显示八个点 ,一行24个/////点,因此24*j } } } } //右屏,显示24X24的汉字函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相//对应的字库,opposite_flag代表是否反显,0表示正常显示,1表示反显 void hz_display2424_right(unsigned char col, unsigned char pag,const unsigned char *zk,unsigned char opposite_flag) { unsigned char j=0,i=0; for(j=0;j<3;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个24X24汉字只占//用三行,每行8个点,三行的高度就是24个点, { for(i=0;i<24;i++) //此处i代表X轴的数据,因为一个24X24汉字的宽度是24个点,因此范围是(0到23),24-1=23. { write_com_right(0x03&(pag+j)|0xB8); //每发送一次显示数据,都重新设定一次Y轴的当前位置 write_com_right(0x7F&(col+i)); //每发送一次显示数据,都重新设定一次X轴的当前位置 if(opposite_flag ==1) //反显 { write_data_right(~zk [24*j+i]); //发送显示的字节数据,纵向显示八个点,一行24///个点,因此24*j } else //正显 { write_data_right(zk [24*j+i]); //发送显示的字节数据,纵向显示八个点 ,一行24个/////点,因此24*j } } } } //*------------------初始化LCD屏--------------------------*/ void init_lcd() { //左屏初始化 write_com_left(0xE2); write_com_left(0xA4); write_com_left(0xA9); write_com_left(0xA0); write_com_left(0xC0); write_com_left(0); write_com_left(0xAF); //右屏初始化 write_com_right(0xE2); write_com_right(0xA4); write_com_right(0xA9); write_com_right(0xA0); write_com_right(0xC0); write_com_right(0); write_com_right(0xAF); } (6)小结: 读者要重点弄清楚void screen_clear ,void ***_display816_left, void ***_display816_right,void hz_display1616_left, void hz_display1616_right,void hz_display2424_left, void hz_display2424_right这七个函数他们之间的联系与规律,即可掌握本节内容的精髓。 我是今年6月份第一次接触电子发烧友论坛,这里的版主很用心,也很包容。要不是他们一步步的发掘与引导,也许我也不会在不知不觉中写了这么多文章。到目前为止,我觉得电子发烧友已经是我的精神家园。以前我的程序都是直接在word文档里编写的,没有经过编译,因此很多语法错误。为了感谢电子发烧友网站,我决定从这一节开始,所有的程序都一律先经过编译器编译通过,然后再发表。也许以后复杂一点的程序,我还会附上原理图。 (未完待续,下节更精彩,不要走开哦) |
|
|
|
|
|
|
|
|
|
|
|
|
|
吴老师你好,我用STC12C5A60S2单片机,晶振为11.0592MHz 来做你的(第二节:独立按键扫描与蜂鸣器,适合的单片机:PIC18F4620,晶振为22.1184MHz)实验,我不懂看门狗怎样用在程序中,请教一下学生我,谢谢! //主程序 main() { ------------- ------------- ------------- while(1) { CLRWDT(); //喂看门狗,大家不用过度关注此行//【单改这里行吗?】 key_service(); //按键服务 } } |
|
|
|
|
|
|
|
|
|
鸿哥,你在“第六节:单串口通讯之如何接住别人丢过来的一堆数据”里面有一数组RCREG_temp_buf[1]怎么没有定义,是不是漏定义还是什么原因?
|
|
|
|
|
|
谢谢你的提醒,是我的错。有3个错误。从第十三节开始,我全部代码都会先经过编译器编译的。 RCREG_buf_temp[0]= RCREG_temp_buf[1]; //数据移动,方便截取关键字 RCREG_buf_temp[1]= RCREG_temp_buf[2]; RCREG_buf_temp[3]=asy_recieve(); 应该改为: RCREG_buf_temp[0]= RCREG_buf_temp[1]; //数据移动,方便截取关键字 RCREG_buf_temp[1]= RCREG_buf_temp[2]; RCREG_buf_temp[2]=asy_recieve(); |
|
|
|
|
|
他们是成不了气候的,不用担心被他们抢饭碗。大路朝天,各走一边。解密出来的程序是死的,没办法升级,哪怕任何一点小改动。有些有液晶显示的产品,显示有别人公司的LOGO,解密出来也没用。自己开发的东西后续生产与维护中更加有保障。不是什么产品都能解密的,即使是专业的解密公司,你找他解密的时候,他首先会说,他不保证解密出来的东西一定能够正常运行, 意思是“投资有风险,解密需谨慎”。东莞有个老板,花了20万破解了人家一个产品,是用在工控上的系统,正要得逞的时候,这个产品的显示屏上突然冒出一段内容“请找厂家联系”,顿时傻了眼,从此之后,同行再也没有人动歪主意去破解这个产品,老老实实通过正当渠道去采购。所以说,很多老板还是愿意老老实实自己开发,虽然前期会折腾一段时间,但是以后生产心里踏实。 在这里,我也介绍我自己常用的一种防破解的方法。这种办法只能针对内部自带EEPROM的单片机有用。在程序初始化的地方,多加设计一段程序,当单片机刚刚烧录程序进去的时候,第一次通电,必须通过外部输入密码,才能激活,第一次激活之后,以后再断电上电,不用再激活。比如,第一次上电,先要通过外部某几个按键(或者串口)按照规定的操作方式,单片机内部识别是正确之后,就把单片机的内部EEPROM的一个单元置1标志起来,下次再上电,发现这个标志已经置1了,就不用再激活。这样,即使被别人破解了程序,人家拿到你的HEX文件后,但是第一次上电的时候,不知道怎么激活也是没有办法运行的。 我的疑问是:1.当单片机刚刚烧录程序进去的时候,第一次通电,必须通过外部输入密码,才能激活,【这个激活只能编写程序的人做,并且不能当着别人的面做,防止别人知道密码,对吗?】 2.激活后,单片机的内部EEPROM的一个单元置1标志起来,下次再上电,发现这个标志已经置1了,就不用再激活。【激活后,就可以把产品交给客户使用,客户在使用过程中是无需输入密码的,对吗?】 3.【你能确定破解者不会把内部EEPROM的那个置1标志起来的单元都能解密出来吗?】 |
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2077 浏览 1 评论
3501 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2333 浏览 2 评论
2760 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4015 浏览 5 评论
966浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6349浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 14:23 , Processed in 0.993893 second(s), Total 89, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号