文档库 最新最全的文档下载
当前位置:文档库 › TM1623TM1628共阳程序

TM1623TM1628共阳程序

/*****************************************************************************
*版权信息:----- 深圳天微电子 ---------
*文 件 名:TM1628-V1.0
*当前版本:V1.0
*MCU 型号:STC12C5608AD
*开发环境:Keil uVision4
*晶震频率:11.0592MHZ
*完成日期:2013-12-16
*程序功能:1.数码管驱动:

*免责声明:1.此程序为TM1628 TM1623共阳 驱动LED数码管显示演示程序,仅作参考之用。
2.如有直接使用本例程程序造成经济损失的,本人不承担任何责任
********************************************************************************/

#include //MCU头文件
#include //包含nop指令头文件

#define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义


#define guango //使用光耦
/********************定义控制端口**********************/
sbit DIO=P1^0; //定义DIO
sbit CLK=P1^1; //定义CLK
sbit STB=P1^2; //定义STB
#ifdef guango
sbit Dout=P1^0;
#else
sbit Dout=P2^5;
#endif
char flag = 0;


/********************定义数据*************************/
unsigned char Key[5]={0}; //为存储按键值定义的数组
const unsigned char BCD_LABLE_ALL[19]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};

unsigned char BCD_LABLE_anode[16] = {0}; //用于保存共阳显示数据 TM1628显示寄存器中的数据 就是数组中的值

unsigned char cmd_dis_mode = 0x8f;
/***************延时函数**************/
void delay_nms(unsigned int n)
{
unsigned int i;
while(n--)
for(i=0;i<550;i++);
}
void delay_nus(unsigned int n)
{
unsigned int i;
while(n--)
for(i=0;i<50;i++);
}

/***************发送8bit数据,从低位开始**************/
void send_8bit(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
CLK=0;
if(dat&0x01)
DIO=1;
else
DIO=0;
_nop_();
_nop_();
_nop_();

CLK=1;
dat>>=1;

}
CLK=0;
DIO=0;
}

/******************发送控制命令***********************/
void send_command(unsigned char word)
{
STB=1;
_nop_();

STB=0;
send_8bit(word);

}

void Write_String(unsigned char *p,unsigned char cnt) //cnt最大14byte
{
unsigned char i;

for(i=0;i{
send_8bit(*p++);

}

}

//8段数码显示的共阴数据到共阳数据的转换 外加数码位移 -- 实质是一个数组的转置 并且只改变位
void NE_C(unsigned char ydata,unsigned char cnt)
{
char i=0,j=0;
if(cnt>0)
{
if(cnt>8)
{
//myflag |= 0x01;
cnt = cnt -9;
for(i=1;i<16;i=i+2)
{

if(ydata&0x01 == 0x01)
{
BCD_LABLE_anode[i] |= (0x01<}
else
{
BCD_LABLE_anode[i] &= ~(0x01<}
ydata = (ydata>>

1);
}

}
else
{
cnt = cnt -1;
for(i=0;i<16;i=i+2)
{

if((ydata&0x01) == 0x01)
{
BCD_LABLE_anode[i] |= (0x01<}
else
{
BCD_LABLE_anode[i] &= ~(0x01<}
ydata = (ydata>>1);
}
}
}



}

//===============在第 cnt1个数码管 显示 BCD_LABLE_ALL[number]这个字符
//BCD_LABLE_ALL[1]表示显示1 BCD_LABLE_ALL[2]表示显示2==================================
void display(unsigned char number,unsigned char cnt1)
{

NE_C(BCD_LABLE_ALL[number],cnt1);
send_command(0x03); //模式设置 10段7位
send_command(0x40); //设置数据命令:普通模式、地址自增1,写数据到显存
send_command(0xc0); //设置显示地址命令:从00H开始
Write_String(BCD_LABLE_anode,14);//连续写入 14 个字节 因为1628总共有14个显存 1620B也一样要写入14个显存字节

send_command(cmd_dis_mode);
STB=1;
}
void display_fixedadd(unsigned char number,unsigned char cnt1)
{

NE_C(BCD_LABLE_ALL[number],cnt1);
send_command(0x44); //设置数据命令:普通模式、地址固定模式,写数据到显存
send_command(0xc2);
send_8bit(0x00);//在02地址写00

send_command(cmd_dis_mode);
STB=1;

}


/****************读取按键值并存储*******************/
void read_key()
{
unsigned char i,j;
send_command(0x42);
Dout=1; //释放DIO
for(j=0;j<5;j++)
{
for(i=0;i<8;i++)
{
CLK=0;
Key[j]=Key[j]>>1;
CLK=1;
if(Dout)
Key[j]=Key[j]|0x80;
nop;
}
nop;
nop;
}
CLK=0;
Dout=0;

STB=1;
}
void key_process()
{
read_key();
delay_nms(40);
if(Key[0]!=0x00)
{
flag = 1;
//display(1,1); //K0与SEG1按键按下,数码管显示数字1
//delay_nms(10);
send_command(0x87);
}
if(Key[1]!=0x00)
{
//display(2,1); //K0与SEG1按键按下,数码管显示数字1
//display_fixedadd();
cmd_dis_mode = 0x87;
send_command(cmd_dis_mode);
//delay_nms(10);
//send_command(0x43);
flag = 0;
}
if(Key[2]!=0x00)
{
display(0,3); //K0与SEG1按键按下,数码管显示数字1
cmd_dis_mode = 0x8f;
}
if(Key[3]!=0x00)
{
display(0,4); //K0与SEG1按键按下,数码管显示数字1

}
//.......................
}


void main()
{
unsigned char i = 0;
P1M0 = 0;
P1M1 = 0x0F;
P2M0 = 0X20;
P2M1 = 0x00;

for(i=1;i<=8;i++)
{

display(i%10,i); //从第一个到第八个数码管一次 显示 1 2 3 4 5 6 7 8
delay_nms(5);
}
while(1)
{
for(i=1;i<=8;i++)
{
display(i%10,i); //从第一个到第八个数码管一次 显示 1 2 3 4 5 6 7 8
}
key_process();
delay_nms(5);

}
}



相关文档
相关文档 最新文档