首页

> 期刊发表知识库

首页 期刊发表知识库 问题

使用文本编辑器设计VHDL程序

发布时间:

使用文本编辑器设计VHDL程序

/etc下有相应的配置文件,进去可以设置

CPLD[编辑本段]简介 CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件,是从PAL和GAL器件发展出来的器件,相对而言规模大,结构复杂,属于大规模集成电路范围。是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统。 CPLD主要是由可编程逻辑宏单元(MC,Macro Cell)围绕中心的可编程互连矩阵单元组成。其中MC结构较复杂,并具有复杂的I/O单元互连结构,可由用户根据需要生成特定的电路结构,完成一定的功能。由于CPLD内部采用固定长度的金属线进行各逻辑块的互连,所以设计的逻辑电路具有时间可预测性,避免了分段式互连结构时序不完全预测的缺点。 发展历史及应用领域: 20世纪70年代,最早的可编程逻辑器件--PLD诞生了。其输出结构是可编程的逻辑宏单元,因为它的硬件结构设计可由软件完成(相当于房子盖好后人工设计局部室内结构),因而它的设计比纯硬件的数字电路具有很强的灵活性,但其过于简单的结构也使它们只能实现规模较小的电路。为弥补PLD只能设计小规模电路这一缺陷,20世纪80年代中期,推出了复杂可编程逻辑器件--CPLD。目前应用已深入网络、仪器仪表、汽车电子、数控机床、航天测控设备等方面。 器件特点: 它具有编程灵活、集成度高、设计开发周期短、适用范围宽、开发工具先进、设计制造成本低、对设计者的硬件经验要求低、标准产品无需测试、保密性强、价格大众化等特点,可实现较大规模的电路设计,因此被广泛应用于产品的原型设计和产品生产(一般在10,000件以下)之中。几乎所有应用中小规模通用数字集成电路的场合均可应用CPLD器件。CPLD器件已成为电子产品不可缺少的组成部分,它的设计和应用成为电子工程师必备的一种技能。 如何使用: CPLD是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统。 这里以抢答器为例讲一下它的设计(装修)过程,即芯片的设计流程。CPLD的工作大部分是在电脑上完成的。打开集成开发软件(Altera公司 Max+pluxII)→画原理图、写硬件描述语言(VHDL,Verilog)→编译→给出逻辑电路的输入激励信号,进行仿真,查看逻辑输出结果是否正确→进行管脚输入、输出锁定(7128的64个输入、输出管脚可根据需要设定)→生成代码→通过下载电缆将代码传送并存储在CPLD芯片中。7128这块芯片各管脚已引出,将数码管、抢答开关、指示灯、蜂鸣器通过导线分别接到芯片板上,通电测试,当抢答开关按下,对应位的指示灯应当亮,答对以后,裁判给加分后,看此时数码显示加分结果是否正确,如发现有问题,可重新修改原理图或硬件描述语言,完善设计。设计好后,如批量生产,可直接复制其他CPLD芯片,即写入代码即可。如果要对芯片进行其它设计,比如进行交通灯设计,要重新画原理图、或写硬件描述语言,重复以上工作过程,完成设计。这种修改设计相当于将房屋进行了重新装修,这种装修对CPLD来说可进行上万次。 家庭成员:经过几十年的发展,许多公司都开发出了CPLD可编程逻辑器件。比较典型的就是Altera、Lattice、Xilinx世界三大权威公司的产品,这里给出常用芯片: Altera EPM7128S (PLCC84) Lattice LC4128V (TQFP100) Xilinx XC95108 (PLCC84)[编辑本段]FPGA与CPLD的辨别和分类 FPGA与CPLD的辨别和分类主要是根据其结构特点和工作原理。通常的分类方法是: 将以乘积项结构方式构成逻辑行为的器件称为CPLD,如Lattice的ispLSI系列、Xilinx的XC9500系列、Altera的MAX7000S系列和Lattice(原Vantis)的Mach系列等。 将以查表法结构方式构成逻辑行为的器件称为FPGA,如Xilinx的SPARTAN系列、Altera的FLEX10K或ACEX1K系列等。===============FPGA目录 FPGA与CPLD的辨别和分类 FPGA的应用 FPGA是英文Field-Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。[编辑本段] FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA的基本特点主要有: 1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。 2)FPGA可做其它全定制或半定制ASIC电路的中试样片。 3)FPGA内部有丰富的触发器和I/O引脚。 4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。 5) FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。 可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。 FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。 加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。[编辑本段] FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。 如何实现快速的时序收敛、降低功耗和成本、优化时钟管理并降低FPGA与PCB并行设计的复杂性等问题,一直是采用FPGA的系统设计工程师需要考虑的关键问题。如今,随着FPGA向更高密度、更大容量、更低功耗和集成更多IP的方向发展,系统设计工程师在从这些优异性能获益的同时,不得不面对由于FPGA前所未有的性能和能力水平而带来的新的设计挑战。 例如,领先FPGA厂商Xilinx最近推出的Virtex-5系列采用65nm工艺,可提供高达33万个逻辑单元、1,200个I/O和大量硬IP块。超大容量和密度使复杂的布线变得更加不可预测,由此带来更严重的时序收敛问题。此外,针对不同应用而集成的更多数量的逻辑功能、DSP、嵌入式处理和接口模块,也让时钟管理和电压分配问题变得更加困难。 幸运地是,FPGA厂商、EDA工具供应商正在通力合作解决65nm FPGA独特的设计挑战。不久以前,Synplicity与Xilinx宣布成立超大容量时序收敛联合工作小组,旨在最大程度帮助地系统设计工程师以更快、更高效的方式应用65nm FPGA器件。设计软件供应商Magma推出的综合工具Blast FPGA能帮助建立优化的布局,加快时序的收敛。 最近FPGA的配置方式已经多元化![编辑本段] 1、Altera 2、Xilinx 3、Actel 4、Lattice 其中Altera和Xilinx主要生产一般用途FPGA,其主要产品采用RAM工艺。Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺。 FPGA设计的注意事项 不管你是一名逻辑设计师、硬件工程师或系统工程师,甚或拥有所有这些头衔,只要你在任何一种高速和多协议的复杂系统中使用了FPGA,你就很可能需要努力解决好器件配置、电源管理、IP集成、信号完整性和其他的一些关键设计问题。不过,你不必独自面对这些挑战,因为在当前业内领先的FPGA公司里工作的应用工程师每天都会面对这些问题,而且他们已经提出了一些将令你的设计工作变得更轻松的设计指导原则和解决方案。 I/O信号分配 可提供最多的多功能引脚、I/O标准、端接方案和差分对的FPGA在信号分配方面也具有最复杂的设计指导原则。尽管Altera的FPGA器件没有设计指导原则(因为它实现起来比较容易),但赛灵思的FPGA设计指导原则却很复杂。但不管是哪一种情况,在为I/O引脚分配信号时,都有一些需要牢记的共同步骤: 使用一个电子数据表列出所有计划的信号分配,以及它们的重要属性,例如I/O标准、电压、需要的端接方法和相关的时钟。 检查制造商的块/区域兼容性准则。 考虑使用第二个电子数据表制订FPGA的布局,以确定哪些管脚是通用的、哪些是专用的、哪些支持差分信号对和全局及局部时钟、哪些需要参考电压。 利用以上两个电子数据表的信息和区域兼容性准则,先分配受限制程度最大的信号到引脚上,最后分配受限制最小的。例如,你可能需要先分配串行总线和时钟信号,因为它们通常只分配到一些特定引脚。 按照受限制程度重新分配信号总线。在这个阶段,可能需要仔细权衡同时开关输出(SSO)和不兼容I/O标准等设计问题,尤其是当你具有很多个高速输出或使用了好几个不同的I/O标准时。如果你的设计需要局部/区域时钟,你将可能需要使用高速总线附近的管脚,最好提前记住这个要求,以免最后无法为其安排最合适的引脚。如果某个特定块所选择的I/O标准需要参考电压信号,记住先不要分配这些引脚。差分信号的分配始终要先于单端信号。如果某个FPGA提供了片内端接,那么它也可能适用于其他兼容性规则。 在合适的地方分配剩余的信号。 在这个阶段,考虑写一个只包含端口分配的HDL文件。然后通过使用供应商提供的工具或使用一个文本编辑器手动创建一个限制文件,为I/O标准和SSO等增加必要的支持信息。准备好这些基本文件后,你可以运行布局布线工具来确认是否忽视了一些准则或者做了一个错误的分配。 这将使你在设计的初始阶段就和布局工程师一起工作,共同规划PCB的走线、冗余规划、散热问题和信号完整性。FPGA工具可能可以在这些方面提供帮助,并协助你解决这些问题,因此你必须确保了解你的工具包的功能。 你咨询一位布局专家的时间越晚,你就越有可能需要去处理一些复杂的问题和设计反复,而这些可能可以通过一些前期分析加以避免。一旦你实现了满意的信号分配,你就要用限制文件锁定它们。 ------------------- 基于CMOS的设计主要消耗三类切率:内部的(短路)、漏电的(静态的)以及开关的(电容)。当门电路瞬变时,VDD与地之间短路连接消耗内部功率。漏电功耗是CMOS工艺普遍存在的寄生效应引起的。而开关功耗则是自负载电容,放电造成的。开关功耗与短路功耗合在一起称为动态功耗。下面介绍降低静态功耗和动态功耗的设计技巧。 降低静态功耗 虽然静态电流与动态电流相比可以忽略不计,然而对电池供电的手持设备就显得十分重要,在设备通电而不工作时更是如此。静态电流的因素众多,包括处于没有完全关断或接通的状态下的I/O以及内部晶体管的工作电流、内部连线的电阻、输入与三态电驱动器上的拉或下拉电阻。在易失性技术中,保持编程信息也需一定的静态功率。抗熔断是一种非易失性技术,因此信息存储不消耗静态电流。 下面介绍几种降低静态功耗的设计方法: •驱动输入应有充分的电压电平,因而所有晶体管都是完全通导或关闭的。 •由于I/O线上的上拉或下拉电阻要消耗一定的电流,因此尽量避免使用这些电阻。 •少用驱动电阻或双极晶体管,这些器件需维持一个恒定电流,从而增加了静态电流。 •将时钟引脚按参数表推荐条件连接至低电平。悬空的时钟输入会大大增加静态电流。 •在将设计划分为多个器件时,减少器件间I/O的使用。 eX器件LP方式引脚的使用 Actel eX系列设计了特殊的低功率“休眠”模式。在该引脚驱动至高电平800ns后,器件进入极低功率待机模式,待机电流小于100μA。在低功率模式下,所有I/O(除时钟输入外)都处于三态,而内核全部断电。由于内核被断电,触发器中存储的信息会丢失,在进入工作模式(在引脚驱动至低平200ms后)时,用户需再次对器件初始化。同样,用户也应关闭所有通过CLKA、CLKB以及HCLK输入的时钟。然而这些时钟并不处于三态,时钟就可进入器件,从而增加功耗,因此在低功率模式下,时钟输入必须处于逻辑0或逻辑1。 有时用户很难阻止时钟进入器件。在此场合,用户可使用与CLKA或CLKA相邻的正常输入引脚并在设计中加进CLKINT。这样,时钟将通过靠近时钟引脚的正常输入进入器件,再通过CLKINT向器件提供时钟资源。 采用这种输入电路后,由于常规I/O是三态的,因此用户不必担心时钟进入器件。当然,增加一级门电路会产生6ns的较大时钟延时,幸好这在多数低功率设计中是可以接受的。注意应将与CLKINT缓冲器相关的CLKA或CLKB引脚接地。 此外还要注意,CLKINT只可用作连线时钟,HCLK并不具备将内部走线网连接到HCLK的能力,因而HCLK资源不能被常规输入驱动。换句话说,如果使用LP引脚就不能使用HCLK;使用HCLK时就应在外部截断时钟信号。 降低动态功耗 动态功耗是在时钟工作且输入正在开关时的功耗。对CMOS电路,动态功耗基本上确定了总功耗。动态功耗包括几个成分,主要是电容负载充电与放电(内部与I/O)以及短路电流。多数动态功率是内部或外部电容向器件充、放电消耗的。如果器件驱动多个I/O负载,大量的动态电流构成总功耗的主要部分。 对设计中给定的驱动器,动态功耗由下式计算 p=CL×V 2 DD×f 式中,CL是电容负载,VDD是电源电压,f则是开关频率。总功耗是每个驱动器功耗之总和。 由于VDD是固定的,降低内部功耗就要降低平均逻辑开关频率,减少每个时钟沿处的逻辑开关总数、减少连线网络,特别是高频信号连线网络中的电容值。对低功率设计,需要从系统至工艺的每个设计级别中采取相应预防措施,级别越高,效果越好。[编辑本段]FPGA与CPLD的辨别和分类 FPGA与CPLD的辨别和分类主要是根据其结构特点和工作原理。通常的分类方法是: 将以乘积项结构方式构成逻辑行为的器件称为CPLD,如Lattice的ispLSI系列、Xilinx的XC9500系列、Altera的MAX7000S系列和Lattice(原Vantis)的Mach系列等。 将以查表法结构方式构成逻辑行为的器件称为FPGA,如Xilinx的SPARTAN系列、Altera的FLEX10K或ACEX1K系列等。[编辑本段]FPGA的应用 FPGA的应用可分为三个层面:电路设计,产品设计,系统设计1.电路设计中FPGA的应用 连接逻辑,控制逻辑是FPGA早期发挥作用比较大的领域也是FPGA应用的基石.事实上在电路设计中应用FPGA的难度还是比较大的这要求开发者要具备相应的硬件知识(电路知识)和软件应用能力(开发工具)这方面的人才总是紧缺的,往往都从事新技术,新产品的开发成功的产品将变成市场主流基础产品供产品设计者应用在不远的将来,通用和专用IP的设计将成为一个热门行业!搞电路设计的前提是必须要具备一定的硬件知识.在这个层面,干重于学,当然,快速入门是很重要的,越好的位子越不等人电路开发是黄金饭碗. 2.产品设计 把相对成熟的技术应用到某些特定领域如通讯,视频,信息处理等等开发出满足行业需要并能被行业客户接受的产品这方面主要是FPGA技术和专业技术的结合问题,另外还有就是与专业客户的界面问题产品设计还包括专业工具类产品及民用产品,前者重点在性能,后者对价格敏感产品设计以实现产品功能为主要目的,FPGA技术是一个实现手段在这个领域,FPGA因为具备接口,控制,功能IP,内嵌CPU等特点有条件实现一个构造简单,固化程度高,功能全面的系统产品设计将是FPGA技术应用最广大的市场,具有极大的爆发性的需求空间产品设计对技术人员的要求比较高,路途也比较漫长不过现在整个行业正处在组建”首发团队”的状态,只要加入,前途光明产品设计是一种职业发展方向定位,不是简单的爱好就能做到的!产品设计领域会造就大量的企业和企业家,是一个近期的发展热点和机遇 3.系统级应用 系统级的应用是FPGA与传统的计算机技术结合,实现一种FPGA版的计算机系统如用Xilinx V-4, V-5系列的FPGA,实现内嵌POWER PC CPU, 然后再配合各种外围功能,实现一个基本环境,在这个平台上跑LINIX等系统这个系统也就支持各种标准外设和功能接口(如图象接口)了这对于快速构成FPGA大型系统来讲是很有帮助的。这种”山寨”味很浓的系统早期优势不一定很明显,类似ARM系统的境况但若能慢慢发挥出FPGA的优势,逐渐实现一些特色系统也是一种发展方向。若在系统级应用中,开发人员不具备系统的扩充开发能力,只是搞搞编程是没什么意义的,当然设备驱动程序的开发是另一种情况,搞系统级应用看似起点高,但不具备深层开发能力,很可能会变成爱好者,就如很多人会做网页但不能称做会编程类似以上是几点个人开发,希望能帮助想学FPGA但很茫然无措的人理一理思路。这是一个不错的行业,有很好的个人成功机会。但也肯定是一个竞争很激烈的行业,关键看的就是速度和深度当然还有市场适应能力。

