8051单片机驱动TM1620任意字符循环显示程序
本人亲写,亲测可用
时序图
/**************************************************
- 名称:STC51驱动TM1620 4位数码管显示
- MCU: STC11F06
- 主频:11.0592晶振
*************************************************/
#include<REG52.h>
#include<stdio.h>
#include<intrins.h>
#define dissetmode 0x02 //显示模式设置 6位8段显示
#define writedatamode_z 0x40 //自动加一方式显存 写数据到显示寄存器
#define writeledmode_z 0x41 //自动加一方式写LED显存命令
#define readkeymode 0x42 //读按键命令
#define readswmode 0x43 //读SW命令
//#define writedatamode_g 0x40 //固定模式
//#define writeledmote_g 0x45 //固定模式写LED显存命令
#define startaddress 0xc0 //自动加1显示的起始地址设置,为00H
#define disconmode 0x8F //显示控制,显示开
#define uchar unsigned char
#define uint unsigned int
uchar code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
unsigned long TmData; // 定义无符号长整型变量TmData
uint i; // 定义无符号整形变量 I
uchar vol; // 定义无符号字符变量 vol
sbit STB=P3^7; //定义端口 3个位声明
sbit CLK=P1^2;
sbit DIN=P1^5;
void delay(uint z) // 定义延时函数
{
uint x,y;
for(x=1000;x>0;x–)
for(y=z;y>0;y–);
}
void indate(uchar x) //送八位数据 高位先传
{
uchar i; // 这个I是传送数据个数变量
STB=0;
for(i=0;i<8;i++) //先求解I=0(只求解一次),在求解I<8为真,然后执行下列语句,,共八次 0110 0101
{
CLK=0; // 上升沿传送数据
DIN=(bit)(x&0x01); // 求最右位然后赋值给DIN,对计算结果取位,只取最右边的一位
CLK=1; // 时钟准备下降,传送第一个数据位完毕
x>>=1; // 将传送数据转为二进制后,整体向右移动一位
}
CLK=0; // 准备在上升沿传送数据
}
void display() // 定义显示函数
{
uchar temp[4]; //定义四个变量,即要显示的四个数字
temp[0]=TmData%10000/1000; //先把TmData求余数后再求商,最后在赋值给temp[0],即取出TmData的千位数
temp[1]=TmData%1000/100; //同上
temp[2]=TmData%100/10;
temp[3]=TmData%10;
DIN=1;CLK=1;STB=1; //初始化indate(dissetmode); //设置显示模式STB=1;indate(writedatamode_z); //自动模式 自动加1模式STB=1; //准备传输数据for(i=0;i<4;i++) //此处I变量为地址,相当于打开四个位选{ indate(startaddress+i*2); //传地址indate(a[temp[i]]); //传数据STB=1; // 数据传输完毕,STB被拉高 } indate(disconmode); //显示控制命令STB=1;
}
void main()
{
while(1){ for(vol=0;vol<9;vol++){ TmData=vol;display();delay(1000);} }
}
最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要 程序完整源代码和 设计文件,请在下方留言或者私信我,看到后会第一时间回复。
谢谢!