单片机计算器(重理工大二课程设计)计算范围-4294967295至+4294

更新时间:2024-04-08 05:36:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程:电子综合设计实验

项目:计算器

学期:2011.2~2011.7

学院:电子信息与自动化学院 专业: 自动化 班级: 713 姓名: 王瀚兴 学号: 10807010325 指导教师: 陈古波

电工电子技术实验中心

一、设计任务和目标

1.1 设计任务

利用单片机设计一个计算器,要求

(1)键盘包含加、减、乘、除及数字键。

(2)能够显示输入数字并显示公式,计算结果。 (3)四种运算都可以实现。

1.2 性能指标

(1)单片机程序设计使用KeilC51实现。编译器使用long int,因此运算范围为±2147483648,并且浮点数精度总是15位。如果数据溢出,自动提示溢出错误信息。

(2)可运算加、减、乘、除在内的四种运算。包括显示正数与负数。除零错误将自动提示。显示公式。

(3)ON键用于清空并重新输入。

二、设计方案

按照单片机设计功能的要求,初步确定硬件系统由主控模块,显示模块,键扫描电路模块等组成。电路构成框图如图2-1所示。主控芯片使用51系列AT89C52单片机,该单片机采用高性能静态89C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能,低功耗8位CMOS处理芯片,市场应用很多。

图2-1 计算器电路构成原理图

软件系统由键盘扫描模块、数据计算模块、数据纠错模块、数据显示模块等构成。

三、系统硬件设计

3.1单片机最小系统

单片机最小系统就是支持主芯片正常工作的最小部分,包括主控芯片和晶振电路部分。

主控芯片选取STC89C52RC芯片,因其具有良好的性能和稳定性,价格便宜使用方便。 晶振选用1MHZ,晶振旁电容选用1pf。 下面是单片机最小系统的电路图:

图3-1单片机最小系统电路图

3.2键盘接口电路

计算器所需按键有 数字键: “0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”。 功能键:“+”、“-”、“×”、“÷”、“=”、“ON(清零)”。

共计16个按键,行列均连接有公共端,连接至单片机的P3.0—P3.7端口。这样扫描P3口就可以完成对所有键盘的扫描,通过对16个按键的编码,从而得到键盘端口地址。分别进行行扫描和列扫描,确定按键,经过单片机处理后输入数据至LED显示屏,完成了键盘的功能。

下面为键盘接口电路图。

图3-2键盘接口电路

3.3数码显示电路

数码显示电路采用的是LM016L显示器。 基本参数及引脚功能

1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:

1602LCD尺寸图

1602LCD主要技术参数: 显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H) 引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:

编符 引脚说明 编 符 引脚说明 号 号 号 号

1 V9 D2 电源地 数据

S S 2 V10 D3 电源正极 数据

D D 3 V11 D4 液晶显示偏压 数据

L 4 RS 12 D5 数据/命令选择 数据 5 R/ 13 D6 读/写选择 数据

W 6 E 14 D7 使能信号 数据 7 D0 15 BL 背光源正极 数据

A

8 D1 16 BL 背光源负极 数据

K

表10-13:引脚接口说明表 第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。 2LCD的指令说明及时序

1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:

RRDDDDDD序指令

D0

S /W 7 6 5 4 3 2 1 号

1 0 0 0 0 0 00 0 1 清显示 2 0 0 0 0 0 00 1 * 光标返回

I/置输入模

3 0 0 0 0 0 00 S

D 式

显示开/关

4 0 0 0 0 0 01 C B

控制 光标或字

S

