📄 tec1622.txt
字号:
/**********************************************************************************************************
TEC6122数码管动态扫描显示模块
seg[],为要显示码段数组(7位,其中一位用作指示灯了),seg[0]对应最低位,seg[6]对应最高位。
sdot为小数点的显示位置,0不显示;1显示在个位;2显示在十位;3显示在百位;
TEC6122约定,先送低位,后送高位,最先送入显示芯片中移位寄存器的是第一位S1(个位),最后是第八位S8(十进制千万位)
*********************************************************************************************************/
void disp_led(unsigned char seg[],unsigned char sdot)
{
unsigned char dot[7];
switch(sdot) //判断小数点显示位置
{
case 0:{dot[0]=0;dot[1]=0;dot[2]=0;dot[3]=0;dot[4]=0;dot[5]=0;dot[6]=0;break; } //不显示小数点
case 1:{dot[0]=1;dot[1]=0;dot[2]=0;dot[3]=0;dot[4]=0;dot[5]=0;dot[6]=0;break; } //小数点显示在个位
case 2:{dot[0]=0;dot[1]=1;dot[2]=0;dot[3]=0;dot[4]=0;dot[5]=0;dot[6]=0;break; } //小数点显示在十位
case 3:{dot[0]=0;dot[1]=0;dot[2]=1;dot[3]=0;dot[4]=0;dot[5]=0;dot[6]=0;break; } //小数点显示在百位
case 4:{dot[0]=1;dot[1]=1;dot[2]=0;dot[3]=1;dot[4]=1;dot[5]=0;dot[6]=1;break; } //小数点显示在百位
default:break;
}
/*
8位段码数据必须一块发到芯片中去,不论段码端连接数码管还是指示灯。
段码数据在芯片中排列是有顺序的,规则就是,先进芯片的是放最低位,后进芯片的放最高位(其实就是进芯片中8个移位寄存器的排列顺序)。
seg[]数组中数据谁先谁后发送,要根据实际情况作相应的修改,总之最低位先进芯片。
*/
//温度(4位数码管)
load_number((seg[3]), (dot[0])); //十位S4
load_number((seg[2]), (dot[1])); //百位S3
load_number((seg[1]), (dot[2])); //千位S2
load_number((seg[0]), (dot[3])); //万位S1
//湿度(3位数码管)
load_number((seg[4]), (dot[4])); //十万位S7
load_number((seg[5]), (dot[5])); //百万位S6
load_number((seg[6]), (dot[6])); //千万位S5
//指示灯(连接到了最高位)
load_ledone(); //千万位S8
//-----------------------
send_latch_clock(); //发送锁存脉冲信号
}
/******************************************************************/
/* 加载将要显示的数据,num-显示数据,dp:1显示小数点,0不显示小数点*/
void load_number(unsigned char number, bit dp) // 串行送出一位LED数码字符(一个字节), dp,g,f,c,d.c,b,a; dp在最高位,
{
unsigned char i;
unsigned char temp;
//temp = ~number_code[number]; /* 使用共阳极数码管,所以编码取反 */
temp = number_code[number]; /* 使用共阴极数码管 */
if (dp)//
{
//temp &= 0x7f; //显示自身并加上小数点,与0x7f(二进制为01111111)相与即可以保留TEMP中数字又可以把最高位的小数点加上(使用共阳极数码管)
temp |= 0x80; //显示自身并加上小数点,与0x80(二进制为10000000)相或即可以保留TEMP中数字又可以把最高位的小数点加上(使用共阴极数码管)
}
for (i=0; i<8; i++)
{
if ( (temp & 0x80) == 0x80)//看第一位(左端字节高位)是否为1,即检验DS是否为1,( dp在最高位,在TEC6122中约定dp是最低位最先送入,a是最高位最后送入)Serial Data Input
{DS = 1;}
else
{DS = 0;}
temp <<= 1;//左移一位,通过移位寄存器,再检验DS位。
send_shift_clock(); /* 发移位脉冲信号 */
}
}
/*单个LED显示,对某个笔画置位操作,用于指示灯显示 */
void load_ledone(void) // 串行送出一位LED数码字符(一个字节), dp,g,f,c,d.c,b,a; 在TEC6122中dp在最高位,dp是最低位最先送入,a是最高位最后送入
{
if (dip)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 发移位脉冲信号 */
if (g)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 发移位脉冲信号 */
if (f)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 发移位脉冲信号 */
if (e)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 发移位脉冲信号 */
if (d)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 发移位脉冲信号 */
if (c)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 发移位脉冲信号 */
if (b)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 发移位脉冲信号 */
if (a)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 发移位脉冲信号 */
}
/* 发送移位时钟脉冲信号 */
void send_shift_clock(void)
{
SCP = 1;
_nop_();
SCP = 0;
}
/* 发送锁存脉冲信号 */
void send_latch_clock(void)
{
LCP = 1;
_nop_();
LCP = 0;
}
/***********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -