max7219程序

刚写完的,呵呵,调试通过

//*********** 定义各个引脚**********************
// IOB7 ----------- SCK
// IOB6 ----------- CS/LOAD
// IOB5 ----------- DIN
#define SCK_HEX 0x8000
#define SDA_HEX 0x2000
#define CS_HEX 0x4000

//**************** 宏函数 **********************
#define SETB_SCK() *P_IOB_DATA|=SCK_HEX
#define CLR_SCK() *P_IOB_DATA&=!SCK_HEX

#define SETB_SDA() *P_IOB_DATA|=SDA_HEX
#define CLR_SDA() *P_IOB_DATA&=!SDA_HEX

#define SETB_CS() *P_IOB_DATA|=CS_HEX
#define CLR_CS() *P_IOB_DATA&=!CS_HEX

volatile unsigned int *P_IOB_DATA =(unsigned int*)(0x7005);
volatile unsigned int *P_IOB_DIR =(unsigned int*)(0x7007);
volatile unsigned int *P_IOB_ATTRIB = (unsigned int*)(0x7008);

//**************** 函数预定义 ******************************
void InitIO_7219();
void SendData_7219(unsigned int order,unsigned int data);
void senddata_7219(unsigned int data);

//***************************************************************

void main()
{
unsigned int i=0;
InitIO_7219();
SendData_7219(0x0c,0x01); // 使其7219工作正常模式
SendData_7219(0x0b,0x07); // 配置scan limit模式,使其8个管子都工作
SendData_7219(0x0a,0x03); // 设置亮度为 1/2 亮
SendData_7219(0x09,0xff); // 使8个管子都用编码方式
//****** 测试 ,送几个数据看看 ***********
for(i=1;i<9;i++)
{
SendData_7219(i,8-i);
}
while(1);
}
//********************************************************
// 对操作7219的IO口做配置
//********************************************************
void InitIO_7219()
{
*P_IOB_DIR|=SCK_HEX;
*P_IOB_ATTRIB|=SCK_HEX;
*P_IOB_DATA|=SCK_HEX;

*P_IOB_DIR|=SDA_HEX;
*P_IOB_ATTRIB|=SDA_HEX;
*P_IOB_DATA|=SDA_HEX;

*P_IOB_DIR|=CS_HEX;
*P_IOB_ATTRIB|=CS_HEX;
*P_IOB_DATA|=CS_HEX;
}
//*****************************************************
// 送数据给7219的函数
// order 是命令字
// data 是数据
//*****************************************************
void SendData_7219(unsigned int order,unsigned int data)
{
unsigned int rtemp=0,dtemp;
dtemp=data;
dtemp&=0x00ff;
rtemp=order;
rtemp<<=4;
rtemp<<=4;
rtemp|=dtemp;
senddata_7219(rtemp);
}
void senddata_7219(unsigned int data)
{
unsigned int i;
// 将CS拉低
CLR_CS();
for(i=0;i<16;i++)
{
CLR_SCK();
if(data&0x8000)
SETB_SDA();
else
CLR_SDA();
SETB_SCK();
data<<=1;
}
SETB_CS();
}


以上由xing1983发表


//呵呵,我也贴一篇,我用的是串口,用汇编写的,调试通过!
//主函数:八位LED依次显示1、2、3、4、5、6、7、8
#include "hardware.h"
int data;
int bitdata=6;
int main()
{
intint7219();
data=2;
display1();
data=0;
display2();
data=0;
display3();
data=3;
display4();
data=7;
display5();
data=1;
display6();
data=4;
display7();
data=8;
display8();
while(1)
{

}
}

//子函数:

.include hardware.inc
.external _data
.external _bitdata
.ram
.code
.public _intint7219
_intint7219: .proc

r1=0xffff
[P_IOB_Dir]=r1
[P_IOB_Attrib]=r1
r1=0x0000
[P_IOB_Data]=r1
r4=0x0002

r1=0xc1 //8位地址,8位数据
[P_SIO_Ctrl]=r1
r1=0x0000
[P_SIO_Start]=r1;
call _busy

r1=0x0f //test
[P_SIO_Data]=r1
call _busy
r1=0x00
[P_SIO_Data]=r1
call _busy
r2=0x0080 //load->1
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load->0

r1=0x0c //shut down
[P_SIO_Data]=r1
call _busy
r1=0x01
[P_SIO_Data]=r1
call _busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219


