
输入ADescriptor,由于是getchar()只能一个一个接收字符,然后执行switch语句!
输入a,A,e,E,i,I,o,O,u,U都会V1=V1+1
剩余情况为V0=V0+1,V2=V2+1。
当读取到最后一个字符的时候(即换行符<CR>,程序输出结果)
不懂可追问!
//若有帮助,请采纳!
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
bit write=0; //写24C02的标志;
sbit sda=P2^0;
sbit scl=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
uchar sec,tcnt;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay()
{ ;; }
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void start() //开始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //停止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //应答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void init()
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void display(uchar bai_c,uchar sh_c) //显示程序
{
dula=0;
P0=table[bai_c]; //显示第一位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay1ms(5);
dula=0;
P0=table[sh_c]; //显示第二位
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay1ms(5);
}
void main()
{
init();
sec=read_add(2); //读出保存的数据赋于sec
if(sec>100) //防止首次读取出错误数据
sec=0;
TMOD=0x01; //定时器工作在方式1
ET0=1;
EA=1;
TH0=(65536-50000)/256; //对TH0 TL0赋值
TL0=(65536-50000)%256; //使定时器005秒中断一次
TR0=1; //开始计时
while(1)
{
display(sec/10,sec%10);
if(write==1) //判断计时器是否计时一秒
{
write=0; //清零
write_add(2,sec); //在24c02的地址2中写入数据sec
}
}
}
void t0() interrupt 1 //定时中断服务函数
{
TH0=(65536-50000)/256; //对TH0 TL0赋值
TL0=(65536-50000)%256; //重装计数初值
tcnt++; //每过50ms tcnt加一
if(tcnt==20) //计满20次(1秒)时
{
tcnt=0; //重新再计
sec++;
write=1; //1秒写一次24C02
if(sec==100) //定时100秒,再从零开始计时
sec=0;
}
}
对于各种各样应用日益广泛的嵌入式系统而言,除了应用功能强大外,人机界面的美观也是吸引用户的重要方面。因此,越来越多的嵌入式系统开发人员希望:LCD上除了显示图案固定的菜单以外,再添加适量的动画,使得整个界面屏幕更加活泼可人。用于动画设计的程序设计语言有多种,并且有多种方法,根据是否需要借助于其他应用软件和程序,可以将这些方法分成两大类:第一类是只使用各种编程语言及开发环境中包含的文件和框架实现的设计方法;第二类则是安装相关软件(诸如Flash、Di-rectDraw等),在相关语言的开发环境中将这些软件的功能文件包含进去,来共同实现动画设计的方法。而嵌入式系统由于其极强的专用性、实时性要求,传统采用的开发语言并不是很多,虽然动画界面在嵌入式系统应用中并非高优先级的程序,但开发人员在选取其设计方法时,也应该辨明利弊,灵活使用,这样才能看到更加赏心悦目的界面,而不是被LCD上凌乱不堪的显示内容所困扰。
1不需安装第三方软件的动画设计方法分析
(1)Logo适用于简易的嵌入式设备的动画设计
Logo语言的设计方法最为简单。它内置一套(TurtleGraphics)系统,其本身就是一种绘画语言,理论上可以加载到嵌入式系统中作动画开发;然而,因为一个嵌入式系统会有很多别的软件设计部分,其他功能都采用Logo显然并不合适,而要在一个嵌入式系统中安装两种开发环境更加不现实。所以,若在嵌入式系统开发中选用这种方法制作动画,应该只适合用于儿童用的复杂程度同等的简易的嵌入式设备。
(2)最适合嵌入式系统使用的擦除法
C语言是嵌入式系统开发使用最多的语言,并且高中低档的系统都可以用,因而采用C语言的所有动画设计方法,理论上均适用于嵌入式系统的屏幕动画开发。然而,诸如利用动态开辟图视口方法、利用显示页和编辑页交替变化、利用画面存储再重放的方法,以及直接对图像动态存储器进行 *** 作的方法等程序比较复杂,且要对图像不断进行存取 *** 作,这需要耗费大量内存资源;而擦除法动画设计则可以解决上述问题。其设计原理是:利用同色原理,当图形色与背景色相同时人眼不能感知。在动画设计中,当在一个位置画了一张图像时,使图像色与背景色相异,然后再到另一个位置画一张图像并使图像色与背景色也相异,此时将先画的图像在原位置再画一张,并使图像色与背景色相同,这样人眼只能看到新画的一张图像而看不到先前画的图像,从而先前画的图像感觉被擦除了。
这样连续画多张图像并在每画一张新的图像时将原来的图像擦除,从而在观察者看来就实现了动画的效果。综上所述,从耗费资源较少且执行速度较快的角度出发,笔者认为,采用C语言设计动画的常用方法中,最适合嵌入式系统使用的是首选擦除法。
(3)CBuilder语言本身不太适合嵌入式开发
采用CBuilder语言设计动画,可以方便地利用现成的组件产生图像及控制时间,从而解决了动画设计中两个非常重要的问题。然而CBuilder语言本身不太适合嵌入式开发,因为嵌入式开发对空间、效率都要求较高,而CB是针对高层的应用程序开发的工具。但是,有两点值得注意:首先,现在很多公司做嵌入式开发多是自己搞一套系统,使其适合使用CB完全可以做到;另外,Borland公司正在开发嵌入式的C,可以期待。
(4)Java语言非常适合嵌入式系统的屏幕动画设计Java语言是嵌入式系统开发经常采用的语言,在手机中更是应用良多。Java语言的动画设计方法通过定义线程的方法来控制动画时间;而使图像动的平滑的双缓冲方法需要很大内存,因而更常用的消除画面闪烁的办法是重载upGlate()。
(5)C语言方法均可用于嵌入式系统动画设计
面向对象的C语言中,可供选择的动画设计方法很多:简单的动态图像(如不断闪烁的星星)可以采用底色覆盖法;在屏幕的固定位置显示动态图像时,可以选择多切换法;利用异或方式进行绘图不会发生全屏幕闪动,通常效果较好,但若反复使用,在所清除图像处会产生闪烁,仍不是很完美;像素 *** 作一般和其他动态图像实现方法(如底色覆盖)相结合使用;多缓冲技术是将图形绘制在不同的帧中,通过将屏幕在这些不同的帧之间进行切换,来达到动画效果;具体的帧数目可以根据实际动画的需要自行确定。这类似于C语言中的双缓冲技术原理,只不过双缓冲只绘制一份备用图像作为离屏图像,而多缓冲则将图形绘制在多个不同帧中,将屏幕在这些帧之间进行切换。
因为工业方面大多用C/C作为嵌入式系统的开发语言,所以这些方法都可用于嵌入式系统动画设计。在Nord-TecSoftWare开发的Nord-TecSnowFlakes屏幕保护程序中,逼真的雪花动画便是利用多缓冲技术实现的。
(6)绘制复杂风格线条的方法
在GIS(地理信息系统)类软件设计中,经常需要在绘图时使用一些相对固定但又频繁使用的一些用以代表地理状态的符号,如河流、铁路、海岸线等等。显然,这些基本符号图形一般都是相对复杂的线条,在MFC提供的基本类库中并未提供可以直接使用的相关函数;即使是在绘图功能比较强大的CDC中,也仅仅提供了LineTo()、Set-Pixel()等一些通用的最基本的绘图函数。使用这些函数来绘制GIS基本符号是效率比较低的一种办法,这在大量的绘图 *** 作中将会表现得比较明显,因此不宜提倡。但是,可以通过WindowsNT3.1中首次出现的Win32.API函数LineDDA,来解决这一绘制复杂风格线条的问题。
(7)使用VC实现高速平滑的简单动画的方法
许多软件(特别是游戏软件)的开发中,实现高速平滑的动画需要比较深的技术,如OpenGL、DirectX,并且可能还要开发人员有深厚的数学功底。但是,如果只是在开发嵌入式系统过程中,想为应用程序的界面实现一些动画效果,就可能不用以上这些技术了,更多的是用WindowsAPI提供或MFC封装后的GDI绘图函数来实现。虽然所需动画的复杂程度不高,但作为开发人员,并不能为此就降低对动画效果的要求。因此,需要了解如何用GDI函数来开发平滑无闪、高速的动画。
该技术的关键就是在内存中创建一个与显示动画的窗口区域一样大的位图,先用GDI函数绘制位图,然后在适当的时候从内存中显示出来。因为位图已经绘制好,不象平时编程那样边绘制边显示,所以,显示一帧图形时便减少了闪烁,从而实现平滑动画;同时,由于图形是从内存中直接显示到当前窗体的,所以速度很快,从而实现高速动画。如果再创建一个线程后台绘制图形,将会实现很多特殊效果的动画,使嵌入式系统的用户界面收到意想不到的效果。
在此基础上,还可以在显示位图时作优化显示。例如:不是将位图全部显示出来,而是显示其中动画的一部分,因为BitBlt函数作位传输很慢。这样更符合嵌入式系统重视效率的特点。
2需要安装第三方软件的动画设计方法分析
(1)为教学研究开发的嵌入式设备可使用Ubigraph
graphviz和Ubigraph都是图论生成软件,但Ubig-raph功能更强,利用它可以快速生成图论模型的图形和动态图像,直观地展示出各种图论模型的三维结构,演示各种图论算法的过程。因为可以嵌入到Java、C、C等语言中,所以当然适合用于嵌入式系统的动画设计,尤其是一些专门为教学研究开发的嵌入式设备。
(2)Flash对嵌入式系统而言太过华丽
Flash是一种功能强大的矢量动画软件,但是所用到的高级技术比较多,不过为了能够做出精美的**特技效果的动画,还是值得对其进行深入研究的。然而,对于嵌入式系统开发而言,它实在是太过华丽了;如果不是特别需要突出游戏或者动画的精致效果,一般开发者应该不会舍本逐末以此来牺牲系统的速度和容量。
(3)DirectDraw方法对嵌入式系统的适用度
DirectDraw使用页面切换的方法实现图像动态。它不仅可以访问系统内存,还可以访问显示内存,实现图像动态的同时不会使得画面闪烁,是一种“完美切换”技术;因此DirectDraw技术很受程序员青睐,尤其在虚拟现实技术中应用广泛。但是,显而易见,该方法需要占用很大内存,安装所需的开发文件同样需要较大硬盘空间,应用到一般的嵌入式系统中,对反应速度等的限制将会比较明显。
其实,用DirectDraw编程的核心要点即“几个表面之间拷来拷去”。在对界面的动画复杂程度要求不高的嵌入式系统中,可以采用C程序作为开发语言,并且在动画实现方法上,利用前述C程序设计中显示页和编辑页交替变化的方法,来代替几个表面交替拷贝的DirectDraw方法。然而,如果是大型的嵌入式系统,并且重视界面动画效果,采用DirectDraw方法和面向对象开发语言,仍然是更好的选择。
当然,若对美术工艺有特殊要求,可以尝试将更专业的技术(如颜色锁结及用于3D效果的Z排序与视差)引入到嵌入式系统软件设计中——这种系统本身也应该是专业的、功能专用的,否则只能停留在理论上,难以实现!
3可用于嵌入式系统开发的脚本语言
当动画应用于网络时,可以选择直接使用脚本语言设计,譬如JSP、PHP等。当今的很多嵌入式系统都有连接网络的需求和相应功能,虽然大多数系统的屏幕动画都不涉及对外发布的问题,但在联网嵌入式系统的开发中直接使用脚本语言编写动画,也不啻为一个新的思路。
Python可作为嵌入式系统的开发语言(在Nokia智能手机所采用的Symbian *** 作系统上已得到证明)。它最大的优势是能够很轻松地把使用其他语言制作的各种模块(尤其是C/C)轻松地联结在一起。由此,既可以直接使用Py-thon编写简单的界面动画,也可以将对速度要求更高的复杂动画使用C语言编写后嵌入到Python程序中。
在后台添加js特效可实现这样的效果。
js代码为:
<script language="JavaScript">
<!--
var no = 5; //雪片数目
var speed = 20; //飘动速度。(值越大越慢)
var ns4up = (documentlayers) 1 : 0; //当前浏览器类型,如果是NS则为1
var ie4up = (documentall) 1 : 0; //当前浏览器类型,如果是IE则为1
var s, x, y, sn, cs;
var a, r, cx, cy;
var i, doc_width = 800, doc_height = 600;
x = new Array();
y = new Array();
r = new Array();
cx = new Array();
cy = new Array();
s = 8; //每次下落的高度,越小越平滑,但是也越慢
if (ns4up) { //以NS兼容方式
doc_width = selfinnerWidth; //取页面宽度
doc_height = selfinnerHeight; //取页面高度
}
else
if (ie4up) { //以IE兼容方式
doc_width = documentbodyclientWidth; //取页面宽度
doc_height = documentbodyclientHeight; //取页面高度
}
for (i = 0; i < no; ++ i) { //根据前面定义的雪片数目写进相应数目的层
initSnow(); //随机初始化层的坐标
if (ns4up) { //如果浏览器是NS
//用layer作为雪片(星号)的容器
documentwrite("<layer name=\"dot"+ i +"\" left=\"1\" ");
documentwrite("top=\"1\" visibility=\"show\"><font color=\"red\">");
documentwrite("</font></layer>");
}
else
if (ie4up) { //如果浏览器是IE
//用div作为雪片的容器
documentwrite("<div id=\"dot"+ i +"\" style=\"POSITION: ");
documentwrite("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
documentwrite("visible; TOP: 15px; LEFT: 15px;\"><font color=\"red\">");
documentwrite("</font></div>");
}
}
//初始化雪片,生成随机坐标
function initSnow() {
a = 6;
r[i] = 1;
sn = Mathsin(a);
cs = Mathcos(a);
cx[i] = Mathrandom() doc_width + 1;
cy[i] = Mathrandom() doc_height + 1;
x[i] = r[i] sn + cx[i];
y[i] = cy[i];
}
//计算雪花位置,从新位置上出现,看起来就像是新产生的一样。
function makeSnow() {
r[i] = 1;
cx[i] = Mathrandom() doc_width + 1;
cy[i] = 1;
x[i] = r[i] sn + cx[i];
y[i] = r[i] cs + cy[i];
}
//雪花下落的计算
function updateSnow() {
r[i] += s;
x[i] = r[i] sn + cx[i];
y[i] = r[i] cs + cy[i];
}
//在NS浏览器上处理雪片下落的主程序
function SnowdropNS() {
for (i = 0; i < no; ++ i) { //依次处理每片雪花
updateSnow(); //下落
if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height - 20))) { //如果超出屏幕范围
makeSnow(); //则调整雪片到新位置上
doc_width = selfinnerWidth; //更新页面宽度数据
doc_height = selfinnerHeight; //更新页面高度数据
}
documentlayers["dot"+i]top = y[i]; //改变层的Y坐标,应用新的位置
documentlayers["dot"+i]left = x[i]; //改变层的X坐标,应用新的位置
}
setTimeout("SnowdropNS()", speed);
}
//在IE浏览器上处理雪片下落的主程序
function SnowdropIE() {
for (i = 0; i < no; ++ i) { //依次处理每片雪花
updateSnow(); //下落
if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height - 20))) { //如果超出屏幕范围
makeSnow(); //则调整雪片到新位置上
doc_width = documentbodyclientWidth; //更新页面宽度数据
doc_height = documentbodyclientHeight; //更新页面高度数据
}
documentall["dot"+i]stylepixelTop = y[i]; //改变层的坐标,应用新的位置
documentall["dot"+i]stylepixelLeft = x[i];
}
setTimeout("SnowdropIE()", speed); //准备下一次下落过程。
}
if (ns4up) { //如果是NS
SnowdropNS(); //调用SnowdropNS使雪片下落
}
else
if (ie4up) { //如果是NS
SnowdropIE(); //调用SnowdropIE使雪片下落
}
-->
</script>
说明:可以根据自己的需求根据说明进行相应参数的修改
以上就是关于C语言求解释全部的内容,包括:C语言求解释、带注释的c语言程序、不需安装第三方软件的动画设计方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)