max7219c语言,max7219显示程序-C程序—汇编

max7219显示程序(汇编)

#include "msp430x41x.h"

DIN EQU 001H ;P1.0

CLK EQU 002H ;P1.1

LOAD EQU 004H ;P1.2

ORG 0F000H

RESET MOV #300H,SP ;初始化

MOV #WDTPW+WDTHOLD,&WDTCTL

BIS.B #CLK,&P1DIR

BIS.B #DIN,&P1DIR

BIS.B #LOAD,&P1DIR

PUSH #00C01H ;设置工作模式

BIC.B #LOAD,&P1OUT

CALL #MOVE

BIS.B #LOAD,&P1OUT

PUSH #00B05H ;设置扫描位数

BIC.B #LOAD,&P1OUT

CALL #MOVE

BIS.B #LOAD,&P1OUT

PUSH #009FFH ;设置编码方式

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00A07H ;设置亮度

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

XIAN PUSH #00107H ;显示第一位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00206H ;显示第二位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00305H ;显示第三位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00404H ;显示第四位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00503H ;显示第五位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00602H ;显示第六位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

JMP $

MOVE MOV.B #16,R6

MOV 2(SP),R13

MOV #1,R10

SENDLOOP BIC.B #CLK,&P1OUT

BIT R10,R13

JNZ SEND1

SEND0 BIC.B #DIN,&P1OUT

JMP GOON

SEND1 BIS.B #DIN,&P1OUT

GOON BIS.B #CLK,&P1OUT

RLA R10

BIC.B #CLK,&P1OUT

DEC R6

JNZ SENDLOOP

RET

ORG 0FFFEH

DW RESET

END#include "msp430x41x.h"

DIN EQU 001H ;P1.0

CLK EQU 002H ;P1.1

LOAD EQU 004H ;P1.2

ORG 0F000H

MOV #300H,SP ;初始化

MOV #WDTPW+WDTHOLD,&WDTCTL

BIS.B #CLK,&P1DIR

BIS.B #DIN,&P1DIR

BIS.B #LOAD,&P1DIR

PUSH #00C01H ;设置工作模式

BIC.B #LOAD,&P1OUT

CALL #MOVE

BIS.B #LOAD,&P1OUT

PUSH #00B05H ;设置扫描位数

BIC.B #LOAD,&P1OUT

CALL #MOVE

BIS.B #LOAD,&P1OUT

PUSH #009FFH ;设置编码方式

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00A07H ;设置亮度

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

XIAN PUSH #00107H ;显示第一位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00206H ;显示第二位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00305H ;显示第三位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00404H ;显示第四位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00503H ;显示第五位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

PUSH #00602H ;显示第六位

BIC.B #LOAD,&P1OUT

CALL MOVE

BIS.B #LOAD,&P1OUT

JMP $

MOVE MOV.B #16,R6

POP R13

MOV #1,R10

SENDLOOP BIC.B #CLK,&P1OUT

BIT R10,R13

JNZ SEND1

SEND0 BIC.B #DIN,&P1OUT

JMP GOON

SEND1 BIS.B #DIN,&P1OUT

GOON BIS.B #CLK,&P1OUT

RLA R10

BIC.B #CLK,&P1OUT

DEC R6

JNZ SENDLOOP

RET

END

MAX7219的c程序

/*---------------------------------------------------------

*                     程序说明                           *

* 1、本程序已经通过测试,非常好用;                      *

* 2、在非译码方式下编码和一般书上写的不一样,请注意;    *

* 3、每次送显示的时候先初始化一次;                      *

* 4、在设计电路或制作试验板时注意添加Vcc到GND之间的电容,*

*    一个10vF的电解电容和0.1vF的陶瓷电容。并在DIN、LOAD、*

*    CLK到GND之间接入30pF的瓷片电容。                    *

*                                                        *

*                程序提供人:苏建宇                      *

*                                                        *

*                                                        *

----------------------------------------------------------*/

#include 

#include 

//#include 

/*--------------------------------------------------*/

sbit dis_DIN=P1^0;           /*显示串行数据输入端*/

sbit dis_LOAD=P1^1;          /*显示数据锁存端*/

sbit dis_CLK=P1^2;           /*显示时钟输入端*/

#define NoOp   0x00         /*空操作*/

#define Digit0 0x01         /*数码管1*/

#define Digit1 0x02         /*数码管2*/

#define Digit2 0x03         /*数码管3*/

#define Digit3 0x04         /*数码管4*/

#define Digit4 0x05         /*数码管5*/

#define Digit5 0x06         /*数码管6*/

#define Digit6 0x07         /*数码管7*/

#define Digit7 0x08         /*数码管8*/

#define DecodeMode 0x09     /*译码模式*/

#define Intensity 0x0a     /*亮度*/

#define ScanLimit 0x0b      /*扫描界限*/

#define ShutDown 0x0c       /*掉电模式*/

#define DisplayTest 0x0f    /*显示测试*/