5 0 0 0 0 0 1/* * 符移位

/C

L

D置功能

6 0 0 0 0 1 N * *

L

置字符发字符发生存贮器地址

7 0 0 0 1

生存贮器地址

置数据存显示数据存贮器地址

8 0 0 1

贮器地址

B读忙标志计数器地址

9 0 1

F 或地址

写数到要写的数据内容

1

1 0 CGRAM或

0

DDRAM)

从读出的数据内容

1

1 1 CGRAM或

1

DDRAM读数 表10-14:控制命令表

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

图 字符代码与图形对应表 下面为数码显示电路电路图。

图3-3数码显示电路

四、系统软件设计

4.1键盘扫描程序设计

要进行数据计算就需要先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对按键进行扫描,从而确定是哪个按键按下了。

按键扫描的程序代码非常清晰易懂,并且写好了注释。下面是源代码。

//按键处理命令 //获取按键位置//16为无按键按下 uchar KeyPosRowScan()//返回行扫描结果

{

uchar Temp=0;//扫描状态暂存。 uchar Row;//行号 P3=0x0f;

Temp=P3;//暂存P2状态 for(Row=0;Row<4;Row++)

if(Temp!=0x0f)//若有按键按下 {

if(RowScan[Row]==Temp) return Row; }

return 4;//无按键按下 }

uchar KeyPosLineScan()//返回列扫描结果 {

uchar Temp=0;//扫描状态暂存。 uchar Line;//列号。 P3=0xf0;

Temp=P3;//暂存P2状态 for(Line=0;Line<4;Line++)

if(Temp!=0xf0)//若可能有按键按下 {

if(LineScan[Line]==Temp)return Line; }

return 4;//无按键按下 }

uchar KeyPosScan()//返回按键位置 {

return KeyPosRowScan()*4+KeyPosLineScan(); }

调用的时候只需调用uchar KeyPosScan()函数即可返回按键位置,若无按键按下,由于KeyPosRowScan()返回4,KeyPosLineScan()返回4,故该函数返回20,代表无按键按下。

如有任何按键按下,函数将按行列返回按键位置值为0-15。

但是为解释位置的真正数值是多少,需要写一个位置按键的解释程序。 //返回指定位置按键的键值

uchar GetPosKeyID(uchar keypos) {

switch(keypos)

{

case 13: return 0; case 8: return 1; case 9: return 2; case 10: return 3; case 4: return 4; case 5: return 5; case 6: return 6; case 0: return 7; case 1: return 8; case 2: return 9; case 15: return 10; case 11: return 11; case 7: return 12; case 3: return 13; case 14: return 14; case 12: return 15; case 20: return 16; default: return 17; } }

这样就很好的解释了键值。

// // // // // // // // // // // // // // // // // // 0 1 2 3 4 5 6 7 8 9 + - * / = On\\C 无按键 奇怪的事情

4.3主功能软件模块

下面是主程序源代码

//功能部分

uchar InputChar(int *mem,uchar id)//返回值赋给showflag {

uchar key;

if(id==0){offsetcursor1=0;Data[4]=0;} while(1) {

if(KeyPosScan()!=20) {

Delay(15);//防抖动

key=GetPosKeyID(KeyPosScan()); if(key<10)//按下了数字 {

if((*mem<=3272)&&(*mem>=-3272))//没有满位 {

(*mem)=(*mem)*10+key;

if(id==0)offsetcursor1++;//光标位置偏移量++ else SetLine1Pos(offsetcursor1++); ShowBitNum(key);

} else

{SetLine2Pos(0);ShowStr(\ }

else if(key<14)//按下了+-*/ {

Data[1]=key;

offsetcursor1++; switch(Data[1]) {

case 10:ShowChar('+');break; case 11:ShowChar('-');break; case 12:ShowChar('*');break; case 13:ShowChar('/');break; }

return id;//返回指示显示data[id] }

else if(key==14)//等号 {

if(Data[1]==10) Data[3]=Data[0]+Data[2];//+

else if(Data[1]==11) Data[3]=Data[0]-Data[2];//-

else if(Data[1]==12) Data[3]=Data[0]*Data[2];//*

else if(Data[1]==13) {

if(Data[2]==0) {

return 5;//除零错误 } else {

Data[3]=Data[0]/Data[2];///倍数 Data[4]=Data[0]-Data[2]*Data[3]; } }

else continue;//防止用户开机按=号,未初始化data[3]等

if(Data[3]>9999||Data[3]<-999) return 4;//溢出错误 return 3;//返回显示结果 }

else if(key==15)//开关键 初始化程序

} } }

