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 <AT89X51.H>
#include <intrins.h>
//#include <absacc.h>
/*--------------------------------------------------*/
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 <avr/io.h>
#include <avr/io2313.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
//------------------------------------------------------------------------------
//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;
}
//------------------------------------------------------------------------------