#include "seg.h"
////sfr P2 = 0xA0;//仿真使用
//sbit DAT = P2^0;
//sbit OE = P2^1;
//sbit LCK = P2^2;
//sbit SCK = P2^3;
//开发板使用
sfr P4 = 0xC0;
sbit DAT = P4^0;
sbit OE = P4^1;
sbit LCK = P4^2;
sbit SCK = P4^3;
//代码转换:pucSeg_Buf-显示字符串,pucSeg_Code-显示字形码-段码
//全局变量:pucSeg_Buf-显示字符串,pucSeg_Code-显示字形码-段码
void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code)
{
unsigned char i, j=0, ucSeg_Code;
for(i=0; i<4; i++, j++)//逐位进行字符和字形码的转换
{
switch(pucSeg_Buf[j])
{ // 低电平点亮段,段码[MSB...LSB]对应码顺序为[dp g f e d c b a]
case '0': ucSeg_Code = 0xc0; break; // 1 1 0 0 0 0 0 0
case '1': ucSeg_Code = 0xf9; break; // 1 1 1 1 1 0 0 1
case '2': ucSeg_Code = 0xa4; break; // 1 0 1 0 0 1 0 0
case '3': ucSeg_Code = 0xb0; break; // 1 0 1 1 0 0 0 0
case '4': ucSeg_Code = 0x99; break; // 1 0 0 1 1 0 0 1
case '5': ucSeg_Code = 0x92; break; // 1 0 0 1 0 0 1 0
case '6': ucSeg_Code = 0x82; break; // 1 0 0 0 0 0 1 0
case '7': ucSeg_Code = 0xf8; break; // 1 1 1 1 1 0 0 0
case '8': ucSeg_Code = 0x80; break; // 1 0 0 0 0 0 0 0
case '9': ucSeg_Code = 0x90; break; // 1 0 0 1 0 0 0 0
case 'A': ucSeg_Code = 0x88; break; // 1 0 0 0 1 0 0 0
case 'B': ucSeg_Code = 0x83; break; // 1 0 0 0 0 0 1 1
case 'C': ucSeg_Code = 0xc6; break; // 1 1 0 0 0 1 1 0
case 'D': ucSeg_Code = 0xA1; break; // 1 0 1 0 0 0 0 1
case 'E': ucSeg_Code = 0x86; break; // 1 0 0 0 0 1 1 0
case 'F': ucSeg_Code = 0x8E; break; // 1 0 0 0 1 1 1 0
case 'H': ucSeg_Code = 0x89; break; // 1 0 0 0 1 0 0 1
case 'L': ucSeg_Code = 0xC7; break; // 1 1 0 0 0 1 1 1
case 'P': ucSeg_Code = 0x8C; break; // 1 0 0 0 1 1 0 0
case '-': ucSeg_Code = 0xbf; break; // 1 0 1 1 1 1 1 1
default: ucSeg_Code = 0xff; // 1 1 1 1 1 1 1 1
}
if(pucSeg_Buf[j+1] == '.')
{
ucSeg_Code &= 0x7f; // 小数点处理
j++;
}
pucSeg_Code[i] = ucSeg_Code;
}
}
// 数码管显示芯片74H595的驱动函数:ucSeg_Code-显示字形码-段码,ucSeg_Pos-显示位置
void Seg_Disp(unsigned char ucSeg_Code,unsigned char ucSeg_Pos)
{
unsigned char i; //8位
unsigned int temp; //16位
temp = (1<<(8+ucSeg_Pos)) + ucSeg_Code;
//移位一共是12位=4位字位码(在左边高位,共阳极1-选中)+8位字形码(在低位)
LCK = 0; //关闭锁存器
for(i=0; i<12; i++)//74H595的串行转并行12位数据=8位段码值+4位位码值
{
SCK = 0; // 关闭 移位串行数据,下降沿有效
if(temp & 0x800) //取第13位,如果12位数据移位结束1000 0000 0000,
DAT = 1; //MCU停止串行数据传输
else
DAT = 0;//MCU继续串行数据传输
temp <<= 1;//左移位并赋值数据
SCK = 1; // 移位串行数据,上升沿有效
}
LCK = 1; // 锁存数据,上升沿有效
OE = 0; //三态驱动器,关闭并行输出数据
}