标题:
TM1620芯片驱动6位8段显示的单片机源程序
[打印本页]
作者:
zkele
时间:
2018-4-8 19:07
标题:
TM1620芯片驱动6位8段显示的单片机源程序
折腾一天终于将TM1620芯片驱动6位8段显示搞出来了,共享一下,源码传上。
TM1620.JPG
(82.65 KB, 下载次数: 110)
下载附件
2018-4-8 19:07 上传
单片机源程序如下:
/*
文件名: TM1620
单片机型号: stc90c52
开发环境: Keil uVision2
晶震频率: 12M
功能:驱动共阴LED数码屏做计时显示,可由按键控制时钟暂停,开始,停止以及显示0-9数字
驱动6位8段数码显示完美,OK
*/
#include<reg52.h>
#include<intrins.h>
#define nop _nop_();
#define uchar unsigned char
#define uint unsigned int
sbit stb =P0^0; //定义片选通讯口
sbit clk =P0^1; //定义时钟通讯口
sbit dio =P0^2; //定义数据输入/输出通讯口
uchar cir_LED[6]={ 0x80,0x40,0x02,0x01,0x04,0x10};//数码屏圆圈做动态显示,我的PCB接线方式不同所以需修改
uchar show[12] = { 0x76,0x00,0xb5,0x0,0x15,0x0,0x15,0x0,0xd7,0x0,0x0,0x0};//初始化显示“HELLO”字符代码
uchar TIME_seconds,seconds_2,sub_1,sub_2,shi_1,shi_2; //时间寄存器,依次从秒个位至小时十位
uchar TIME_count; //定时中断控制
uchar count6=0;
/*********************************
功能: TM1620写数据
**********************************/
void write(uchar wr_data)
{
uchar i;
stb =0; //给有效的片选信号(片选信号是低电平有效)
nop;
nop;
for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
{
clk =0;
nop;
nop;
wr_data >>= 1;//移位数据,低位在前!
nop;
dio = CY;
nop;
nop;
clk =1;
nop;
}
}
/*********************************
TM1620控制指令
功能: 驱动LED屏做相应的显示
**********************************/
void xianshi(uchar show_led[12])
{
uchar h;
stb = 1;
clk = 1;
dio = 1;
write(0x02);//显示模式设置,设置为6个GRID,8个SEG
stb = 1;
write(0x40);//写数据到显示寄存器,采用地址自动加一
stb = 1;
write(0xc0);//显示寄存器的00H单元开始
for(h=0;h<12;h++)
{
write(show_led[h]);//给显示寄存器送数据,
}
stb=1;
write(0x8b);//显示控制参数,点亮数码屏幕,亮度可以通过改变低三位调节
}
/**********************************
定时中断函数入口
功能: 每50MS中断一次
**********************************/
void time0(void) interrupt 1 using 2
{
TH0=0x3c;
TL0=0xb0;
TIME_count++;
if(TIME_count==20)
{
TIME_count = 0;
TIME_seconds++; // 秒寄存器加1
count6 +=1;
show[2] = (show[2]^0x10);//数码屏幕冒号驱动位
}
}
/*********************************
计时函数
功能: 处理时钟显示
**********************************/
void TIME_show()
{
uchar CODE[] ={0xD7,0x42,0xE5,0xE3,0x72,0xB3,0xB7,0xC2,0xF7,0xF3,0xF6,0x37,0x95,0x67,0xB5,0xB4};//my board seg code
// {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
if(count6 == 6)
{
count6 = 0;
}
show[0] = cir_LED[count6];//0x0;//关闭第一位显示
show[2] = cir_LED[count6]; //数码屏圆圈驱动位
show[10] = CODE[TIME_seconds];// 数码屏上最后一个“8”
show[8] = CODE[seconds_2]; //数码屏倒数第二个“8”字,
show[6] = CODE[sub_1];
show[4] = CODE[sub_2];
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;
}
if(sub_2 == 6)
{
sub_2 = 0; //时钟每60分自动清0
sub_2 = 0;
sub_1 = 0;
seconds_2 = 0;
TIME_seconds = 0;
}
}
/********************************
延时函数
功能: 1ms延时
**********************************/
void delay_ms(uchar cyc)
{
//当将=1的时候,延时1ms
uchar ii,jj;
for(jj=1;jj<=cyc;jj++)
{
for(ii=0;ii<200;ii++)
{
nop;
}
}
}
/*********************************
主函数
**********************************/
void main()
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;//初始化单片机I/O口
TMOD=0x01; //定时器设置
TH0=0x3c;
TL0=0xb0;
IE=0x82;
TF0=1;
xianshi(show);//初始化显示“HELLO”字符
delay_ms(230);
delay_ms(230);
delay_ms(230);
delay_ms(230);
delay_ms(230); //共延时1s
TR0 = 1;
//show[2] = 0x01;
while(1)//循环
{
stb = 1;
dio = 1;
clk = 1;
TIME_show(); //控制做计时显示
xianshi(show);//根据计时拆分的值,给显示寄存器送相应的显示数据
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
test1.rar
(1.91 KB, 下载次数: 269)
2018-4-8 19:07 上传
点击文件名下载附件
STC90C52RC
下载积分: 黑币 -5
作者:
wdliming
时间:
2018-10-18 08:34
谢谢分享!!
作者:
cuixianjin
时间:
2018-11-8 16:04
给力,正好需要
作者:
cuixianjin
时间:
2018-11-8 16:05
谢谢,正好需要
作者:
kanwoe
时间:
2019-8-5 13:48
感谢分享,正好需要。
作者:
k80213082
时间:
2019-10-6 15:40
谢谢分享!!,正在学STM8配上这个做个时钟
作者:
後生仔,拼搏
时间:
2019-11-12 10:41
注释很详细,可以说明一下真值表是根据什么写出来的吗
作者:
後生仔,拼搏
时间:
2019-11-12 10:43
代码注释很详细,可以再说明一下真值表是怎么写出来的吗,目前卡在真值表上了
作者:
zpywz
时间:
2020-1-29 18:31
谢谢,正好需要
作者:
sjx2012
时间:
2020-3-9 15:57
谢谢分享!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1