基於proteus的51微控制器模擬例項七十九、8位數碼管驅動晶片max7221應用例項
阿新 • • 發佈:2019-01-24
1、MAX7221是整合式共陰極數碼管驅動晶片。可以用來驅動8位7段式數碼管,也可以驅動條形LED或者8*8LED點陣
微控制器僅僅需要3個IO口就可以控制MAX7221驅動8位數碼管。注意這裡的數碼管是共陰極的。
2、在keil c51中新建工程ex67,編寫如下程式程式碼,編譯並生成ex67.hex檔案
//利用數碼管驅動晶片max7221實現8位數碼管顯示
#include <reg51.h>
#include <intrins.h> sbit DIN = P2^0; //資料串出引腳
sbit CS = P2^1; //片選端
sbit CLK = P2^2; //移位時鐘端
unsigned char disp_buff[8] = {2,0,1,0,10,2,10,9}; //顯示的數字,數值為10的時候,顯示“-”
// 延時函式
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
} //寫資料函式
void write_data(unsigned char addr,unsigned char dat)
{
unsigned char i;
CS = 0; // 先寫地址,片選置低,序列資料載入到移位暫存器
for(i = 0;i < 8;i++) //
{
CLK = 0; //時鐘上升沿資料移入內部移位暫存器
addr <<= 1; //待發送的地址,每次左移一次,高位在前傳送,
DIN = CY; //資料移位後,如果有溢位,則可以從進位位CY中獲得溢位的資料位
CLK = 1;
_nop_();
_nop_();
CLK = 0; //下降沿時資料從DOUT移出
}
for(i = 0;i < 8;i++)
{
CLK = 0; //
dat <<= 1; //傳送資料
DIN = CY;
CLK = 1;
_nop_();
_nop_();
CLK = 0;
}
CS = 1; //CS上升沿,資料鎖存
}
//初始化函式
void init_max7221(void)
{
write_data(0x09,0xff); //編碼模式
write_data(0x0a,0x07); //亮度控制
write_data(0x0b,0x07); //掃描數碼管的位數
write_data(0x0c,0x01); //工作模式
} void main(void)
{
unsigned char i;
init_max7221(); // 初始化
delayms(2);
for(i = 0;i < 8;i++)
{
write_data(i+1,disp_buff[i]); // 顯示8位
}
while(1);
}
3、在proteus中新建模擬檔案ex67.dsn,電路原理圖如下所示
4、將ex67.hex檔案載入at89c51中,啟動模擬,按動撥碼開關,觀察執行結果。下圖是某一時刻程式執行結果
#include <reg51.h>
#include <intrins.h> sbit DIN = P2^0; //資料串出引腳
sbit CS = P2^1; //片選端
sbit CLK = P2^2; //移位時鐘端
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
} //寫資料函式
void write_data(unsigned char addr,unsigned char dat)
{
unsigned char i;
CS = 0; // 先寫地址,片選置低,序列資料載入到移位暫存器
for(i = 0;i < 8;i++) //
{
CLK = 0; //時鐘上升沿資料移入內部移位暫存器
addr <<= 1; //待發送的地址,每次左移一次,高位在前傳送,
DIN = CY; //資料移位後,如果有溢位,則可以從進位位CY中獲得溢位的資料位
CLK = 1;
_nop_();
_nop_();
CLK = 0; //下降沿時資料從DOUT移出
}
for(i = 0;i < 8;i++)
{
CLK = 0; //
dat <<= 1; //傳送資料
DIN = CY;
CLK = 1;
_nop_();
_nop_();
CLK = 0;
}
CS = 1; //CS上升沿,資料鎖存
}
void init_max7221(void)
{
write_data(0x09,0xff); //編碼模式
write_data(0x0a,0x07); //亮度控制
write_data(0x0b,0x07); //掃描數碼管的位數
write_data(0x0c,0x01); //工作模式
} void main(void)
{
unsigned char i;
init_max7221(); // 初始化
delayms(2);
for(i = 0;i < 8;i++)
{
write_data(i+1,disp_buff[i]); // 顯示8位
}
while(1);
}
4、將ex67.hex檔案載入at89c51中,啟動模擬,按動撥碼開關,觀察執行結果。下圖是某一時刻程式執行結果