#define ShutdownMode 0x00      /*掉电方式工作*/

#define NormalOperaTIon 0x01   /*正常操作方式*/

#define DecodeDigit 0xff       /*译码位数设置*/

#define IntensityGrade 0x0a    /*显示亮度级别设置*/

#define ScanDigit 0x07         /*扫描位数设置*/

#define TestMode 0x01          /*显示测试方式*/

#define TextEnd 0x00           /*显示测试结束,正常工作*/

unsigned char data DisBuffer[8]={0,0,0,0,0,0,0,0};    /*显示缓存区*/

unsigned char code dispaly_list[]=

{

0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,    /*0,1,2,3,4,5,6,7,8,9*/

0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,0x00};   /*A,B,C,D,E,F,P,U,全

亮,全灭*/

/*--------------------------------------------------------

10ms延时子程序

---------------------------------------------------------*/

void delayX10ms(unsigned char count)

{

unsigned char j,k;

while(count--!=0)

{

for(j=0;j<43;j++)

for(k=0;k<73;k++)

;

}

}

/*-------------------------------------------------

向MAX7219写入字节(8位)

--------------------------------------------------*/

void SendChar (unsigned char ch)

{

unsigned char i,temp;

_nop_();

for (i=0;i<8;i++)

{

temp=ch&0x80;

ch=ch<<1;

if(temp)

{

dis_DIN=1;

dis_CLK=0;

dis_CLK=1;

}

else

{

dis_DIN=0;

dis_CLK=0;

dis_CLK=1;

}

}

}

/*-------------------------------------------------

向MAX7219写入字(16位)

-------------------------------------------------*/

void WriteWord (unsigned char addr,unsigned char num)

{

dis_LOAD=0;

_nop_();

SendChar (addr);

_nop_();

SendChar (num);

_nop_();

dis_LOAD=1;

}

/*-------------------------------------------------

MAX7219初始化

-------------------------------------------------*/

void InitDis (void)

{

WriteWord (ScanLimit,ScanDigit);         /*设置扫描界限*/

WriteWord (DecodeMode,DecodeDigit);      /*设置译码模式*/

WriteWord (Intensity,IntensityGrade);    /*设置亮度*/

WriteWord (ShutDown,NormalOperaTIon);    /*设置电源工作模式*/

}

/*-------------------------------------------------

系统上电初始化

-------------------------------------------------*/

void InitMain (void)

{

IE=0x00;    /*设置中断允许寄存器*/

IP=0x00;    /*设置中断优先级管理寄存器*/

TH0=0xd8;   /*设定时器初值,10ms*/

TL0=0xf0;

TMOD=0x01;  /*T1 定时器模式2,波特率发生器,T0 定时器模式1*/

TCON=0x11;  /*设置定时器控制寄存器,INT0设置为边沿触发方式*/

PSW=0x00;

}

/*-------------------------------------------------

主函数

-------------------------------------------------*/

void main(void)

{

InitMain ();

InitDis ();

WriteWord (DisplayTest,TestMode);

delayX10ms(0x64);

delayX10ms(0x64);

WriteWord (DisplayTest,TextEnd);

while(1)

{

unsigned char i;

for (i=0;i<=9;i++)

{

delayX10ms(0x64);

delayX10ms(0x64);

InitDis ();

DisBuffer[0]=i;

DisBuffer[1]=i;

DisBuffer[2]=i;

DisBuffer[3]=i;

DisBuffer[4]=i;

DisBuffer[5]=i;

DisBuffer[6]=i;

DisBuffer[7]=i;

WriteWord (Digit0,DisBuffer[0]);

WriteWord (Digit1,DisBuffer[1]);

WriteWord (Digit2,DisBuffer[2]);

WriteWord (Digit3,DisBuffer[3]);

WriteWord (Digit4,DisBuffer[4]);

WriteWord (Digit5,DisBuffer[5]);

WriteWord (Digit6,DisBuffer[6]);

WriteWord (Digit7,DisBuffer[7]);

}

}

}

我正好有个7219,一直想学一下,51节就搭个电路看看,谢谢。 [电烙铁] 2005-4-22 18:00:21

我有更简单的 [rq88] 2005-4-22 18:38:00

我有更简单的

那就发上来大家都看看嘛  [bush636] 2005-4-22 21:19:13

我有AVR C++的 AT90S2313通过(有图)(附图) [Sunnyyonkers] 2005-4-23 14:27:58

要注意到时序正确就行了,另外电压一定要够,否则一定会出现乱

码。

我先给出一个我做的一个通用驱动。

//------------------------------------------------------------------------------

//Author:SunnyYonkers

//Date: 2005y-03m-18d 13:00

//------------------------------------------------------------------------------

#include 

#include 

#include 

#include 

#include 

#include 

#include 

//------------------------------------------------------------------------------

//Hardware Define

//引脚定义

#define SOFT_SERIAL_PORT  PORTB

#define SOFT_SERIAL_DDR   DDRB

