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

        } 


   }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章