使用文本编辑器设计vhdl程序实验报告

只能说你好懒啊 你这就是要实验报告的吧

/etc下有相应的配置文件,进去可以设置

使用文本编辑器开发Python程序

sublime Text 2,win mac linux通用文本编辑器,最近很火,界面漂亮,功能强大,插件很多虽然不是开源的,可以一直试用,如果喜欢可以考虑买一个license开源的可以用notepad++。

如果你用过IDE的话,建议直接用IDE,原因如下:方便。python是开源的,如果碰到不懂得函数,想看API,可以快捷地查看。譬如在Pycharm中,按Ctrl+B可以查看,在eclipse中可以按F3查看该有的功能都有了,不用东找西找。例如:代码高亮、自动完成等等调试方便。IDE的推荐:推荐使用eclipse或pycharm。eclipse调试方便、输出中文没有乱码,pycharm除了输出不支持utf-8,别的都非常好。

简易文本编辑器程序设计

求一个简单的文本编辑器

一个简单的文本编辑器。(是在DEV C++下写的)//头文件//h#define CM_FILE_SAVEAS 9072#define CM_FILE_EXIT 9071#define CM_FILE_OPEN 9070#define CM_ABOUT 9069//主程序文件///*****************************************************/#include #pragma hdrstop#include "Mh"static char g_szClassName[] = "MyWindowClass";static HINSTANCE g_hInst = NULL;#define IDC_MAIN_TEXT 1001BOOL LoadFile(HWND hEdit, LPSTR pszFileName){ HANDLE hFile; BOOL bSuccess = FALSE; hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if(hFile != INVALID_HANDLE_VALUE) { DWORD dwFileSize; dwFileSize = GetFileSize(hFile, NULL); if(dwFileSize != 0xFFFFFFFF) { LPSTR pszFileText; pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1); if(pszFileText != NULL) { DWORD dwRead; if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL)) { pszFileText[dwFileSize] = 0; // Null terminator if(SetWindowText(hEdit, pszFileText)) bSuccess = TRUE; // It worked! } GlobalFree(pszFileText); } } CloseHandle(hFile); } return bSuccess;}BOOL SaveFile(HWND hEdit, LPSTR pszFileName){ HANDLE hFile; BOOL bSuccess = FALSE; hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if(hFile != INVALID_HANDLE_VALUE) { DWORD dwTextLength; dwTextLength = GetWindowTextLength(hEdit); if(dwTextLength > 0)// No need to bother if there's no { LPSTR pszText; pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1); if(pszText != NULL) { if(GetWindowText(hEdit, pszText, dwTextLength + 1)) { DWORD dwWritten; if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL)) bSuccess = TRUE; } GlobalFree(pszText); } } CloseHandle(hFile); } return bSuccess;}BOOL DoFileOpenSave(HWND hwnd, BOOL bSave){ OPENFILENAME ofn; char szFileName[MAX_PATH]; ZeroMemory(&ofn, sizeof(ofn)); szFileName[0] = 0; lStructSize = sizeof(ofn); hwndOwner = hwnd; lpstrFilter = "Text Files (*xt)\0*xt\0All Files (**)\0**\0\0"; lpstrFile = szFileName; MaxFile = MAX_PATH; lpstrDefExt = "txt"; if(bSave) { Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if(GetSaveFileName(&ofn)) { if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName)) { MessageBox(hwnd, "Save file ", "Error", MB_OK | MB_ICONEXCLAMATION); return FALSE; } } } else { Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; if(GetOpenFileName(&ofn)) { if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName)) { MessageBox(hwnd, "Load of file ", "Error", MB_OK | MB_ICONEXCLAMATION); return FALSE; } } } return TRUE;}LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){ switch(Message) { case WM_CREATE: CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL); SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0)); break; case WM_SIZE: if(wParam != SIZE_MINIMIZED) MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); break; case WM_SETFOCUS: SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT)); break; case WM_COMMAND: switch(LOWORD(wParam)) { case CM_FILE_OPEN: DoFileOpenSave(hwnd, FALSE); break; case CM_FILE_SAVEAS: DoFileOpenSave(hwnd, TRUE); break; case CM_FILE_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; case CM_ABOUT: MessageBox (NULL, "File Editor for Windows !\n Using the Win32 API" , "A", 0); } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0;}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ WNDCLASSEX WndClass; HWND hwnd; MSG Msg; g_hInst = hInstance; WndCbSize = sizeof(WNDCLASSEX); WndCstyle = 0; WndClpfnWndProc = WndProc; WndCbClsExtra = 0; WndCbWndExtra = 0; WndChInstance = g_hInst; WndChIcon = LoadIcon(NULL, IDI_APPLICATION); WndChCursor = LoadCursor(NULL, IDC_ARROW); WndChbrBackground = (HBRUSH)(COLOR_WINDOW+1); WndClpszMenuName = "MAINMENU"; WndClpszClassName = g_szClassName; WndChIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&WndClass)) { MessageBox(0, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL); return 0; } hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, g_szClassName, "A File Program", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 320, 240, NULL, NULL, g_hInst, NULL); if(hwnd == NULL) { MessageBox(0, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while(GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return MwParam;}

