博文
PC213X之LCM1010 C++程序源代码(2008-02-22 22:31:00)
摘要:/*--------------------------------------------------------------------------LPC213X之LCM1010 C++程序源代码
HotPower@126.com 2006.8.29
-------------------------------------------------------------------------------*/
#i nclude <LPC213XDEF.H>
#define WDI P0_11//#define LCMDATA P0_6 //LCM1010数据端#define LCMWR P0_7 //LCM1010写#define LCMCS P0_8 //LCM1010片选
#define LedSegS1 0x20#define LedSegS2 0x40#define LedSegS3 0x80
#define LedSegS4 0x02#define LedSegS5 0x04#define LedSegS6 0x08
//HCBD GAEF#define LedSegA 0x04#define LedSegB 0x20#define LedSegC 0x40#define LedSegD 0x10#define LedSegE 0x02#define LedSegF 0x01#define LedSegG 0x08#define LedSegH 0x80
#define LedChar0 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF )#define LedChar1 ( LedSegB + LedSegC &n......
LPC213X模拟SPI之LCD12864 C++代码(2008-02-22 22:30:00)
摘要:/*--------------------------------------------------------------------
LPC213X模拟SPI之LCD12864 C++代码
HotPower@126.com
--------------------------------------------------------------------*/
//由于SPI/SSP都专用了,不得不用IO模拟SPI控制LCD
//__inlineLcdObj::LcdObj(void){ LcdPinSetup(); LcdInit();}
//__inlinevoid LcdObj::LcdPinSetup(void){/* POWER->P_CONP |= (1 << PCSPI0); PINSEL->PIN_SEL0 |= ((P0_4_SCK0 << P0_4_PINSEL) | (P0_6_MOSI0 << P0_6_PINSEL));// SPI->SPI_SPCCR = 0x168; // 设置SPI时钟分频 SPI->SPI_SPCCR = 0x52; // 设置SPI时钟分频 SPI->SPI_SPCR = (1 << CPHA) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样 (1 << CPOL) | // ......
[转]16道C语言面试题(2008-02-14 12:52:00)
摘要:预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 4). 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) (A) : (B)) 这个测试是为下面的目的而设的: 1). 标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。 2). 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。 3). 懂得在宏中小心地把参数用括号括起来 4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事? least = MIN(*p++, b);3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种 问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。死循环(Infinite loops)4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的 基......
C程序中嵌入汇编新方法(2008-01-15 19:11:00)
摘要:由于C语言在定时方面的缺陷,在某些场合下,C程序中需要嵌入汇编代码,以弥补C的缺陷。通常,在C语言程序中嵌入汇编的方法,无外乎两种
在C程序中填入#asm和#endasm的编译命令,在之中填入汇编代码
编写汇编函数,通过链接定位器和特殊的编译方式链接方式加入到所有程序的目标代码中
但这两种方法都存在实现困难的问题,对刚起步经验不足的程序员来说,基本上很难弄懂和编译成功。
而我想到的办法是:将汇编代码定义成一数组,然后使C程序以代码方式运行数组。其实,这就是我们所知的蠕虫病毒的原理。
具体方法是这样的,要知道,汇编代码其实也是一常数,8位CPU中,一句代码是用8位二进制表示,16位CPU中,一句代码是用16位二进制表示,所以,以51单片机(8位)为例,其一系列的汇编程序代码,在C程序中就是一个unsigned char类型的数组。那么,我们可以把想嵌入的汇编代码在C程序中定义成一个数组:
unsigned char code huibian[n]={……};
然后的问题就是如何启动它了。
我们知道,C语言中,无返回类型函数指针的定义为
void (*name_of_function )();
另外C语言中强制类型转换为
(type)variable;
所以,基于上面两个语句,我们就可以把huibian这个数组指针(数组名就是一指针)转化为函数指针
(void(*)())huibian;
那么,既然都是函数指针了,直接运行就行了
(*(void(*)())huibian)();
这样就大功告成了。
再有,这方法的缺点就是,一开始得先把汇编代码译制成数组,这工作代码短还凑活,长了就不好办了,可以的话,编一个译码的工具程序。......
程序设计中的位移指令(2008-01-15 18:56:00)
摘要:事情的起因是因为一小段汇编程序,其中关键的几条指令如下:mov ax,34hloop2:mov bx,0ffffhloop1:mov cx,0ffffhnext:mul al,2//关键语句,进行乘法操作 loop nextdec bxjnz loop1
编译和连接通过后,程序运行需要时间14秒,而将其中的关键语句由乘法换为移位指令时,即关键语句变为 Shl al,1 编译和连接通过后,程序运行需要时间4秒。 众所周知,左移一位和乘2的操作结果是一样的,都是将原操作数扩大了一倍,那为什么将乘法操作换为移位指令后,操作效果会相差这么大呢?可能大家也已经想到了答案,移位指令的速度比乘法指令的快,那为什么产生相同结果的移位指令和乘法指令在速度上会有如此大的差异呢?下面我们从移位器和乘法器的逻辑电路设计的角度来分析一下这个问题。 图1所示的是一个四位移位寄存器的原理图,有四个D边沿触发器构成,di是移位器的串行输入,Do是移位器的串行输出,Cp 是移位脉冲信号,Di=Qi-1每个移位寄存器的输出端作为下一个移位寄存器的输入端。 图1 用D触发器构成的四位移位寄存器 当di=1011时移位脉冲与各个触发器输出的关系如下表所示:
Cp 顺序
移位寄存器中的数据
Q1
Q2
Q3
Q4
0
0
0
0
0
1
0
0
0
1
2
0
0
1
0
3
0
1
0
1
4
1
0
1
1图2 脉冲cp与移位寄存器关系表
当cp=4时,移位寄存器中的数据,正好等于输入数据,q4输出的数据等于输入的数据。 我们知道,计算机是用二进制表示数据的,用二进制很容易的进行加法,减法运算,但是怎样进行乘法运算呢?在十进制的运算中,我们很容易的得到相乘的结果,但......
如何提高程序运行效率(2008-01-15 18:53:00)
摘要:通常影响程序运行速度的地方,都是在执行次数最多的地方。比如显示一张800*600的256色图形,如果在设置调色板时浪费了0.001秒,那么对整个程序不会有很大影响,因为设置调色板的操作只要作一次就完成,但是每绘出一点要多浪费0.001秒,那么整张图画完就会慢上800*600*0.001 秒,这是一个相当可观的数目。下面介绍一些常用的技巧。一.尽量使用整数,少用浮点数 整数运算比浮点数快得多,而在绘图程序中用到小数点的机会实在少之又少,所以这是很容易做到的技巧。二.避免乘法与除法 乘法与除法都是相当浪费CPU运算时间的一种运算,所以在绘图程序中应尽量避免,在无法避免时,如果乘除的数目为2次方,例如2、4、8、16等,则可改用左移或右移来取代:a*2^n-->a<<n 例:a*16-->a<<4a/2^n-->a>>n 例:a/32-->a>>5 上式中2^n表示2的n次方。三.少用求模运算 求模的运算(%)通常也是用乘除来完成的,所以速度很慢,我们也要尽量避免,当然如果除数为2的次方,那么可以改用&来替代:a%2^n --> a&(2^n-1)例:a%8 --> a&0x07注意,如果除数不是2的次方,绝不能用&来替代。四.复杂的二维计算改用查表法 所谓查表法,就是事先将一些运算结果存入表格中,然后在需要时直接取出来使用而不必再做运算。最常见的例子就是在做图形旋转时,往往会用到sin()、cos()等函数来计算角度,如果能将这些运算结果事先存于表格中,那么必能省下相当多的时间。 对于较简单的显示图形的程序,我们也可以利用查表法来避免乘法的使用。例如在320*200*256模式下,我们要在(x,y)的地方画出一点,那么必然要做(y*320+x)的计算,如果能将每一条起始扫描线的位置事先算出并存入表格中:unsinged table[200];for( i=0; i<200; i++ )table = i * 320;那么在绘点时便可以直接使用下面的方法来取得位置:table[y] + x;避免了乘法运算,这就是“以空间换取时间“的做法。还有一种变形的查表法也值得一提,那就是如果在程序中有很多地方都用到了相同的运算,那么可以事先算出结果并加......
学习初级C语言(2007-10-31 21:57:00)
摘要:http://www.programfan.com/article/subject1.asp
一个学习初级C语言的好地方 ......
C语言初学者入门讲座(2007-10-31 21:55:00)
摘要:http://www.programfan.com/article/subject1.asp
一个学习初级C语言的好地方 ......
C语言十个经典程序(2007-03-07 15:43:00)
摘要:
【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++) for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) printf("%d,%d,%d\n",i,j,k); }}
程序2】题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bonus1+(i-100000)*0.075; else if(i<=400000) bonus=bonus2+(i-200000)*0.05; else if(i<=600000) bonus=b......
C/C++头文件一览(2006-11-17 08:27:00)
摘要:
1、传统 C++
#include <assert.h> //设定插入点
#include <ctype.h> //字符处理
#include <errno.h> //定义错误码
#include <float.h> //浮点数处理
#include <fstream.h> //文件输入/输出
#include <iomanip.h> //参数化输入/输出
#include <iostream.h> //数据流输入/输出
#include <limits.h> //定义各种数据类型最值常量
#include <locale.h> //定义本地化函数
#include <math.h> //定义数学函数
#include <stdio.h> //定义输入/输出函数
#include <stdlib.h> //定义杂项函数及内存分配函数
#include <string.h> //字符串处理
#include <strstrea.h> //基于数组的输入/输出
#include <time.h> //定义关于时间的函数
#include <wchar.h> //宽字符处理及输入/输出
#include <wctype.h> //宽字符分类
2、标准 C++ (同上的不再注释)
#include <algorithm> //STL 通用算法
#include <bitset> //STL 位集容器
#include <cctype> //定义测试字符的函数
#include <cerrno>
#include <clocale>
#include <climit> &nb......