return 7;

4-4程序显示功能设计。

LM016L显示器需要初始化,写端口等操作。 void WaitCheck() // 等待空闲 {

do{

P0=0xFF;

RS=0;//选择指令寄存器

RW=1;//读 rs rw 值为01时,忙标志和地址计数器读出 EN=0;//E=0,禁止读写

Delay(1);//等待,液晶显示器处理数据 EN=1;//E=1,允许读写

}while(BUSY==1);//判断是否为空闲,1为忙,0为空闲 }

void WriteCom(uchar com)//写指令 {

P0=com; RS=0; RW=0; EN=0;

WaitCheck(); EN=1; }

然后需要进行初始化 void Init() //初始化 {

EN=1; //使能信号为高电平 WriteCom(0x38); //显示模式设置

WriteCom(0x0e); //显示开,光标开,不闪烁 WriteCom(0x06); //光标右移 文字移动无效 WriteCom(0x80); //设置访问地址 }

初始化完成后我写了几个基本的命令,用来扩充对LCD屏幕更容易的显示。 //设置命令

void SetLine1Pos(uchar pos)//设置光标位置 {

WriteCom(0x80|pos); }

void SetLine2Pos(uchar pos)//设置光标位置

{

WriteCom(0xC0|pos); }

void SetCursorStyle(uchar style)//0光标左移1光标右移 {

if(style)WriteCom(0x04);//光标左移 else WriteCom(0x06);//光标右移 }

//运算命令

uint Abs(int number) {

if(number<0)return -number; return number; }

//图像命令

void Cls()//清屏光标复位指令 {

WriteCom(0x01); }

void ShowCursor(uchar i)//1显示不闪烁的光标 0禁用光标 {

if(i)WriteCom(0x14); else WriteCom(0x12); }

void ShowStr(uchar *c) {

while((*c)!=0) {

ShowChar(*c); c++; } }

void ShowError(uchar a)//显示错误命令 a为错误代码 {

SetLine1Pos(0);

