历史上的今天
返回首页

历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2021年10月21日 | 【自学51单片机】6 ---数码管动态显示、中断系统介绍

2021-10-21 来源:eefocus

1、数码管的动态显示

1.1 动态显示基本原理

静态显示:通过三八译码器控制一个数码管显示数值。

动态显示:又称动态扫描,通过轮流点亮数码管(一个时刻只有一个点亮),利用人眼视觉的余晖效应,让人看数码管看起来全部点亮。


如何实现动态显示? 把数码管的整体扫描时间(整体扫描时间 =单个数码管点亮时间*数码管个数)限定在10ms以内即可。当刷新频率大于100HZ,即刷新时间小于10ms,就可做到无闪烁。设计程序时选一个接近10ms,又比较规整的值就可。


1.2 数码管动态显示秒表(0~999999)

程序流程图

程序流程图

程序

#include


sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned char code LedChar[] = { //数码管显示字符转换表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};


unsigned char LedBuff[] = { //数码管显示缓冲区,初值0xFF确保启动时都不亮

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};


void main()

{

unsigned int cnt = 0;  //记录定时器溢出次数

unsigned long sec = 0; //记录经过秒数

unsigned char i = 0;  //动态扫描的索引


ENLED = 0; //使能U3,选择控制数码管

ADDR3 = 1; //因为需要改变ADDR0-2的值,所以不需要再初始化

TMOD = 0x01;//设置T0为模式一

TH0 = 0xFC;//为TO赋初值0xFC67,定时1ms

TL0 = 0x67;

TR0 = 1; //启动T0


while(1)

{

if(TF0 == 1)//判断T0是否溢出

{

TF0 = 0; //T0溢出后,清零中断标志

TH0 = 0xFC;//为TO重新赋值

TL0 = 0x67;

cnt++; //计数值加一

    if(cnt >= 1000)//判断T0是否溢出1000次

{

cnt = 0;  //溢出10000次后计数值清零

sec++; //秒数自加一

//以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

LedBuff[4] = LedChar[sec/10000%10];

LedBuff[5] = LedChar[sec/100000%10];

}

//以下代码完成数码管的动态扫描刷新

switch(i)

{

case 0: ADDR2=0;ADDR1=0;ADDR0=0;P0 = LedBuff[0];i++;break;

case 1: ADDR2=0;ADDR1=0;ADDR0=1;P0 = LedBuff[1];i++;break;

case 2: ADDR2=0;ADDR1=1;ADDR0=0;P0 = LedBuff[2];i++;break;

case 3: ADDR2=0;ADDR1=1;ADDR0=1;P0 = LedBuff[3];i++;break;

case 4: ADDR2=1;ADDR1=0;ADDR0=0;P0 = LedBuff[4];i++;break;

case 5: ADDR2=1;ADDR1=0;ADDR0=1;P0 = LedBuff[5];i=0;break;

default: break;

}

}

}   

}


1.3 数码管显示的消隐

上面程序控制数码管的动态显示秒表会出现两大问题,一个是数码管的鬼影问题(数码管不该发亮的段,微微发亮),另一个是数码管的抖动问题(数码管数字变化时,不参加变化的2数码管出现抖动)。


1.3.1数码管显示的鬼影成因及解决办法

成因:主要由于数码管的位选和段选产生的瞬态。比如在上面的动态显示程序中,case 5要转换到case 0的时候,假如case 5对应数码管值为0,case 1对应数码管的值为1,因为c语言语句执行需要一定的时间,在case 5的位选用ADDR0=1;ADDR1 =0;ADDR2 = 1;转换为case 0的位选用ADDR0=0;ADDR1 =0;ADDR2 = 0;时,就会出现位选用中间状态的瞬间ADDR0=1;ADDR1 =0;ADDR2 = 1;,在这瞬间,会给csae 4对应数码管DS5瞬间赋值一个0。当case的位选用转换成功后,因为P0还没执行,而P0保持上一个值,在这瞬间case 0 对应数码管DS1赋值一个0。这两个瞬间都产生了鬼影。

解决方案:(1). 刷新之前关闭所有的段,改变好位选用后,再打开所有的段。只需在上面动态显示程序中在switch(i)语句前一句加上P0=0xFF;语句即可在解决鬼影问题。(2). 刷新之前关闭所有的位,赋值过程都做好,再重新打开所有的位。只需要上面动态显示程序中在switch(i)语句前一句加上ENLED=1;,在switch(i)语句后一句加上ENLED=0;即可解决鬼影问题。


1.3.2 数码管显示的抖动成因及解决办法

成因:在上面的动态显示程序中,由于程序每次定时到1s时,会执行 “秒数+1并转化为数码管显示字符” 的操作,因为这段代码比较耗时间,就会导致某个数码管点亮时间为1ms+该程序执行时间,而下一个数码管的点亮时间就变为1ms - 该程序运行时间。这就是数码管显示抖动的成因。


解决办法:运用中断机制即可解决该问题,下面来介绍单片机中断系统。


2、单片机的中断系统

2.1 中断系统的引入

当单片机专心的做一件事(比如打游戏)的时候,突然有一件或多件紧急的事(比如水开了)要去处理,应该先停下这件事(打游戏),先去处理紧急的事(水开了)。这就应用了单片机中断系统,利用中断处理突发情况,让单片机能够同时“完成”多项任务。


2.2定器中断模块应用

2.2.1中断系统的IE-中断使能寄存器

标准51单片机控制中断模块有两个寄存器,一个是中断使能寄存器,另一个是中断优先级寄存器。下面来介绍IE-中断使能寄存器。

上表为IE-中断使能寄存器的位分配

讲解:中断使能寄存器 IE 的位 0~5 控制了 6 个中断使能,第 6 位没有用到,第 7 位是总开关,而0 ~ 5 位为分开关,只要用到中断,就要写EA=1打开总开关


2.2.1数码管动态显示秒表消隐程序及讲解

#include


sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned char code LedChar[] = { //数码管显示字符转换表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};


unsigned char LedBuff[] = { //数码管显示缓冲区,初值0xFF确保启动时都不亮

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};


unsigned char flagls = 0; //1s定时标志

unsigned int cnt = 0; //记录T0中断次数

unsigned char i = 0;  //动态扫描索引

unsigned long sec = 0; //记录经过的秒数


void main()

{

ENLED = 0; //使能U3

ADDR3 = 1; //因为需要动态改变ADDR0-2的值,所以不需要在初始化了

EA = 1;    //使能总中断

TMOD = 0x01; //设置T0为模式一

TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms

TL0 = 0x67;

ET0 = 1;  //使能T0中断

TR0 = 1;  //开启T0


while(1)

{

if(flagls == 1) //判断1s定时标志

{

flagls = 0; //1秒定时标志清零

sec++;//秒计数自动加一

//以下代码将sec按十进制从低位到高依次提取并转为数码管显示字符

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

LedBuff[4] = LedChar[sec/10000%10];

LedBuff[5] = LedChar[sec/100000%10];

}

}

}


//定时器T0中断服务函数

void InterruptTimer0() interrupt 1

{

TH0 =0xFC;//重新为T0赋值

TL0 = 0x67;

cnt++;//中断次数加一

   if(cnt >= 1000)//中断1000次,即1s


   {

    cnt = 0; //清零计数值以重新开始以1秒计时

flagls = 1;//设置1秒定时标志为1

   }

   //以下代码完成数码管的动态扫描刷新

   P0 = 0xFF; //消除数码管鬼影

   switch(i)

   {

    case 0: ADDR2=0;ADDR1=0;ADDR0=0;P0=LedBuff[0];i++;break;

case 1: ADDR2=0;ADDR1=0;ADDR0=1;P0=LedBuff[1];i++;break;

case 2: ADDR2=0;ADDR1=1;ADDR0=0;P0=LedBuff[2];i++;break;

case 3: ADDR2=0;ADDR1=1;ADDR0=1;P0=LedBuff[3];i++;break;

case 4: ADDR2=1;ADDR1=0;ADDR0=0;P0=LedBuff[4];i++;break;

case 5: ADDR2=1;ADDR1=0;ADDR0=1;P0=LedBuff[5];i=0;break;

default: break;

   }

}


(注:无需用软件清零中断标志TF0,进入定时器中断时硬件自动清零)


中断服务函数:程序 有两个函数,一个main主函数,另一个为中断服务函数,中断函数命名格式:函数值类型 + 函数名 +(形式参数列表)+ interrupt + x 。interrupt为中断函数关键字,一定不能错,x的值如何取?先见下表

表中第二行T0中断,使能T0中断,就要将ET0置1,当它的中断标志位TF0变为1时,就会触发T0中断,这时就会进入中断服务函数,单片机通过x计算出中断向量地址找到对应的中断服务函数(x * 8 + 3 = 中断向量地址(转换为十进制数据计算)) 。


解决数码管抖动:上面函数应用了定时器中断机制,比如100行程序,当程序执行到50行时,定时器刚好溢出,程序就会立刻进入中断函数,执行完中断函数语句后,回到刚才的第50行继续执行下面程序。这就保证每个数码管动态扫描时都点亮1ms,也就解决了数码管抖动问题。


2.3 中断优先级

中断优先级有两种:一种是抢占优先级,另一种是固有优先级。


抢占优先级:低优先级中断执行时,如又发生了高优先级的中断,则立刻进入高优先级中断执行,处理完高优先级级中断后,再返回处理低优先级中断,这个过程就叫做中断嵌套,也称为抢占。抢占优先级的概念:优先级高的中断可以打断优先级低的中断的执行,从而形成嵌套,而优先级低的中断是不能打断优先级高的中断的。见下表说明如何设置抢占优先级。

IP寄存器每一位复位值为0,当把某一位设置为1时,这一位的优先级就高于其他位。

固有优先级:在表6-3中最后一列列出了中断固有优先级,数字越小优先级越高。固有优先级不具有有抢占性,即使在执行低优先级中断又发生了高优先级中断,高优先级中断也要等低优先级中断执行完后才会得到响应。作用:在无抢占优先级下,仲裁同时存在的多个中断。


3、数码管动态显示消隐程序

该程序位数码管动态显示消隐只显示有效位,不显示高位的0。

#include


sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned char code LedChar[] = { //数码管显示字符转换表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};


unsigned char LedBuff[6] = { //数码管显示缓冲区,初值0xFF确保启动时都不亮

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};


unsigned char flagls = 0; //1s定时标志

unsigned int cnt = 0; //记录T0中断次数

unsigned char i = 0;  //动态扫描索引

unsigned long sec = 0; //记录经过的秒数


void main()

{

ENLED = 0; //使能U3

ADDR3 = 1; //因为需要动态改变ADDR0-2的值,所以不需要在初始化了

EA = 1;    //使能总中断

TMOD = 0x01; //设置T0为模式一

TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms

TL0 = 0x67;

ET0 = 1;  //使能T0中断

TR0 = 1;  //开启T0


while(1)

{

if(flagls == 1) //判断1s定时标志

{

flagls = 0; //1秒定时标志清零

sec++;//秒计数自动加一

//以下代码将sec按十进制从低位到高依次提取并转为数码管显示字符

if(sec > 0 && sec < 10) //秒数小于10s显示数码管显示1位字符

{

LedBuff[0] = LedChar[sec%10];

}

else if(sec <100)//秒数小于100s显示数码管显示2位字符

{

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

}

else if(sec < 1000) //秒数小于1000s显示数码管显示3位字符

{

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

}

else if(sec < 10000)//秒数小于10000s显示数码管显示4位字符

{

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

}

else if(sec < 100000) //秒数小于100000s显示数码管显示5位字符

{

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

LedBuff[4] = LedChar[sec/10000%10];

}

else //秒数小于1000000s显示数码管显示6位字符

{

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

LedBuff[4] = LedChar[sec/10000%10];

LedBuff[5] = LedChar[sec/100000%10];

}

}

}

}


//定时器T0中断服务函数

void InterruptTimer0() interrupt 1

{

TH0 =0xFC;//重新为T0赋值

TL0 = 0x67;

cnt++;//中断次数加一

   if(cnt >= 1000)//中断1000次,即1s


   {

    cnt = 0; //清零计数值以重新开始以1秒计时

flagls = 1;//设置1秒定时标志为1

   }

   //以下代码完成数码管的动态扫描刷新

   P0 = 0xFF; //消除数码管鬼影

   switch(i)

   {

    case 0: ADDR2=0;ADDR1=0;ADDR0=0;P0=LedBuff[0];i++;break;

case 1: ADDR2=0;ADDR1=0;ADDR0=1;P0=LedBuff[1];i++;break;

case 2: ADDR2=0;ADDR1=1;ADDR0=0;P0=LedBuff[2];i++;break;

case 3: ADDR2=0;ADDR1=1;ADDR0=1;P0=LedBuff[3];i++;break;

case 4: ADDR2=1;ADDR1=0;ADDR0=0;P0=LedBuff[4];i++;break;

case 5: ADDR2=1;ADDR1=0;ADDR0=1;P0=LedBuff[5];i=0;break;

default: break;

   }

}


数码管动态显示消隐倒计时程序

#include


sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned char code LedChar[] = { //数码管显示字符转换表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};


unsigned char LedBuff[] = { //数码管显示缓冲区,初值0x90确保启动时都显示字符9

0x90, 0x90, 0x90, 0x90, 0x90, 0x90

};


unsigned char flagls = 0; //1s定时标志

unsigned int cnt = 0; //记录T0中断次数

unsigned char i = 0;  //动态扫描索引

unsigned long sec = 999999; //记录经过的秒数


void main()

{

ENLED = 0;//使能U3

ADDR3 = 1;//因为需要动态改变ADDR0-2的值,就不用初始化这些值

EA = 1; //使能总中断

TMOD = 0x10; //配置T1为模式一

TH1 = 0xFC; //为T1赋初值0xFC67,定时1ms

TL1 = 0x67;

ET1 = 1; //使能T1中断

TR1 = 1;//开启T1


while(1)

{

if(flagls == 1) //判断1s定时单位

{

flagls = 0;//1s定时标志清零

sec--; //将倒计时时间减一

//以下代码将sec按十进制从高位到低依次提取并转为数码管显示字符

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

LedBuff[4] = LedChar[sec/10000%10];

LedBuff[5] = LedChar[sec/100000%10];

}

}

}


void InterruptTimer1() interrupt 3 //T1中断函数编号为3

{

TH1 = 0xFC; //为T1赋初值0xFC67,定时1ms

TL1 = 0x67;

cnt++;//中断一次计数值加一

if(cnt >= 1000) //判断是否中断1000次,即定时1s

{

cnt = 0; //清零计数值,重新计数

flagls = 1;//将1s定时标志置1

}

//以下代码完成数码管的动态扫描刷新

P0 = 0xFF; //消除数码管鬼影

switch(i)

{

case 0: ADDR2=0;ADDR1=0;ADDR0=0;P0=LedBuff[0];i++;break;

case 1: ADDR2=0;ADDR1=0;ADDR0=1;P0=LedBuff[1];i++;break;

case 2: ADDR2=0;ADDR1=1;ADDR0=0;P0=LedBuff[2];i++;break;

case 3: ADDR2=0;ADDR1=1;ADDR0=1;P0=LedBuff[3];i++;break;

case 4: ADDR2=1;ADDR1=0;ADDR0=0;P0=LedBuff[4];i++;break;

case 5: ADDR2=1;ADDR1=0;ADDR0=1;P0=LedBuff[5];i=0;break;

default: break;

}

}

推荐阅读

史海拾趣

Acme Electric Corporation公司的发展小趣事

Acme Electric Corporation是一家专注于生产变压器和电源设备的公司。以下是该公司发展的五个相关故事:

  1. 公司成立和初期发展: Acme Electric Corporation成立于1958年,总部位于美国威斯康星州。公司最初是一家小规模的家庭企业,致力于生产各种类型的变压器和电源设备,主要用于工业、商业和农业应用。

  2. 技术创新和产品扩展: 随着市场需求的增长和技术进步,Acme Electric Corporation不断进行技术创新,并扩展了产品线。公司推出了一系列高性能、高效率的变压器和电源设备,包括控制变压器、隔离变压器、电源逆变器等,满足不同客户的需求。

  3. 市场拓展和客户合作: Acme Electric Corporation积极开拓国内外市场,并与各行各业的客户建立了合作关系。公司的产品被广泛应用于制造业、电力行业、建筑业等领域,为客户提供稳定可靠的电源解决方案。同时,Acme Electric Corporation与客户密切合作,根据客户的需求定制产品,提供个性化的服务。

  4. 质量控制和生产管理: Acme Electric Corporation注重产品质量和生产管理,采用先进的生产设备和严格的质量控制体系,确保产品的稳定性和可靠性。公司拥有一支专业的研发团队和生产团队,不断改进工艺流程,提升产品质量和生产效率。

  5. 未来发展展望: Acme Electric Corporation将继续致力于变压器和电源设备领域的研发和生产,不断推出更先进、更可靠的产品和解决方案,以满足客户在各个领域的需求。公司将加强国际市场拓展,提升自身在全球市场的竞争力,为行业的发展做出更大的贡献。

巴丁微公司的发展小趣事

巴丁微积极参与各类电子行业的展会和交流活动,以此展示公司的技术实力和产品优势。在CITE2023第十一届中国电子信息博览会上,巴丁微向大家展示了其在电机驱动芯片在智能锁、气表、水表、个人护理及智能垃圾桶等领域的应用案例,吸引了大量专业人士和行业客户的关注。

通过展会,巴丁微不仅成功展示了公司的最新技术和产品,还加强了与业界同仁的交流与合作,进一步提升了公司在行业内的知名度和影响力。

Davies Molding公司的发展小趣事

Davies Molding公司在追求经济效益的同时,始终关注社会责任和可持续发展。公司积极参与环保公益活动,推动绿色生产,降低对环境的影响。此外,Davies Molding公司还注重员工福利和社会公益事业,为员工提供良好的工作环境和发展空间,为社会做出积极贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

ERGOBAHCO公司的发展小趣事

在快速发展的同时,ERGOBAHCO公司始终不忘履行社会责任和推动可持续发展。公司积极参与社会公益事业,捐款捐物支持贫困地区的教育、医疗等事业。同时,ERGOBAHCO公司还注重环保和节能减排工作,通过引进先进的环保技术和设备,实现了生产过程的绿色化、低碳化。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

GSI Technology公司的发展小趣事

随着电子行业的快速发展,GSI Technology积极寻求新的市场机会。公司凭借其高性能存储器产品在军事、医疗、汽车等领域的应用优势,成功进军这些新兴市场。同时,GSI还积极与行业内其他企业建立战略合作关系,共同推动技术创新和市场拓展。例如,GSI与某知名汽车制造商合作,为其开发定制化的高性能存储器解决方案,有效提升了汽车智能化水平。

Delus Corp公司的发展小趣事

Delus Corp公司起源于一家小型电子初创企业,专注于研发和生产特定领域的电子设备。在公司成立初期,团队面临资金短缺和技术挑战等重重困难。然而,他们凭借对技术的执着追求和对市场的敏锐洞察,成功研发出一款具有创新性的电子产品,该产品在市场上引起了广泛关注。这款产品不仅帮助公司获得了初始资金,也奠定了公司在电子行业的技术领先地位。

问答坊 | AI 解惑

Power架构再添创新动力,IBM微处理器协作平台在华启动

IBM日前在上海举行典礼,与合作伙伴和各界代表共同见证了全球首个Power架构专用协作创新平台——IBM Power架构应用中心的启用。该中心将围绕IBM Power架构处理器技术,通过与Power.org全球及本地的合作伙伴及研究机构等多方进行共同协作,帮助客户 ...…

查看全部问答>

现场仿真

由于PLC的现场应用需要进行调试,而现场调试通常成本较高,而且不容易建立调试所需的故障,所以现场调试经常不够充分,使得事后维护繁琐。 今年我采用了现场仿真,大大简化了现场工作。基本方法如下: 对于小型PLC,仿真方法有两种: 1。外接式 用 ...…

查看全部问答>

嵌入式视频图像压缩模块的USB接口设计

摘要:本文介绍了一种嵌入式视频图像压缩模块的USB接口设计方案,给出了该系统的硬件实现方案以及USB控制芯片CY7C68013在系统中的应用,并编写了USB固件程序、嵌入式操作系统Windows CE.net下的USB驱动程序和应用程序。 关键词:视频压缩;固件程 ...…

查看全部问答>

PLC视频资料

大家想了解更多PLC知识或PLC视频教学。请登陆WW .PLCJS.COM…

查看全部问答>

求助一个弱弱的问题。。。

如果做一个数字电压表,它的量程是由AD的输入电压量程决定的吗?如何增大量程呢?…

查看全部问答>

单片机实现T9文字输入法电路(源代码+仿真)

单片机实现T9文字输入法电路(源代码+仿真)…

查看全部问答>

Streaming Minidriver中如何使用中断的延迟过程调用

初学驱动开发,在testcap例子的基础上针对硬件做修改。中断服务程序已经能正常响应了,但是不知道怎样设置延迟过程调用。在DeviceExtension中定义DPC对象指针,初始化设备时初始化DPC,然后在ISR中调用IoRequestDpc。结果每次运行到这里就蓝屏了。 ...…

查看全部问答>

一个evc设置窗体大小函数添加位置的问题?

刚开始用evc,弱弱的问下:在evc中为什么把setwindowpos这个函数放在oncreate函数中就不起作用,而放在oninit函数中就好用呢?我再vc6.0中写再oncreate函数中也起作用啊? 求高手指点1~2~…

查看全部问答>

5.1的选择<<<世界500强公司在上海职位介绍>>>

福利体系:18% 住房补贴,7% 交通补贴+600,年底双薪,年终2.5-3个月工资 奖金,另外每年3000元左右 现金保单,30万 人生意外险和重大疾病险。 公司为个人缴纳的保险分为两种形式,如果有居住证或户口在上海的,公司缴纳城保,那么住房补贴是四金 ...…

查看全部问答>

使用vivi不能将wince烧写到flash!

我使用vivi的load flash wince u命令,将wince烧写到板上的flash时,格式化的时候出现几个error, 然后也正常格式化完毕,刚刚把wince烧写到板上时,wince正常启动,因为我没有断过电, 重启之后flash上刚刚烧写的wince就不见了,不能正常启动 ...…

查看全部问答>