這樣能不能簡寫感覺太長了
#include <reg52.h>
#include <intrins.h>
sbit DIN_7219=P0^5; //7219串行數(shù)據(jù)輸入端
sbit LOAD_7219=P0^6; //7219數(shù)據(jù)鎖存端
sbit CLK_7219=P0^7; //7219時鐘輸入端
#define uchar unsigned char
uchar code LEDcode[]=
{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00 /*0,1,2,3,4,5,6,7,8,9,全滅*/
/*0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,*/ }; /*A,B,C,D,E,F,P,U,全亮*/
void write_7219_byte (uchar dat)
{
uchar i,temp;
for (i=0;i<8;i++)
{
temp=dat&0x80;
dat=dat<<1;
if(temp)
DIN_7219=1;
else
DIN_7219=0;
CLK_7219=0;
_nop_();
CLK_7219=1; //時鐘上升沿把數(shù)據(jù)送入寄存器鎖定
}
}
void write_7219 (uchar addr,uchar dat)
{
LOAD_7219=0; //寄存器打開,等待數(shù)據(jù)的送入
_nop_();
write_7219_byte (addr); //選擇寄存器地址
_nop_();
write_7219_byte (dat); //選擇讓芯片執(zhí)行什么命令
_nop_();
LOAD_7219=1; //第16個上升沿之后,第17個上升沿之前必須把pinCLK置高,否則數(shù)據(jù)丟失
}
/**************************************************
* MAX7219初始化 *
***************************************************/
void init_7219 (void)
{
write_7219 (0x0c,0x01); /* 設(shè)置電源工作模式 */
write_7219 (0x0a,0x02); /* 設(shè)置亮度(19/32,根據(jù)需要增減)*/
write_7219 (0x0b,0x03); /* 設(shè)置掃描界限(根據(jù)需要增減) */
write_7219 (0x09,0x00); /* 設(shè)置譯碼模式(00不譯,FF譯) */
write_7219 (0x0f,0x00); /* 顯示測試(00為正常工作狀態(tài)) */
}
/**************************************************
* MAX7219清除顯示 *
***************************************************/
void clear_7219(void)
{
uchar i; //變量i,用來選擇數(shù)碼管位選
for(i=8;i>0;i--) //i自減,選擇完所有的8位
{
write_7219(i,0x00); //對應位選的段全部清除顯示
}
}
void main(void)
{
init_7219 (); //MAX7219初始化
clear_7219(); //MAX7219清除顯示,免去干擾
while(1)
{
write_7219(0x01,LEDcode[5]); //掃描第一位(LSB),并送段碼顯示
write_7219(0x02,LEDcode[5]|0x80); //掃描第二位,并送段碼顯示,同時加顯小數(shù)點2| 0x80 如果不加小數(shù)點就去掉|0x80
write_7219(0x03,LEDcode[5]); //掃描第三位,并送段碼顯示
write_7219(0x04,LEDcode[5]); //掃描第四位,并送段碼顯示
write_7219(0x05,LEDcode[5]); //掃描第五位,并送段碼顯示
write_7219(0x06,LEDcode[6]); //掃描第六位,并送段碼顯示
write_7219(0x07,LEDcode[7]); //掃描第七位,并送段碼顯示
write_7219(0x08,LEDcode[8]); //掃描第八位(MSB),并送段碼顯示
}
}
|