TM1629A芯片参考程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
tm1629.c
/* *版权信息: *文件名: TM1629A芯片参考程序 *当前版本: 1.0 *单片机型号: AT89S52 *开发环境: Keil uVision3 *晶震频率: 12M *作者: *完成日期: 2009-05-05 功能: 驱动共阴LED数码屏做时钟显示,可由按键控制时钟暂 停,开始,停止以及其它数码管显示0-9数字,
if(TIME_seconds == 10) 出。
//对时间数据进行处理,以免溢
{
TIME_seconds = 0;
seconds_2+=1;
}
if(seconds_2 == 6)
{
seconds_2 = 0;
sub_1 +=1;
}
if(sub_1 == 10)
{
sub_1 = 0;
sub_2 +=1;
show[14] = CODE[seconds_2]; //数码屏倒数第二个“8”字,
第6页
tm1629.c
show[13] = CODE[sub_1]|T_count;
show[12] = CODE[sub_2];
show[11] = CODE[shi_1]|T_count;
show[10] = CODE[shi_2];
//K1与
SEG6按键按下,key_FLAG1 = 0x00启动定时器,时间开始。
if((key[1]==0x08)){count7 = 0x01;TR0 = 0;key_FLAG1 = 0x02;} //当
K0与SEG6按键按下,key_FLAG1 = 0x02单独显示数字按键无效!
暂停。
if((key[1]==0x80))
uchar h; stb = 1; clk = 1; dio = 1; write(0x40);//写数据到显示寄存器,采用地址自动加一 stb = 1; write(0xc0);//显示寄存器的00H单元开始 for(h=0;h<16;h++) { write(show_led[h]);//给显示寄存器送数据, } stb=1; write(0x8b);//显示控制参数,点亮数码屏幕,亮度可以通过改变低 三位调节
}
if(sub_2 == 6)
{
sub_2 = 0;
shi_1 +=1;
}
if(shi_1 == 10)
{
shi_1 = 0;
shi_2 +=1;
}
if(shi_2 == 6)
//时钟每60小时自动清0
{
shi_2 = 0;
shi_1 = 0;
sub_2 = 0;
sub_1 = 0;
第7页
tm1629.c
{ key[count3]=read();
//读4BIT按键数据,
}
if((key_FLAG1 != 0x02))
{
if((key[0]==0x01)){key_LED= 0;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG1按键按 下,数码管显示数字0
数码管可以由按键调节显示不同数字
*/
#include<reg52.h>
#include<intrins.h>
#define nop _nop_();
#define uchar unsigned char
#define uint unsigned int
sbit stb =P1^0;
//定义片选通讯口
if((key[0]==0x08)){key_LED= 3;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K0与SEG2按键按 下,数码管显示数字3。
if((key[0]==0x80)){key_LED= 4;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K0与SEG3按键按 下,数码管显示数字4。
uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码 uchar TIME_seconds,seconds_2,sub_1,sub_2,shi_1,shi_2; //时间寄存 器,依次从秒个位至小时十位 uchar TIME_count; //定时中断控制制位 uchar T_count; //时钟小数点闪 uchar count4; //保存按键控制对应的数码管闪 uchar key_FLAG1;//按键标志位 uchar key_COUNT1;//按键移动数动显示数据 uchar key_LED=0; //按键单独显示赋值寄存器
// K2与SEG7按键按下,控制数码
{
第5页
时间暂停。
tm1629.c
show[key_COUNT1] = count4; key_FLAG1 = 0x01;//key_FLAG1 = 0x00关闭定时器,
if((key_COUNT1==0)){ key_COUNT1 = 10;}
key_COUNT1 -= 1;
**********************************/
unsigned char read()
{
uchar d; stb = 0; //给有效的片选信号(片选信号是低电平有效) dio = 1; //将DIO置高,因为没有按键按下时,键值默认为00H, 此时为了与键值有区别
for(d=0;d<8;d++) {
if((key[0]==0x40)){key_LED= 5;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K1与SEG3按键按 下,数码管显示数字5。
if((key[0]==0x20)){key_LED= 6;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG4按键按 下,数码管显示数字6。
sbit clk =P1^1;
//定义时钟通讯口
sbit dio =P1^2;
//定义数据输入/输出通讯口
bdata uchar y=0;//定义可以位寻址全局变量y
sbit y7 =y^7;
uchar show[16] = {0x76,0x7b,0x38,0x38,0x3f,0x40,0x40,0x40,0x40,0x40};//初始化显示“ HELLO”字符代码
// K1与SEG7按键按
{
show[key_COUNT1] = count4; key_FLAG1 = 0x01;//key_FLAG1 = 0x00关闭定时器, 时间暂停。
key_COUNT1 ++;
if((key_COUNT1 == 10)){ key_COUNT1 = 0;}
}
if((key[1] == 0x20)) 管左移一位
if((key[1]==0x02)){key_LED= 9;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG5按键按 下,数码管显示数字9
}
if((key[1]==0x04)){key_FLAG1= 0x00; count7 = 0;}
uchar count7;
第1页
tm1629.c
/********************************* 功能: TM1629写数据
**********************************/
void write(uchar wr_data)
{
uchar i;
stb =0; 效)
}
if((key_FLAG1 == 0x01)){ count4 = show[key_COUNT1];}
//
保存当前按键位显示数据
if((count7 != 0x01)){ key_FLAG1 = 0;}
}
/********************************** 定时中断函数入口
功能: 每50MS中断一次
T_count ^= 0x80;
}
}
/********************************* 时钟函数
功能: 处理时钟显示
*******************************பைடு நூலகம்**/
void TIME_show()
{
//sub_1 = sub_1|0x80;
//shi_1 = shi_1|0x80; show[15] = CODE[TIME_seconds];// 数码屏上最后一个“8”字,依次 下去
clk = 0;
第2页
tm1629.c
nop; if(dio==1)
{ y7 = 1;
} else
{ y7 = 0; } clk = 1; if(d!=7){y=(y>>1);} nop; nop; } return(y);
} /*********************************
TM1629控制指令 功能: 驱动LED屏做相应的显示 **********************************/ void xianshi(uchar show_led[16]) {
// K0与SEG7按键按下,
key_FLAG1 = 0x00启动定时器,时间开始。
{
key_FLAG1 = 0x00;
count7 = 0;
shi_2 = 0;
shi_1 = 0;
sub_2 = 0;
sub_1 = 0;
seconds_2 = 0;
TIME_seconds = 0;
}
if((key[1] == 0x40)) 下,控制数码管右移一位
stb = 1;
第3页
tm1629.c }
//-------读按键以及相应的显示处理-------
void panjian()
{
uchar count3,key[4];
stb = 1; write(0x42);//送读按键命令(42H),
for(count3=0;count3<5;count3++)
if((key[0]==0x02)){key_LED= 1;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG1按键按 下,数码管显示数字1
if((key[0]==0x04)){key_LED= 2;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K1与SEG2按键按 下,数码管显示数字2。
if((key[0]==0x10)){key_LED= 7;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG4按键按
第4页
下,数码管显示数字7。
tm1629.c
if((key[1]==0x01)){key_LED= 8;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG5按键按 下,数码管显示数字8。
seconds_2 = 0; TIME_seconds = 0; } } /********************************* 延时函数 功能: 1ms延时 **********************************/ void delay_ms(uchar cyc) { //当将=1的时候,延时1ms uchar ii,jj; for(jj=1;jj<=cyc;jj++) {
**********************************/
void time0(void) interrupt 1 using 2
{
TH0=0x3c;
TL0=0xb0;
TIME_count++;
if(TIME_count==21)
{
TIME_count = 0; TIME_seconds++; // 秒寄存器加1
//给有效的片选信号(片选信号是低电平有
数据
nop;
nop; for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位
{
clk =0;
nop;
nop; wr_data >>= 1;//移位数据,低位在前!
nop;
dio = CY;
nop;
nop;
clk =1;
nop;
}
}
/********************************* 功能:读按键子程序 由y 返回1BIT按键数据
/* *版权信息: *文件名: TM1629A芯片参考程序 *当前版本: 1.0 *单片机型号: AT89S52 *开发环境: Keil uVision3 *晶震频率: 12M *作者: *完成日期: 2009-05-05 功能: 驱动共阴LED数码屏做时钟显示,可由按键控制时钟暂 停,开始,停止以及其它数码管显示0-9数字,
if(TIME_seconds == 10) 出。
//对时间数据进行处理,以免溢
{
TIME_seconds = 0;
seconds_2+=1;
}
if(seconds_2 == 6)
{
seconds_2 = 0;
sub_1 +=1;
}
if(sub_1 == 10)
{
sub_1 = 0;
sub_2 +=1;
show[14] = CODE[seconds_2]; //数码屏倒数第二个“8”字,
第6页
tm1629.c
show[13] = CODE[sub_1]|T_count;
show[12] = CODE[sub_2];
show[11] = CODE[shi_1]|T_count;
show[10] = CODE[shi_2];
//K1与
SEG6按键按下,key_FLAG1 = 0x00启动定时器,时间开始。
if((key[1]==0x08)){count7 = 0x01;TR0 = 0;key_FLAG1 = 0x02;} //当
K0与SEG6按键按下,key_FLAG1 = 0x02单独显示数字按键无效!
暂停。
if((key[1]==0x80))
uchar h; stb = 1; clk = 1; dio = 1; write(0x40);//写数据到显示寄存器,采用地址自动加一 stb = 1; write(0xc0);//显示寄存器的00H单元开始 for(h=0;h<16;h++) { write(show_led[h]);//给显示寄存器送数据, } stb=1; write(0x8b);//显示控制参数,点亮数码屏幕,亮度可以通过改变低 三位调节
}
if(sub_2 == 6)
{
sub_2 = 0;
shi_1 +=1;
}
if(shi_1 == 10)
{
shi_1 = 0;
shi_2 +=1;
}
if(shi_2 == 6)
//时钟每60小时自动清0
{
shi_2 = 0;
shi_1 = 0;
sub_2 = 0;
sub_1 = 0;
第7页
tm1629.c
{ key[count3]=read();
//读4BIT按键数据,
}
if((key_FLAG1 != 0x02))
{
if((key[0]==0x01)){key_LED= 0;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG1按键按 下,数码管显示数字0
数码管可以由按键调节显示不同数字
*/
#include<reg52.h>
#include<intrins.h>
#define nop _nop_();
#define uchar unsigned char
#define uint unsigned int
sbit stb =P1^0;
//定义片选通讯口
if((key[0]==0x08)){key_LED= 3;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K0与SEG2按键按 下,数码管显示数字3。
if((key[0]==0x80)){key_LED= 4;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K0与SEG3按键按 下,数码管显示数字4。
uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码 uchar TIME_seconds,seconds_2,sub_1,sub_2,shi_1,shi_2; //时间寄存 器,依次从秒个位至小时十位 uchar TIME_count; //定时中断控制制位 uchar T_count; //时钟小数点闪 uchar count4; //保存按键控制对应的数码管闪 uchar key_FLAG1;//按键标志位 uchar key_COUNT1;//按键移动数动显示数据 uchar key_LED=0; //按键单独显示赋值寄存器
// K2与SEG7按键按下,控制数码
{
第5页
时间暂停。
tm1629.c
show[key_COUNT1] = count4; key_FLAG1 = 0x01;//key_FLAG1 = 0x00关闭定时器,
if((key_COUNT1==0)){ key_COUNT1 = 10;}
key_COUNT1 -= 1;
**********************************/
unsigned char read()
{
uchar d; stb = 0; //给有效的片选信号(片选信号是低电平有效) dio = 1; //将DIO置高,因为没有按键按下时,键值默认为00H, 此时为了与键值有区别
for(d=0;d<8;d++) {
if((key[0]==0x40)){key_LED= 5;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K1与SEG3按键按 下,数码管显示数字5。
if((key[0]==0x20)){key_LED= 6;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG4按键按 下,数码管显示数字6。
sbit clk =P1^1;
//定义时钟通讯口
sbit dio =P1^2;
//定义数据输入/输出通讯口
bdata uchar y=0;//定义可以位寻址全局变量y
sbit y7 =y^7;
uchar show[16] = {0x76,0x7b,0x38,0x38,0x3f,0x40,0x40,0x40,0x40,0x40};//初始化显示“ HELLO”字符代码
// K1与SEG7按键按
{
show[key_COUNT1] = count4; key_FLAG1 = 0x01;//key_FLAG1 = 0x00关闭定时器, 时间暂停。
key_COUNT1 ++;
if((key_COUNT1 == 10)){ key_COUNT1 = 0;}
}
if((key[1] == 0x20)) 管左移一位
if((key[1]==0x02)){key_LED= 9;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG5按键按 下,数码管显示数字9
}
if((key[1]==0x04)){key_FLAG1= 0x00; count7 = 0;}
uchar count7;
第1页
tm1629.c
/********************************* 功能: TM1629写数据
**********************************/
void write(uchar wr_data)
{
uchar i;
stb =0; 效)
}
if((key_FLAG1 == 0x01)){ count4 = show[key_COUNT1];}
//
保存当前按键位显示数据
if((count7 != 0x01)){ key_FLAG1 = 0;}
}
/********************************** 定时中断函数入口
功能: 每50MS中断一次
T_count ^= 0x80;
}
}
/********************************* 时钟函数
功能: 处理时钟显示
*******************************பைடு நூலகம்**/
void TIME_show()
{
//sub_1 = sub_1|0x80;
//shi_1 = shi_1|0x80; show[15] = CODE[TIME_seconds];// 数码屏上最后一个“8”字,依次 下去
clk = 0;
第2页
tm1629.c
nop; if(dio==1)
{ y7 = 1;
} else
{ y7 = 0; } clk = 1; if(d!=7){y=(y>>1);} nop; nop; } return(y);
} /*********************************
TM1629控制指令 功能: 驱动LED屏做相应的显示 **********************************/ void xianshi(uchar show_led[16]) {
// K0与SEG7按键按下,
key_FLAG1 = 0x00启动定时器,时间开始。
{
key_FLAG1 = 0x00;
count7 = 0;
shi_2 = 0;
shi_1 = 0;
sub_2 = 0;
sub_1 = 0;
seconds_2 = 0;
TIME_seconds = 0;
}
if((key[1] == 0x40)) 下,控制数码管右移一位
stb = 1;
第3页
tm1629.c }
//-------读按键以及相应的显示处理-------
void panjian()
{
uchar count3,key[4];
stb = 1; write(0x42);//送读按键命令(42H),
for(count3=0;count3<5;count3++)
if((key[0]==0x02)){key_LED= 1;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG1按键按 下,数码管显示数字1
if((key[0]==0x04)){key_LED= 2;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K1与SEG2按键按 下,数码管显示数字2。
if((key[0]==0x10)){key_LED= 7;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG4按键按
第4页
下,数码管显示数字7。
tm1629.c
if((key[1]==0x01)){key_LED= 8;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG5按键按 下,数码管显示数字8。
seconds_2 = 0; TIME_seconds = 0; } } /********************************* 延时函数 功能: 1ms延时 **********************************/ void delay_ms(uchar cyc) { //当将=1的时候,延时1ms uchar ii,jj; for(jj=1;jj<=cyc;jj++) {
**********************************/
void time0(void) interrupt 1 using 2
{
TH0=0x3c;
TL0=0xb0;
TIME_count++;
if(TIME_count==21)
{
TIME_count = 0; TIME_seconds++; // 秒寄存器加1
//给有效的片选信号(片选信号是低电平有
数据
nop;
nop; for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位
{
clk =0;
nop;
nop; wr_data >>= 1;//移位数据,低位在前!
nop;
dio = CY;
nop;
nop;
clk =1;
nop;
}
}
/********************************* 功能:读按键子程序 由y 返回1BIT按键数据