#define SOFT_SERIAL_PIN   PINB

//------------------------------------------------------------------------------

#define LOAD_PIN          0b00000100

#define DIN_PIN           0b00001000

#define CLK_PIN           0b00010000

//------------------------------------------------------------------------------

//定义引脚操作

#define SET_DIN           SOFT_SERIAL_PORT |= DIN_PIN

#define CLR_DIN           SOFT_SERIAL_PORT &= ~DIN_PIN

#define SET_CLK           SOFT_SERIAL_PORT |= CLK_PIN

#define CLR_CLK           SOFT_SERIAL_PORT &= ~CLK_PIN

#define SET_LOAD          SOFT_SERIAL_PORT |= LOAD_PIN

#define CLR_LOAD          SOFT_SERIAL_PORT &= ~LOAD_PIN

//------------------------------------------------------------------------------

#define TRUE              0x01

#define FALSE             0x00

//------------------------------------------------------------------------------

#define DISPLAY_ADD_0     0x01

#define DISPLAY_ADD_1     0x02

#define DISPLAY_ADD_2     0x03

#define DISPLAY_ADD_3     0x04

#define DISPLAY_ADD_4     0x05

#define DISPLAY_ADD_5     0x06

#define DISPLAY_ADD_6     0x07

#define DISPLAY_ADD_7     0x08

//------------------------------------------------------------------------------

#define DECODE_ADDRESS    0x09

#define LIGHT_ADDRESS     0x0a

#define SCAN_WIDE         0x0b

#define SLEEP_ADDRESS     0x0c

#define TEST_ADDRESS      0x0d

//------------------------------------------------------------------------------

#define SLEEP_MODE        0x00

#define UN_SLEEP_MODE     0x01

//------------------------------------------------------------------------------

#define NO_DECODE         0x00

#define DECODE_0_         0x01

#define HALF_DECODE       0x0f

#define DECODE_ALL        0xff

//------------------------------------------------------------------------------

#define _CHAR_0            0b00000000

#define _CHAR_1            0b00000001

#define _CHAR_2            0b00000010

#define _CHAR_3            0b00000011

#define _CHAR_4            0b00000100

#define _CHAR_5            0b00000101

#define _CHAR_6            0b00000110

#define _CHAR_7            0b00000111

#define _CHAR_8            0b00001000

#define _CHAR_9            0b00001001

#define _CHAR_-            0b00001010

#define _CHAR_E            0b00001011

#define _CHAR_H            0b00001100

#define _CHAR_L            0b00001101

#define _CHAR_P            0b00001110

#define _NO_CHAR           0b00001111

#define _DOT               0b10000000

//------------------------------------------------------------------------------

class max7219drv

{

public:

max7219drv();

private:

void write(unsigned char cData);

public:

void send(unsigned char address,unsigned char ndata);

};

//------------------------------------------------------------------------------

//构造函数

max7219drv::max7219drv()

{

SOFT_SERIAL_PORT |= 0b11111111;//初始状态高电平

SOFT_SERIAL_DDR  |= 0b11111111;//状态

///

}

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------

//写数据微程序:私有

void max7219drv::write(unsigned char cData)

{

unsigned char nloop=0x07;

/

do{

(0x80 & cData) ? (SET_DIN) : (CLR_DIN);cData<<=1;//数据移

CLR_CLK;

SET_CLK;//产生一个时钟信号

}while(nloop--);

}

//------------------------------------------------------------------------------

//写数据子程序:公有

void max7219drv::send(unsigned char address,unsigned char ndata)

{

write(address);

write(ndata);

CLR_LOAD;

SET_LOAD;

}

//------------------------------------------------------------------------------

int main(void)

{

max7219drv drv;

/

for(;;)

{

/

//Init MAX7219

drv.send(SLEEP_ADDRESS,UN_SLEEP_MODE);

drv.send(SCAN_WIDE,0x07);

drv.send(LIGHT_ADDRESS,0xf9);

drv.send(DECODE_ADDRESS,DECODE_ALL);

/

drv.send(DISPLAY_ADD_0,_CHAR_1 | _DOT);

drv.send(DISPLAY_ADD_1,_CHAR_2 | _DOT);

drv.send(DISPLAY_ADD_2,_CHAR_3 | _DOT);

drv.send(DISPLAY_ADD_3,_CHAR_4 | _DOT);

drv.send(DISPLAY_ADD_4,_CHAR_5 | _DOT);

drv.send(DISPLAY_ADD_5,_CHAR_6 | _DOT);

drv.send(DISPLAY_ADD_6,_CHAR_7 | _DOT);

drv.send(DISPLAY_ADD_7,_CHAR_8 | _DOT);

/

//去掉小数点使用     drv.send(DISPLAY_ADD_7,_CHAR_8 &~

_DOT);

//添加小数点使用     drv.send(DISPLAY_ADD_7,_CHAR_8 |

_DOT);

/

}

return 0;

}

//------------------------------------------------------------------------------

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值