累死人的单片机课程设计终于结束了,忙了两天多。就是个数码管+ADC。看看自己两年多前写的程序。。这感觉。用了一天多重构。。。。之前写程序的那个乱啊。。。重新整理下,自己的库函数。记录于此。
1602库函数
1602.h
1 | /*模 块 名: LCD1602 */ |
1602.c
1 | //1602.c |
数码管
- 对应电路图如下
shu.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37/*模 块 名: 数码管 */
/*创 建 人:zy 日期:2014-07-01 */
/*版 本1.2 */
/*使用方法:调用 Shu_Display(double js)函数,输入一个double类型数据,
固定显示格式为小数点前4位及小数点后两位。 */
/*BUG:显示小数点后第二位时,有时会与输入值小1.原因疑似与fmod()函数有关 */
//端口定义
sbit io_shu = P2^3; //数码管开关低电平有效
sbit io_A = P2^0; //3-8译码器输入
sbit io_B = P2^1;
sbit io_C = P2^2;
sbit io_DP = P0^7; //dp点定义
extern uchar du_num[15];
void delay_1ms(uchar x); //1ms延迟函数
void wei(uchar i); //位选输出函数
void Shu_Display(double js);//数码管显示函数shu.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*模 块 名: 数码管 */
/*创 建 人:zy 日期:2014-07-01 */
/*版 本1.2 */
//显示数字
uchar du_num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
void delay_1ms(uchar x)//1ms延迟函数
{
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
void wei(uchar i) //位选信号输入
{ //i=i+1;
switch (i)
{ case 0:{io_A=0;io_B=0;io_C=0;} break;
case 1:{io_A=1;io_B=0;io_C=0;} break;
case 2:{io_A=0;io_B=2;io_C=0;} break;
case 3:{io_A=1;io_B=1;io_C=0;} break;
case 4:{io_A=0;io_B=0;io_C=1;} break;
case 5:{io_A=1;io_B=0;io_C=1;} break;
case 6:{io_A=0;io_B=1;io_C=1;} break;
default: ; break;
}
}
/*********************************************************************
*
* 函 数 名: Shu_Display()
* 功能描述: 将数字显示到数码管上,显示格式4+2
* 函数说明: 段选位选,动态刷新数码管
* 调用函数: delay_1ms fmod()
* 全局变量: 无
* 输 入: 1个double类型数据
* 返 回: 无
* 设 计 者:zy 日期:2014-07-01
* 修 改 者:zy 日期:2016-07-08
* 版 本: 1.2
***********************************************************************/
void Shu_Display(double js)
{uchar i; //循环变量
static uchar suff[6]; //数据处理暂存数组
static uint cuff[4]; //提取各位有关
static double n=1,y; //与小数截取有关
static uint count; //暂存
y=fmod(js,n); //分离js小数部分 存在y中
count=js; //强制类型转换,取js整数部分
suff[0] = count/1000; //取千位
cuff[0] = count%1000;
suff[1] = cuff[0]/100; //取百位
cuff[1] = cuff[0]%100;
suff[2] = cuff[1]/10; //取十位
suff[3] = cuff[1]%10; //取个位
count = y*1000; //小数部分。扩大1000倍提取。
cuff[2] = count%1000;
suff[4] = cuff[2]/100; //小数点后一位
cuff[3] = cuff[2]%100;
suff[5] = cuff[3]/10; //小数点后2位
io_shu=0; //打开3-8译码器
for(i=0;i<6;i++)
{
wei(i); //位选
io_dm=du_num[suff[i]];//段选
if(i==3) io_DP=1;
delay_1ms(1); //延迟
}
}