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