|
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; } //------------------------------------------------------------------------------
|