这是一个文本编辑器的源码:自己用MASM编译一下,肯定能用red_chr macro ;读取字符宏定义 mov ah,0 int 16hendmstring macro p1 ;输入字符光标 mov ah,9 lea dx,p1 int 21hendmwin macro opr1,opr2,opr3,opr4,opr5,opr6 ;建立窗口 mov ah,06h mov al,opr1 mov bh,opr2 mov ch,opr3 mov cl,opr4 mov dh,opr5 mov dl,opr6 int 10hendmpos_curse macro op1,op2,op3 ;定义光标位置 mov ah,2 mov bh,op1 mov dh,op2 mov dl,op3 int 10hendmpos_get macro ;显示光标位置 mov ah,03h mov bh,0 int 10hendmdata segment ;定义数据段 menu db 'File Edit Help $' mass_1 db 'F1 Active file F10 Active help','$' manu_1 db ' New ',13,10,'$' manu_2 db ' Open ',13,10,'$' manu_3 db ' Save ',13,10,'$' manu_4 db ' Save as ',13,10,'$' manu_5 db ' Exit ','$' handle dw ? message1 db ' Please input file name:','$' message2 db ' Please input save file name:','$' message3 db ' Please input open file name:','$' message4 db ' ***The file is not save! Save it now? (Y/N)***: ','$' path db 50 dup(0),'$' buffer db 2000 dup(?) bak db 3850 dup(0) line db ? row db ? char db ? help_mas1 db ' welcome use editor! $' ;帮助内容 help_mas2 db 'please the first active help! $' help_mas3 db 'good lucky!! $' help_mas4 db '==========================================================$' help_mas5 db 'Press F1 to active $' help_mas6 db 'You can use DOWN cursor key to choose the fuction $' help_mas7 db 'Press F10 to show the help Press Esc To Quit$' date db 'today ??/??/','$' ;调用日期 hanglie db '???//???','$' ;行//列data endscode segment main proc far ;主程序 assume cs:code,ds:datastart: push ds sub ax,ax push ax mov ax,data mov ds,ax call wind call edit retmain endpwind proc near ;创建窗口子程序 win 0,3eh,1,0,24,79 ;定义窗口背景 win 1,1fh,0,0,0,79 win 0,1fh,24,0,24,79show: ;显示菜单位置及内容 pos_curse 0,0,1 mov ah,9 lea dx,menu int 21hshow_2: ;显示状态栏位置及内容 pos_curse 0,24,1 mov ah,9 lea dx,mass_1 int 21h call win3 call win4 pos_curse 0,1,0 mov row,dh mov line,dlwind endpedit proc nearchar_get: ;读字符 call comcom proc near ;定义功能键 pos_get mov row,dh mov line,dlfirst: pos_curse 0,row,linej00: mov ah,0 int 16h ;从键盘读字符 ah=扫描码 al=字符码 push ax lea dx,buffer mov buffer[bx],al inc bx cmp ah,48h ;上 jz up_1 cmp ah,50h ;下 jz down_1 cmp ah,4bh ;左 jz left cmp ah,4dh ;右 jz right cmp ah,1ch ;回车 jz enter_1 call fuc_key mov ah,2 mov dl,al int 21h pop ax call menu_show jmp j6down_1: jmp downenter_1: jmp enter_2up_1: jmp upleft: ;光标左移 pos_get mov row,dh mov dl,line cmp line,0 jnz direct mov line,79 dec row cmp row,0 je stop2 jmp firststop2: mov row,1 jmp firstdirect: dec line call win4 ;显示光标位置 jmp firstright: ;光标右移 pos_get mov row,dh mov dl,line cmp line,79 jnz direct2 mov line,0 inc row cmp row,24 je returns1 jmp firstdirect2: inc line call win4 jmp firstenter_2: jmp enterup: ;上移光标 pos_get mov row,dh mov dl,line dec row cmp row,0 je stop1 call win4 jmp firststop1: mov row,1 jmp firstdown: ;下移光标 pos_get mov row,dh mov dl,line inc row cmp row,24 je stop3 call win4 jmp firststop3: mov row,23 jmp firstreturns1: jmp returnsenter: ;回车换行 pos_get mov row,dh mov line,dl inc row cmp row,24 je returns mov line,0 call win4 jmp firstreturns: mov row,24 mov line,0 jmp firstj6: retcom endpfuc_key proc near ;功能键子程序 next: cmp ah,47h ;home jz home cmp ah,4fh ;end jz _end cmp ah,0eh ;backspace jz bak_sp cmp ah,53h jz del cmp ah,44h ;F10 jz help_0 rethelp_0: call helphome: ;HOME键的功能 pos_get mov row,dh mov line,0 call win4 jmp first _end: ;END键的功能 pos_get mov row,dh mov line,79 call win4 jmp firstbak_sp: ;退格键的功能 pos_get mov row,dh mov line,dl cmp line,0 je stop dec line jmp abstop: mov line,0 ab: pos_get 0,row,line mov ah,2 mov dl,00 int 21h call win4 jmp firstdel: ;DEL删除 pos_get mov row,dh mov line,dl dec line pos_get 0,row,line mov ah,2 mov dl,00 int 21h inc line call win4 jmp firstcm: cmp line,00 jz pos_cmpos_cm: pos_curse 0,0,0 jmp firsthelp proc near ;显示帮助信息 call savedisplay ;显示帮助信息每行的位置 pos_get push dx win 0,57h,4,5,21,70 pos_curse 0,6,25 string help_mas1 pos_curse 0,8,11 string help_mas2 pos_curse 0,10,11 string help_mas3 pos_curse 0,12,11 string help_mas4 pos_curse 0,14,11 string help_mas5 pos_curse 0,16,11 string help_mas6 pos_curse 0,18,11 string help_mas7 pop dx pos_curse 0,dh,dl mov ah,0 int 16h cmp ah,36h ;F10 active help jnz cls call helpcls: win 0,1eh,9,10,13,70 ;清屏 call backdisplayhelp endp fuc_key endpmenu_show proc near ;显示菜单 call savedisplay push cx cmp ah,3bh ;F1功能 jz menu_sh jmp char_getmenu_sh: ;定义菜单的背景字体颜色 pos_get push dx win 0,06h,2,1,7,11 win 0,65h,1,0,6,10 pos_curse 0,1,0 string manu_1 string manu_2 string manu_3 string manu_4 string manu_5 pop dx dec dl pos_curse 0,dh,dlcopmar: red_chr cmp ah,50h jz manu_n jmp manu_hidmanu_hid: ;菜单隐藏 win 0,1eh,1,1,7,11 call backdisplay jmp char_getmanu_n: ;开始定义各个菜单项 win 0,65h,5,1,5,8 pos_curse 0,5,0 string manu_5 win 0,15h,1,1,1,8 pos_curse 0,1,0 string manu_1 red_chr cmp ah,48h je manu_n cmp al,0dh jz new_1 cmp ah,50h je manu_o jmp manu_hidmanu_n0: jmp manu_nmanu_o: win 0,65h,1,1,1,8 pos_curse 0,1,0 string manu_1 win 0,15h,2,1,2,8 pos_curse 0,2,0 string manu_2 red_chr cmp ah,48h je manu_o cmp al,0dh jz open_1 cmp ah,50h je manu_s jmp manu_hidnew_1: jmp new_2manu_s: win 0,65h,2,1,2,8 pos_curse 0,2,0 string manu_2 win 0,15h,3,1,3,8 pos_curse 0,3,0 string manu_3 red_chr cmp al,0dh jz save_1 cmp ah,48h je manu_s cmp ah,50h je manu_a jmp manu_hidopen_1: jmp open_2manu_n1: jmp manu_nmanu_a: win 0,65h,3,1,3,8 pos_curse 0,3,0 string manu_3 win 0,15h,4,1,4,8 pos_curse 0,4,0 string manu_4 red_chr cmp ah,1ch jz save_2 cmp ah,48h je manu_a cmp ah,50h je manu_e jmp manu_hidmanu_n2: jmp manu_n1new_2: jmp newsave_1: call savesave_2: call saveasmanu_e: win 0,65h,4,1,4,8 pos_curse 0,4,0 string manu_4 win 0,15h,5,1,5,8 pos_curse 0,5,0 string manu_5 red_chr cmp ah,50h je manu_n2 cmp ah,48h je manu_e cmp ah,1ch je exit jmp manu_hidexit: call backdisplay win 0,07h,15,10,17,61 win 0,24h,14,9,16,60 mov dh,15 mov dl,9 mov bh,0 mov ah,2 int 10h lea dx,message4 mov ah,9 int 21h mov ah,1 int 21h cmp al,79h jnz q call quittq: cmp al,6eh jz quitquit: win 0,07h,0,0,24,79 pos_curse 0,0,0 mov ah,4ch int 21h retmenu_show endpnew proc near ;新建文件 pos_get push dx call backdisplay win 0,07h,15,10,17,61 win 0,24h,14,9,16,60, mov dh,15 mov dl,9 mov bh,0 mov ah,2 int 10h lea dx,message1 cmp al,0dh mov ah,9 int 21h mov bx,0all: mov ah,1 int 21h cmp al,0dh je alll mov path[bx],al inc bx jmp allalll: win 0,3eh,15,9,17,61 pop dx pos_curse 0,dh,dl lea dx,path mov ah,3ch mov cx,00 int 21h mov handle,ax mov bx,ax mov ah,3eh int 21h win 0,3eh,1,0,23,79 mov dh,1 mov dl,0 mov bh,0 mov ah,2 int 10h jmp char_getnew endpopen_2: jmp opensaveas proc near ;另存为文件 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; win 0,3eh,1,0,6,10 call backdisplay win 0,07h,15,10,17,61 win 0,24h,14,9,16,60, mov dh,15 mov dl,9 mov bh,0 mov ah,2 int 10h lea dx,message2 mov ah,9 int 21h mov bx,0bll: mov ah,1 int 21h cmp al,0dh je blll mov path[bx],al inc bx jmp bllblll: pos_get push dx win 0,3eh,1,0,23,79 call backdisplay pop dx pos_curse 0,dh,dl lea dx,path mov ah,3ch mov cx,00 int 21h mov handle,ax lea dx,buffer mov bx,handle mov cx,2000 mov ah,40h int 21h mov bx,handle mov ah,3eh int 21h call backdisplay jmp char_getsaveas endpopen proc near ;打开文件 call backdisplay win 0,07h,15,10,17,61 win 0,24h,14,9,16,60 mov dh,15 mov dl,9 mov bh,0 mov ah,2 int 10h lea dx,message3 mov ah,9 int 21h mov bx,0cll: mov ah,1 int 21h cmp al,13 je clll mov path[bx],al inc bx jmp cllclll: win 0,3eh,1,0,23,79 lea dx,path mov ah,3dh mov al,0 int 21h mov handle,ax lea dx,buffer mov bx,handle mov cx,2000 mov ah,3fh int 21h win 0,3eh,1,23,1,79 mov dh,1 mov dl,0 mov bh,0 mov ah,2 int 10h mov cx,1000 sub bx,bxreplay: mov dl,buffer[bx] inc bx mov ah,2 int 21h loop replay mov bx,handle mov ah,3eh int 21h mov dh,1 mov dl,0 mov bh,0 mov ah,2 int 10h mov cx,10 mov bx,0cleapath_3: mov bl,0 mov path[bx],bl loop cleapath_3 jmp char_getopen endpsave proc near ;保存文件 pos_get push dx win 0,3eh,1,0,6,10 call backdisplay mov ah,path cmp ah,21h jl j_3 jmp j_4j_3: win 0,07h,15,10,17,61 win 0,24h,14,9,16,60, mov dh,15 mov dl,9 mov bh,0 mov ah,2 int 10h lea dx,message2 mov ah,9 int 21h mov bx,0dll: mov ah,1 int 21h cmp al,0dh je dlll mov path[bx],al inc bx jmp dlldlll: win 0,3eh,1,0,23,79 pop dx pos_curse 0,dh,dl j_4: lea dx,path mov ah,3ch mov cx,00 int 21h mov handle,ax lea dx,buffer mov bx,handle mov cx,2000 mov ah,40h int 21h mov bx,handle mov ah,3eh int 21h call backdisplay jmp char_getsave endpsavedisplay proc near push ax push bx push cx push dx push ds mov ax,0002h int 33h mov bx,0d mov cx,3840dloop1: mov ax,0b800h mov ds,ax mov dl,ds:[bx] mov ax,data mov ds,ax mov bak[bx],dl inc bx loop loop1 mov ax,0001h int 33h pop ds pop dx pop cx pop bx pop axsavedisplay endpbackdisplay proc near push ax push bx push cx push dx push ds mov bx,0d mov cx,3840dloop11: mov ax,data mov ds,ax mov dl,bak[bx] mov ax,0b800h mov ds,ax mov ds:[bx],dl inc bx loop loop11 pop ds pop dx pop cx pop bx pop ax retbackdisplay endpquitt proc near ;退出 call backdisplay win 0,07h,15,10,17,61 win 0,24h,14,9,16,60, mov dh,15 mov dl,9 mov bh,0 mov ah,2 int 10h lea dx,message2 mov ah,9 int 21h mov bx,0qll: mov ah,1 int 21h cmp al,0dh je qlll mov path[bx],al inc bx jmp qllqlll: win 0,07h,15,10,17,61 win 0,3eh,14,9,16,60 call backdisplay lea dx,path mov ah,3ch mov cx,00 int 21h mov handle,ax lea dx,buffer mov bx,handle mov cx,2000 mov ah,40h int 21h mov bx,handle mov ah,3eh int 21h call backdisplay win 0,07h,0,0,24,79 mov ah,4ch int 21h retquitt endpedit endp win3 proc near ;显示日期 mov ah,2ah int 21h mov bl,10d mov ax,0 mov al,dh div bl add ax,3030h mov [date+6],al mov [date+7],ah mov ax,0 mov al,dl div bl add ax,3030h mov [date+9],al mov [date+10],ah win 0,1dh,0,67,0,79 pos_curse 0,0,67 mov dx,offset date mov ah,09h int 21h retwin3 endpwin4 proc near ;显示行//列 mov ah,03h mov bh,0 int 10h mov bl,100d mov bh,10d mov ax,0 mov al,dh div bl add al,30h mov [hanglie+0],al mov al,ah mov ah,0 div bh add ax,3030h mov [hanglie+1],al mov [hanglie+2],ah mov ax,0 mov al,dl div bl add al,30h mov [hanglie+5],al mov al,ah mov ah,0 div bh add ax,3030h mov [hanglie+6],al mov [hanglie+7],ah win 0,1dh,24,60,24,70 pos_curse 0,24,61 mov dx,offset hanglie mov ah,09h int 21h retwin4 endpcode ends end start ;结束 文档我也不会写,不好意思还是你自己搞定吧

使用文本编辑器python源文件程序

1、python源代码可以在Windows记事本中编辑新建一个记事本文件写入python程序,然后将文本文件的后缀名改为py即可。2、在python自带idle中编辑源代码在python自带idle界面点击file-new file新建一个python文件,然后即可编辑python源程序3、使用常见的编辑器如Sublime Text、VS Code、PyCharm等编辑python源文件。更多Python知识请关注Python自学网

Python文本编辑器就是能够用来编辑Python代码的文本编辑器。在Python的交互式命令行写程序,优点是一下就能得到结果,而坏处就是没办法保存,如果下次想要继续运行的话,需要再次敲打一遍。所以实际的开发过程中,我们总是使用一个本文编辑器来编写代码,写完之后将它保存为一个文件,这样程序就可以反复使用了。Python常见文本编辑器推荐:第一个是sublime Text,免费使用,但是不付费会弹出提示框,且需要每次手动保存文件,汉化或热更需要下载插件才可以;第二个是Notepad++,免费使用,有中文界面;当然你也可以使用webstorm,可以自动保存文件,但是占用内存比较大。

相关百科

热门百科

首页
发表服务