博文

转化(2007-06-13 20:48:00)

摘要:在KELL C中是可以把C程序转换成汇编代码的。 前提:项目编绎,链接成功。 第一步:Debug->Start/Stop Debug Session. 第二步:View->Dissember Window.......

阅读全文(3110) | 评论:0

语法说明(2007-05-28 13:25:00)

摘要:-- 信号扩展:把一个小于"101"的高电平信号扩展成一个"101"周期的信号(间距大于"101"周期)-- 若在把这个信号经过边沿检测,那么这个就实现把一次高电平扩展成一个"101"周期的信号(间距大于"101"周期)) -- 区别在于,上面的高电平大于"101"周期时,则每"101"周期扩展一次library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all; entity processs is port(  d : in std_logic;  clk : in std_logic;  q   : out std_logic );end processs;------------------------------ architecture vr1 of processs is signal cn : std_logic_vector(2 downto 0) := "000";begin p1:process(clk,d) begin  if (clk'event and clk='1')then   if(d='1' and cn="000") then    cn <= "101";       elsif(cn>"001")then    cn <= cn-'1';   else    cn <= "000";   end if;  end if; end process p1;  --q <='0' when(cn ="000") else '1';     &......

阅读全文(3609) | 评论:0

Visual C++学习笔记(2006-08-06 00:09:00)

摘要:MFC文件处理机制 1.永久性对象与序列化永久性对象:内存中的对象以文件的形式存入存储介质,而从介质中读入时,该对象又能恢复为原来的状态。序列化:能使对象成为永久性对象的机制。2.Serialize函数Serialize函数是CObject类提供的虚函数,凡是希望具有序列化能力的类,都必须以CObject类或其派生类为基类。由于应用程序的数据一般由文档对象来管理的,每当用户新建,打开或保存文档时,程序就会自动调用文档类对象的Serialize函数。3.对象的序列化对象的序列化的操作过程封装成了一个类CArchive,实际上把类信息表跟类对象打包成文件的工作就是由CArchive类的对象在Serialize函数中完成的。Serialize函数原型:virtual void Serialize(CArchive &ar);当需要存取或读取一个对象时,必须在Serialize函数中进行。例如某类A为永久化类,具体编码过程如下:Class A::CObject{ DECLARE_SERIAL(A);  //声明了序列化 private:  int m_X,m_Y;  ... public:  Serialize(CArchive&ar); //重写序列化虚函数};IMPLEMENT_SERIAL(A,CObject,1);  //实现序列化重写的序列化函数Serialize的实现:A::Serialize(CArchive&Aar){ if(ar.IsStoring())  //存储数据 {  ar<<m_X;  ar<<m_Y; } else    //读取数据 {  ar>>m_X;  ar>>m_Y: }}   菜单 1.菜单资源的描述文件:文件中的BEGIN和END是菜单的分隔苻,在BEGIN前面书写的是菜单的标题。菜单可嵌套定义。2.菜单的定义: 标志符 MENU 载入特性选项菜单的可选加载特性:DISCARDABLE  当应用程序不再需要时,应用程......

阅读全文(5522) | 评论:0

OpenGL基本框架(2006-08-05 21:25:00)

摘要:摘于:http://cracker007.programfan.com           对于windows下的编程,似乎无论是win32 app还是dll,或者mfc,最重要的,也是最难的,都是那个框架。OpenGL也是如此。好在我已经饱经mfc的洗礼,明白如何下手分析框架。不过发现网上的很多程序框架都不是完全一样,不知道这里有没有什么标准?有些代码段去掉之后也仍然没有问题的。这似乎印证了csdn上的一句话:OpenGL出了错,什么都不会做; DirectX出了错,什么都做的出来。^-^ 研究了很多例子之后,我自己总结出了一个最简单、易懂的通用框架,并且给出了重要部分的注释:   /******************************by CRACKER007*******************************/     BOOL CGdlg::InitialPixelFormat()    //此函数被后面的CreateRC调用{ static PIXELFORMATDESCRIPTOR pfd= {  sizeof(PIXELFORMATDESCRIPTOR),   1,   PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,   PFD_TYPE_RGBA,   24,   0,0,0,0,0,0,   0,   0,   0,   0,0,0,0,   32,   0,   0,   PFD_MAIN_PLANE,   0,   0,......

阅读全文(610) | 评论:0

pragma指令简介(2006-06-20 00:44:00)

摘要:   www.csdn.net 在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.下面介绍了一下该指令的一些常用参数,希望对大家有所帮助! 一. message 参数。  message 它能够在编译信息输出窗  口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:   #pragma message(“消息文本”)   当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。  当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法  #ifdef _X86  #pragma message(“_X86 macro activated!”)  #endif  当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_  X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了         二. 另一个使用得比较多的#pragma参数是code_seg。格式如:   #pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] ) 该指令用来指定函数在.obj文件中存放的节,观察OBJ文件可以使用VC自带的du......

阅读全文(7103) | 评论:0

VB6.0初学者的10个编程小技巧(2006-05-25 22:15:00)

摘要:QQ群:130507791、如果一行程序太长,能不能换行?   VB的程序代码是允许换行书写的,只要在每次换行的最后一个字符加上换行字符“_”就可以了。例如: Sub PicMove() Frm.Picture2.Left = Frm.Picture1.Left + _ ’加上换行符 Frm.Picture1.Width End Sub  2、 如何在设计的时候清空存在的图片?   用鼠标点中该图片,在属性窗口中选中Picture属性,按Del键便可清空图片。   3、 Visual Basic 如何注释一段较长程序代码?   VB注释程序代码的符号是“注释:”,只要在某行程序前面加上“注释:”,就可以注释该行程序。但如果程序代码很长的时候,一行一行地注释令人觉得难以忍受。VB本身提供了这个功能,在主菜单“视图”选项的“工具栏”下,选中Edit,VB的界面会出现一排工具按钮,其中的手形图标按钮后的两个按钮用于“设置注释块”和“解除注释块”。   4、怎么实现鼠标一移上去就出现小提示窗口的功能?   VB 里每个控件都有ToolTipText属性,只要加上一行程序就可以了。  例如:Label1.ToolTipText = "这是提示!"。   5、 如何获得当前软件的运行磁盘目录和命令行参数?   VB里面有个系统对象叫App。App.Path就是当前软件的运行目录。而命令行参数存放在一个系统变量里面,叫Command。程序语句如下: Label1.Caption=App.Path Label2.Caption=Command$    6、我想换掉鼠标显示的形状,怎么做?   VB提供的系统控件一般都有MousePointer和MouseIcon属性。我们可以寻找自己喜欢的*.ICO,*.CUR文件,实现的程序如下: Screen.MousePointer= 99 ’用户鼠标类型 Screen.Mous......

阅读全文(3910) | 评论:0

浮点数 (2006-05-25 17:41:00)

摘要:  12345678900(十进制)=> 1011011111110111000001110000110100(34位精确值) ========> 符号位:0                          +127指数:33(100001=>00100001 =====> 10100000                  原码         阶码(移码)                  尾数:1.01101111111011100000111(取24位) =>(注意:前面的1在实际存放时为了多存放一位而隐含,即浮点数的尾数的最高位永远隐含为1)0 10100000 01101111111011100000111(实际放了尾数后面的23位)    指数          尾数    最后结果就是01010000001101111111011100000111 现在再把它还原成整数:(1)取尾数23位:01101111111011100000111(2)在前面加上隐含的1,变成:101101111111011100000111(3)取指数8位:10100000(4)指数减127得:100001(33)(5)尾数向左移动10位(尾数本身23位,33-23=10):101101111111011100......

阅读全文(3765) | 评论:0

离散数学的编程应用(2006-05-14 23:12:00)

摘要://    2006.5.12   //   3 取 2 表决(多数表决制),既对输入的三个字节进行判断 //   000 /1 取 0 (0个数多), 110 /1  取 1 (1个数多)#define  BYTE  char BYTE Major3_Judge(BYTE v1, BYTE v2 ,BYTE v3) {     BYTE vx=0x00 ;     BYTE bits= v1&~v2&~v3 | ~v1&v2&v3 ;     vx = v1&~bits | v2&bits;     return  vx; } #undef  BYTE V2  V3    V1    00 01 11 10 0 0 0 1 0 1 1 0 0 0   `显然 上面取 1 的 bits 位为 011和100 ,即bits= v1&~v2&~v3 | ~v1&v2&v3 ; 这样bits=1的位置就是 v1和v2与  v1和 v3均不同的数位,可以取V2的数位,因为此时V2和V3的数位必然相同,然后bits=0的位置就是 v1和v2或 v1和 v3有相同的数位,可以取V1的数位,因为此时V1和V3的数位或者V1和V2的数位必然至一个少相同   应用离散数学的 思想避免了 循环对每一位单独进行判定,大大优化拉程序,这只是一个简单的示例,只是提醒可以综合使用所学的知识......

阅读全文(5372) | 评论:0

好程序如何经得起千回改(2006-05-13 00:56:00)

摘要:   技术讨论专题之六:好程序如何经得起千回改? 在产品推向市场后,根据反馈信息对产品进行改进调整、升级换代是必不可免的,这也涉及到程序部分的改动。但是,好程序也怕千回改,大凡写程序的人都会有这种体验,就是宁可写程序,不愿改程序,原因如下: 1.写程序时,所有资源(IO口、RAM、ROM、堆栈、计数器、中断……等等)都是可用的,可以无拘束地使用;而改程序时,只能利用原先用剩下的资源。 2.写程序时,面向全局规划,可以合理安排各个功能的实现方法;而改程序时,是针对局部,为了避免影响其它部分功能,往往约束较大。 3.大多数人没有良好的编程习惯,事先不规划,事后不整理,脚踩西瓜皮,写到哪里算哪里。待到需要改动时,由于当时一些思路已经忘记了,没有留下足够的注释和说明文档,就摸不着边了。 4.由于没有一个统一的编程规范,如果原先的程序不是自己写的,那就更糟糕了。光看懂前任的程序就要耗费许多时间;而如果想较大面积地修改它,往往还不如自己重新写一个来得快些。 5.每次修改程序都是在原来程序的基础上打补丁,往往会为下一次的修改增加难度。最后,量变引起质变,活活把个好好的程序改烂掉了。 6.…… 最近,坛子里,对编程方法思路等方面的讨论较多(而雕虫小技则遭受抛弃)。匠人也来凑热闹,请大伙来讨论:好程序如何才能经得起千回改?  一些不成熟的想法,权当抛砖引玉  程序匠人 发表于 2004-7-30 11:34 侃单片机 ←返回版面   举报该贴 程序的改动大多数情况下都是伴随着硬件的改动。关于硬件的改动不是本贴的主题。不必作深入讨论。 程序如何才能经历岁月的考验,千锤百改,依然生机勃勃。一些不成熟的想法,权当抛砖引玉: 1.程序应该模块化,便于拆卸或增加。(这已经不算是新鲜观点了)。 2.使用RAM或IO,必须先定义再使用,避免直接引用。将来需要调整时,只要修改定义部分就好了。 3.相同或类似的程序段应该用子程序来实现,如果受堆栈等资源局限,不能使用子程序,则应该用宏来实现,这样以后需要改时,只要改一“点”,无须改一“片”。 4.写程序要有足够的注释、说明文档、流程图、原理图。便于以后能够快速勾起往日的回忆…… 5.每次修改程序,应该同步更新相关的注释、说明文档、流程图、原理图。免得下次再改时对......

阅读全文(3665) | 评论:0

我的单片机编程思路(2006-05-11 18:09:00)

摘要:我曾经做过两年的单片机产品,在对单片机编程的过程中逐渐形成了一个大体固定的整体框架,也可以说是编程思路。现提出来供大家参考。    首先,对外围芯片进行分类,属同一功能或同一芯片的程序采用模块化的形式,用固定的几个函数实现,一般不同芯片之间的函数功能尽量不重叠,也不要使用一个函数覆盖几个芯片,以便于后期的调试,如果涉及到芯片之间通讯的,可以单独列出,使用专门的函数进行处理;    其次,将单片机中需要完成的工作按轻重缓急进行分类,一般我会设置两个定时中断,其中一个定时时间大致在20mS左右,用来处理一些按钮防抖处理、时间日期计算、对输入处理后产生对应标志位、器件刷新等一些实时性要求不是很高,但必须有时间要求的事物处理,另外设立一个定时中断大概在1mS以下,主要用来实现时钟基准和做一些实时性要求很高的操作,一般需要将实时性要求较高的定时中断设置为高优先级,否则不能实现正常运行,如果还有串行中断需要处理,则需要严格控制实时中断中的代码长度,以免耽误串行中断的处理,还有就是如果使用软件实现串口及无线通讯软解码的场合,也要合理分配各部分的代码长度;    最后,将普通的事件检测和处理以及响应放在主程序体中实现,该部分一般只需要几个并行的函数就可以了,主程序体可以以简单的几行代码实现。    本人采用以上结构开发了若干个单片机产品,包括包含无线软解码的无线防盗报警主机、RS485中继器(一拖100)、带中文显示的报警接收机等,都实现了稳定有效的运行。    希望本人的一些体会会能给大家有所帮助! ......

阅读全文(5428) | 评论:4