r1=0x0a //亮度
[P_SIO_Data]=r1
call _busy
r1=0x02; //
[P_SIO_Data]=r1;
call _busy
r1=0x0080 //load->1
[P_IOB_Data]=r1
r1^=0x0080
[P_IOB_Data]=r1 //load->0


r1=0x09 //译码方式寄存器
[P_SIO_Data]=r1
call _busy
r1=0xff
[P_SIO_Data]=r1
call _busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2
//扫描位数确定
r1=0x0b
[P_SIO_Data]=r1
call _busy
r1=[_bitdata]
[P_SIO_Data]=r1
call busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2
retf
.endp

//8位LED的显示子程序
.public _display1
_display1:.proc
r1=0x01
[P_SIO_Data]=r1 //
call busy
r1=[_data]
[P_SIO_Data]=r1
call busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp
.public _display2
_display2:.proc
r1=0x02
[P_SIO_Data]=r1 //
call busy
r1=[_data]
[P_SIO_Data]=r1
call busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp

.public _display3
_display3:.proc
r1=0x03
[P_SIO_Data]=r1 //
call busy
r1=[_data]
[P_SIO_Data]=r1
call busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp
.public _display4
_display4:.proc
r1=0x04
[P_SIO_Data]=r1 //
call busy
r1=[_data]
[P_SIO_Data]=r1
call busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp
.public _display5
_display5:.proc
r1=0x05
[P_SIO_Data]=r1 //
call busy
r1=[_data]
[P_SIO_Data]=r1
call _busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp
.public _display6
_display6:.proc
r1=0x06
[P_SIO_Data]=r1 //
call _busy
r1=[_data]
[P_SIO_Data]=r1
call _busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp

.public _display7
_display7:.proc
r1=0x07
[P_SIO_Data]=r1 //
call _busy
r1=[_data]
[P_SIO_Data]=r1
call _busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp

.public _display8
_display8:.proc
r1=0x08
[P_SIO_Data]=r1 //
call _busy
r1=[_data]
[P_SIO_Data]=r1
call _busy
r2^=0x0080
[P_IOB_Data]=r2
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp

.public _busy

_busy:.proc
call _watchdog
busy: r1=0x0080
test r1,[P_SIO_Start]
jnz busy
retf
.endp

.public _watchdog
_watchdog: .proc
push r1 to [

sp]
r1=0x0001
[P_Watchdog_Clear]=r1
pop r1 from [sp]
retf
.endp

以上由flyjh发表



好,把7219的汇编也贴上,呵呵

.define LOAD 0x4000; // 片选
.define CLK 0x8000; // 时钟
.define DIN 0x2000; // 数据
//////////////////////////////////////////////////////////
// 显示发送子程序 //
//////////////////////////////////////////////////////////
.public _max7219_send_data
_max7219_send_data: .proc
push r1,r4 to [sp];
push bp to [sp];
bp=sp+1;
r1=[bp+7]; // 第一个参数
r2=[bp+8]; // 第二个参数
r1=r1 lsl 4;
r1=r1 lsl 4;
r1|=r2; // 两个8位整合成16位
r3=16; // 计数器
r2=[P_IOB_Data];
r2&=~LOAD; // LOAD ==0
[P_IOB_Data]=r2;
again: r3-=1;
r2&=~CLK; // CLK == 0
[P_IOB_Data]=r2;
r4=r1&0x8000; // 取得最高位
r1=r1 lsl 1; // R1左移
r4=r4 lsr 2; // 移到DIN位
r2|=r4; // 送入DIN
[P_IOB_Data]=r2;
r2|=CLK // CLK == 1 ,产生上升沿跳变
[P_IOB_Data]=r2;
r2&=0xdfff; // 清除DIN 位
cmp r3,0
ja again;
r2|=CLK;
[P_IOB_Data]=r2;
r2|=LOAD;
[P_IOB_Data]=r2;
pop bp from [sp];
pop r1,r4 from [sp];
retf;
.endp

//////////////////////////////////////////////////////////////
// MA7219初始化 //
//////////////////////////////////////////////////////////////
void Max7219_Init()
{
max7219_send_data(0x0c,1);
max7219_send_data(0x0f,1);
max7219_send_data(0x09,0xff);
max7219_send_data(0x0a,2);
max7219_send_data(0x0b,7);
max7219_send_data(0x0c,1);
max7219_send_data(0x0f,0);
}


以上由sandman发表



相关文档
最新文档