学过51单片机的回过头来都会觉得51还是比较简单的,在此我将贴出在我的学习过程中,把对各种外设所进行的操作,封装成函数库的形式,以供新手学习。
注:使用的单片机是stc12c5a60s2,该系列单片机属于加强51,在运行速度上是普通51的8-12倍,有关时序的操作需要加以注意。
申明:本系列全部例程通过单片机开发板,实验亲测有效!
#include
#include
unsigned char code table[] ={ //将数码管显示数字定义在ROM区
0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71};
/* io口的使用 */
#define dataPort P0 //数据端口
#define choosePort P1 //片选端口
void delayms(unsigned int t) //延时1ms
{
unsigned char a,b,c;
while(t--)
{
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=12;a>0;a--);
}
}
/*
* 函数说明:数码管显示整数
* 传入参数:unsigned int(两个字节,范围是0~65535,八位数码管只用到5位)
* 传出参数:无
* 作者:Brunon
* 时间:2017.5.2
* 备注:
*/
void displayInteger(unsigned int num)
{
unsigned char i;
unsigned char weixuan = 0x7f;
unsigned char duanxuan[8];
duanxuan[0] = 0; //最高位
duanxuan[1] = 0;
duanxuan[2] = 0;
duanxuan[3] = num/10000;
duanxuan[4] = num/1000%10;
duanxuan[5] = num/100%10;
duanxuan[6] = num/10%10;
duanxuan[7] = num%10; //最低位,个位
for(i=0; i<8; i++)
{
choosePort = _cror_(weixuan, i); //位选循环左移i位
dataPort = table[duanxuan[i]];//段选
delayms(1);
dataPort = 0x00; //消影
}
}
/*
* 函数说明:数码管显示浮点数
* 传入参数:float(四个字节,范围是-3.40E+38 ~ +3.40E+38,八位数码管不够)
* 传出参数:无
* 作者:Brunon
* 时间:2017.5.2
* 备注:数码管显示范围是:-999.9999 ~ +999.9999,精确到小数点后四位
*/
void displayFloat(float num)
{
unsigned char duanxuan[8];
unsigned char i;
unsigned char weixuan = 0x7f;
float temp = num;
unsigned long solve = temp*10000; //化为整数处理
if(temp < 0)
{
choosePort = 0x7f;
dataPort = 0x40;
delayms(1);
dataPort = 0x00;
temp = -temp;
}
//duanxuan[0] = 0; //最高位是符号位
duanxuan[1] = solve/1000000;
duanxuan[2] = solve/100000%10;
duanxuan[3] = solve/10000%10; //此处需要处理小数点
duanxuan[4] = solve/1000%10;
duanxuan[5] = solve/100%10;
duanxuan[6] = solve/10%10;
duanxuan[7] = solve%10; //最低位
for(i=0; i<8; i++)
{
choosePort = _cror_(weixuan, i); //位选循环左移i位
if(i == 0) //处理符号位
{
if(num < 0) dataPort = 0x40;
else dataPort = 0x00;
}
else if(i == 3)
{
dataPort = table[duanxuan[i]] | 0x80; //添加小数点
}
else
{
dataPort = table[duanxuan[i]];//段选
}
delayms(1);
dataPort = 0x00; //消影
}
}
void main()
{
unsigned int num = 65534;
float num0 = 78.6778;
while(1)
{
displayFloat(num0);
}
}