|
引用 185 楼 qqqqqwwqqq 的回复:
本来想找个定时器的程序让LZ分析分析? 可惜找不到了 也不知道属于哪个元件了
贴一个时钟程序吧? 欢迎LZ分析? 学C51学了12天? 练习练习了8天? 2年没碰了
C/C++ code
#include#define uchar unsigned char#define uint unsigned intchar code tab[]={0x2a,0x1c,0xbc,0xbc,0x88,0x7f};//如果使用键盘中断请定义#define USE_KEY 1//须主程序定义的参数 sbit ch451_dclk=P1^0;//串行数据时钟上升延激活 sbit ch451_din=P1^1;// 串行数据输出,接CH451的数据输入 sbit ch451_load=P1^2;//串行命令加载,上升延激活 sbit ch451_dout=P3^3;//INT1,键盘中断和键值数据输入,接CH451的数据输出 uchar ch451_key;// 存放键盘中断中读取的键值 bit ok,clr;
#includevoid delay(uchar m){//在12P下延时十毫秒 uchar i,j,k;for(i=0;i
}void main()
{uint a,b,c,d,i,j,k,n;
d=0;
ch451_init();
ch451_write(CH451_SYSON2);
ch451_write(CH451_BCD);for(n=0;n<2;n++)
{
ch451_write(CH451_DIG7|n);for(k=0;k<10;k++)
{
ch451_write(CH451_DIG6|k|0x80);for(j=0;j<5;j++)
{
ch451_write(CH451_DIG5|j);for(i=0;i<10;i++)
{
ch451_write(CH451_DIG4|i|0x80);for(d=0;d<6;d++)
{
ch451_write(CH451_DIG3|d);for(c=0;c<10;c++)
{
ch451_write(CH451_DIG2|c|0x80);for(b=0;b<10;b++)
{
ch451_write(CH451_DIG1|b);for(a=0;a<10;a++)
{
ch451_write(CH451_DIG0|a);
delay(1);
}
}
}
}
}
}
对不起,我也没基础过这个片子,没法提供更具体的信息。不过在可读性方面我想这个程序还是有不少改进的地方。如下:
1、
- 这一行看不明白tab具体是什么表格,需要再具体一些。
- 2、[code]
- 如果一个宏只是用作“标识符”的话完全没必要这样用,直接#define USE_KEY即可。
- 3、[code]
- 从变量的命名来看,看不出类型。我喜欢这样命名“位变量”:
- [code]#define FALSE 0
- #define TRUE 1
- typedef bit BOOL;
- BOOL g_bOK = FALSE;
- BOOL g_bClear = FALSE;
复制代码
用前缀g_来表示这是一个全局变量,用b来表示这是一个位变量。所有变量定义的时候都初始化,明白地告诉人,这个变量初始应该是什么状态。(我知道全局变量编译器会自动初始化为0)
4、delay(uchar m)函数命名没有表达出真正的含义。参数m代表的是毫秒?微妙还是秒?尽管代码中对其加了注释,但这种注释并没有达到最好的效果。如果是我,大概会这样写这个延迟函数:
- typedef unsigned char BYTE;
- void DelayMS(BYTE nElapse);
复制代码
我感觉写成我这样,延迟函数基本上不需要注释了。
其实延迟函数是一个经常要用到的函数,应该单独提炼出来做成“通用函数”,以便日后在其他工程中使用
5、 - uint a,b,c,d,i,j,k,n;
- d=0;
复制代码
这些变量根本不知所云。
6、类似- 的代码中,“位或”0x80是什么意思?
- 7、类似[code]循环语句中的2是什么意思?应该用宏重新定义一个意义明显的名称
- 8、最后最重要的一点。把对CH451的操作和main()函数放在了一起,基本没什么模块化和复用性可言,应该单独拿出来形成一个“库”封装一下。大概是这样的:
- //头文件
- [code]
- #ifnedef _CH154_H_
- #define _CH154_H_
- //在这里定义各种引脚
- sbit ch451_dclk=P1^0; //串行数据时钟上升延激活
- sbit ch451_din=P1^1; // 串行数据输出,接CH451的数据输入
- sbit ch451_load=P1^2; //串行命令加载,上升延激活
- sbit ch451_dout=P3^3; //INT1,键盘中断和键值数据输入,接CH451的数据输出
- ...
- //下面是函数的声明
- void ch451_init();
- void ch451_write();
- ...
- //以下为本文件内使用的函数
- static void DelayMS(BYTE nElapse); //注意这里,为什么要用static
- ...
- #endif
- 然后在.c文件中实现这些函数,我就不具体写了。
复制代码 |
|