ShowStr(\ SetLine2Pos(0);

if(a==4)ShowStr(\

else if(a==5)ShowStr(\ else if(a==6)ShowStr(\}

void ShowBitNum(uchar num)//显示单个正数 {

ShowChar(0x30+num); }

int ShowNumber(int number)//显示指定数字//返回0正常 1表示溢出 {

uchar minusflag=0;//1为负数 uint bitnum,bitbuf;

if(number>32767||number<-32767) {

ShowFlag=4;//溢出错误 return 1; }

if(number<0)minusflag=1; number=Abs(number);

if(number>9999) bitnum=10000; else if(number>999) bitnum=1000; else if(number>99) bitnum=100; else if(number>9) bitnum=10; else if(number>=0) bitnum=1; // SetCursorStyle(1);

if(minusflag)ShowChar(0x2d);//显示负号 while(bitnum>0) {

bitbuf=number/bitnum; ShowBitNum(bitbuf);

number-=(bitbuf*bitnum); bitnum/=10; } }

void ShowFormula()//显示公式命令,用来显示公式 {

SetLine1Pos(0);

ShowNumber(Data[0]); switch(Data[1]) {

case 10:ShowChar('+');break; case 11:ShowChar('-');break; case 12:ShowChar('*');break; case 13:ShowChar('/');break; }

ShowNumber(Data[2]); ShowChar('='); SetLine2Pos(0);

ShowStr(\ ShowNumber(Data[3]);

}

if((Data[1]==13)&&(Data[4]!=0)) {

ShowStr(\

ShowNumber(Data[4]); }

4.4主程序设计

下面为主程序

主程序既把各个功能串联一起,又能够进行循环执行。

首先进行LCD的初始化,再进行欢迎词,在进行键盘扫描,根据ShowFlag变量的值进行显示错误提示或者显示结果或者显示数值等。

void main() {

Init();

while(Welcome(10)); while(1) {

if(KeyPosScan()==12) {

DataInit();

if(ShowFlag<3)ShowFlag=InputChar(&Data[0],0);//勿影响显示

if(ShowFlag<3)ShowFlag=InputChar(&Data[2],2);//结果和错误

}

RegisterShowFlag(); } }

还有部分代码未贴出,整体程序清单见附录。

五、调试及分析 1调试分析

做好器件后先不要把芯片插在芯片板上,先验证电源是否好用,有无短路等情况,接上低电源测试各个点无误后方可插上芯片。

芯片插好后进行测试各个硬件模块是否能够完成功能,包括按键是否好用,显示是否正常等。

2性能分析

(1)单片机程序设计由于使用的是KeilC51。为扩大运算范围,使用long int范围。如果数据溢出,自动提示溢出错误信息。

(2)可运算加、减、乘、除在内的四种运算。包括显示正数与负数。除零错误将自动提示等信息。

(3)可以显示运算的公式。

六、心得体会

通过本次课程设计我真正的完成了自己设计计算器的目标,了解了从设计硬件,电路设计,电路板设计,软件设计,成品调试等各方面的过程,从而从整体学到了多方面的知识,为以后工作打下了一定的基本基础。

另外从本次实验中我也发现了自己有很多的不足,对知识了解的可能仍不够扎实,做事不够稳定等。相信同样的问题以后能够很好的解决,并能够把单片机做的更好。

七、参考文献

[1]李群芳,黄建;单片机微型计算机与技术 北京:电子工业出版社,2001

八、附录

整体电路图

程序源代码

#include #include

#define uint unsigned int #define uchar unsigned char

sbit EN = P2^2; //定义引脚 sbit RS = P2^0; sbit RW = P2^1; sbit BUSY = P0^7; sbit P13 = P1^3; //键盘数据

uchar LineScan[4]={0xE0,0xD0,0xB0,0x70};//列线扫描电压,分为第1,2,3,4根列线 uchar RowScan[4] ={0x0E,0x0D,0x0B,0x07};//行线扫描电压,分为第1,2,3,4根行线 //计算类定义

uchar ShowFlag=9;//0显示Data[0] 1正常允许进行下一步 2显示Data[2] 3显示Data[3] 4显示溢出错误 5显示除零错误 6显示作者错误 7初始化程序 8操作错误 9提示按初始化

键 99无法预测错误

uchar DivFloatFlag=0;//是否显示除法所得的float数据//该变量设置取消 uchar DivFloatData[15]={0}; uchar FloatShowNum=0;

long int Data[4]={0,10,0,0};//记录运算数据及结果 //系统端口操作函数 void Delay(uint o) { uint i,j; for(i = 0; i < o; i++)for(j = 0; j < 100; j++); }

void WaitCheck() // 等待空闲 {

do{

P0=0xFF;

RS=0;//选择指令寄存器

RW=1;//读 rs rw 值为01时,忙标志和地址计数器读出 EN=0;//E=0,禁止读写

Delay(1);//等待,液晶显示器处理数据 EN=1;//E=1,允许读写

}while(BUSY==1);//判断是否为空闲,1为忙,0为空闲 }

void WriteCom(uchar com)//给P0写指令 { P0=com; RS=0; RW=0; EN=0; WaitCheck(); EN=1; }

void ShowChar(uchar c)//输入16进制数字码显示char { P0=c; RS=1; RW=0; EN=0; WaitCheck(); EN=1; }

//设置命令

void SetLine1Pos(uchar pos)//设置光标位置 {

WriteCom(0x80|pos); }

void SetLine2Pos(uchar pos)//设置光标位置 { WriteCom(0xC0|pos); }

void SetCursorStyle(uchar style)//0光标左移1光标右移 { if(style)WriteCom(0x04);//光标左移 else WriteCom(0x06);//光标右移 }

//运算命令

long int Abs(long int number) { if(number<0)return -number; return number; }

//图像命令

void Cls()//清屏光标复位指令 { WriteCom(0x01); }

void ShowCursor(uchar i)//1显示不闪烁的光标 0禁用光标 { if(i)WriteCom(0x14); else WriteCom(0x12); }

void ShowStr(uchar *c) { while((*c)!=0) { ShowChar(*c); c++; } }

void ShowBitNum(uchar num)//显示单个正数 { ShowChar(0x30+num); }

void ShowError(uchar a) { SetLine1Pos(0); ShowStr(\ id=\ SetLine2Pos(0);

if(a==4)ShowStr(\ else if(a==5)ShowStr(\ else if(a==6)ShowStr(\ AuthorError! \ else if(a==8)ShowStr(\ else ShowStr(\}

int ShowNumber(long int number)//显示指定数字//返回0正常 1表示溢出 { uchar minusflag=0,idnumbuf[10]={0};//1为负数,最大10位整数 int bitbuf; if(number>2147483647||number<-2147483647) { ShowFlag=4;//溢出错误 return 1; } if(number<0)minusflag=1; else if(number==0){ShowChar('0');return 0;} number=Abs(number); if(minusflag)ShowChar(0x2d);//显示负号 //显示正数 //10位赋值 for(bitbuf=0;number;bitbuf++) { idnumbuf[bitbuf]=number; number/=10; } for(bitbuf--;bitbuf>=0;bitbuf--) { ShowBitNum(idnumbuf[bitbuf]); } return 0; }

void ShowFormula() { SetLine1Pos(0); ShowNumber(Data[0]); switch(Data[1]) { case 10:ShowChar('+');break; case 11:ShowChar('-');break; case 12:ShowChar('*');break; case 13:ShowChar('/');break;

} ShowNumber(Data[2]); ShowChar('='); SetLine2Pos(0); ShowNumber(Data[3]); if(Data[1]==13) { ShowChar('.'); for(FloatShowNum=0;FloatShowNum<15;++FloatShowNum) { ShowBitNum(DivFloatData[FloatShowNum]); } } ShowStr(\ \}

//按键处理命令

//获取按键位置//16为无按键按下 uchar KeyPosRowScan() { uchar Temp=0;//扫描状态暂存。 uchar Row;//行号 P3=0x0f; Temp=P3;//暂存P2状态 for(Row=0;Row<4;Row++) if(Temp!=0x0f)//若有按键按下 { if(RowScan[Row]==Temp)return Row; } return 4;//无按键按下 }

uchar KeyPosLineScan() { uchar Temp=0;//扫描状态暂存。 uchar Line;//列号。 P3=0xf0; Temp=P3;//暂存P2状态 for(Line=0;Line<4;Line++) if(Temp!=0xf0)//若可能有按键按下 { if(LineScan[Line]==Temp)return Line; } return 4;//无按键按下 }

uchar KeyPosScan()//返回按键位置 { return KeyPosRowScan()*4+KeyPosLineScan(); }

//返回指定位置按键的键值

uchar GetPosKeyID(uchar keypos) { switch(keypos) { case 13: return 0; // 0 case 8: return 1; // 1 case 9: return 2; // 2 case 10: return 3; // 3 case 4: return 4; // 4 case 5: return 5; // 5 case 6: return 6; // 6 case 0: return 7; // 7 case 1: return 8; // 8 case 2: return 9; // 9 case 15: return 10; // + case 11: return 11; // - case 7: return 12; // * case 3: return 13; // / case 14: return 14; // = case 12: return 15; // On\\C case 20: return 16; // 无按键 default: return 17; // 奇怪的事情 } }

//功能部分

uchar InputChar(uchar id)//返回值赋给showflag { uchar key,DivFBuf,offsetcursor1,keynumbernum=0;//被除数DivFBuf作为缓冲 long int nbuf=0; if(id==0){offsetcursor1=0;Data[4]=0;} while(1) { if(KeyPosScan()!=20) { Delay(15);//防抖动 key=GetPosKeyID(KeyPosScan()); if(key<10)//按下了数字 { if((keynumbernum==0)&&(key==0));

else { ++keynumbernum; if(keynumbernum<10)//没有满位 { nbuf=nbuf*10+key; if(id==0)offsetcursor1++;//光标位置偏移量++ else SetLine1Pos(offsetcursor1++); ShowBitNum(key); } else { SetLine2Pos(0); ShowStr(\ } } }

else if(key<14)//按下了+-*/ { Data[id]=nbuf; Data[1]=key; SetLine1Pos(offsetcursor1++); switch(Data[1]) { case 10:ShowChar('+');break; case 11:ShowChar('-');break; case 12:ShowChar('*');break; case 13:ShowChar('/');break; } if(id==0) return 1;//返回指示显示data[id] else return 8; }

else if(key==14)//等号 { Data[id]=nbuf; if(id==2) ShowChar('='); else { SetLine2Pos(0); ShowStr(\ ShowNumber(Data[0]);

return id; } // if(Data[0]==0){while(1)ShowStr(\ if(Data[1]==10) Data[3]=Data[0]+Data[2];//+ else if(Data[1]==11) Data[3]=Data[0]-Data[2];//- else if(Data[1]==12) Data[3]=Data[0]*Data[2];//* else if(Data[1]==13) { if(Data[2]==0) { return 5;//除零错误 } else { Data[3]=Data[0]/Data[2];//整数部分 if(Data[3]*Data[2]!=Data[0]) { DivFloatFlag=1; } DivFloatData[FloatShowNum]=Data[3]; DivFBuf=Data[0]; for(FloatShowNum=0;FloatShowNum<15;FloatShowNum++) { DivFloatData[FloatShowNum]=DivFBuf-DivFloatData[FloatShowNum]*Data[2]; DivFBuf=DivFloatData[FloatShowNum]*10; DivFloatData[FloatShowNum]=DivFBuf/Data[2]; DivFloatData[FloatShowNum+1]=DivFloatData[FloatShowNum]; } } } // else continue;//防止用户开机按=号,未初始化data[3]等 if(Data[3]>2147483647||Data[3]<-2147483647) return 4;//溢出错误 return 3;//返回显示结果 } else if(key==15)//开关键 初始化程序 return 7; } } }

void DataInit() {

uchar i; for(i=0;i<4;i++)Data[i]=0;Data[1]=10; for(i=0;i<15;i++)DivFloatData[i]=0; FloatShowNum=0; ShowFlag=1; DivFloatFlag=0; Cls(); }

void RegisterShowFlag() { if(ShowFlag==0) {SetLine1Pos(0);ShowNumber(Data[0]);}//见ShowFlag注释 else if(ShowFlag==1); else if(ShowFlag==2) {SetLine1Pos(0);ShowNumber(Data[2]);} else if(ShowFlag==3) {ShowFormula();} else if(ShowFlag==4)ShowError(4); else if(ShowFlag==5)ShowError(5); else if(ShowFlag==6)ShowError(6); else if(ShowFlag==7)DataInit(); else if(ShowFlag==8)ShowError(8); else if(ShowFlag==9) { SetLine1Pos(0); ShowStr(\ SetLine2Pos(0); ShowStr(\ } else ShowError(99); } //

void Init() //初始化 { EN=1; //使能信号为高电平 WriteCom(0x38); //显示模式设置

WriteCom(0x0e); //显示开,光标开,不闪烁 WriteCom(0x06); //光标右移 文字移动无效 WriteCom(0x80); //设置访问地址 }

uchar Delay2(uint o) { uint i,j; for(i = 0; i < o; i++)for(j = 0; j < 100; j++)

{if(KeyPosLineScan()!=4)return 0;} return 1; }

uchar Welcome(uchar i)//娱乐模式 { SetLine1Pos(0); ShowStr(\ 10807010325\ if(!Delay2(i))return 0; SetLine2Pos(0); ShowStr(\ if(!Delay2(i))return 0; return 1; }

void main() { Init(); while(Welcome(10));Cls(); while(1) { if(KeyPosScan()==12) { DataInit(); if(ShowFlag==1)ShowFlag=InputChar(0);//不要影响显示结果和错误 if(ShowFlag==1)ShowFlag=InputChar(2);//不要影响显示结果和错误 } RegisterShowFlag(); } }

本文来源:https://www.bwwdw.com/article/b8rr.html

Top