8051单片机驱动TM1620任意字符循环显示程序(详细注释版)

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);

        } 


   }

}

猜你喜欢

转载自blog.csdn.net/weixin_44212493/article/details/88792618
今日推荐