⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tp12ztest.c

📁 avr C 语言LED 显示屏系统 精典应用 可显示12个单色中文字
💻 C
字号:
/******************	TPZ12.C     12个字条屏	********************************
Kevin		START:2008-11-27
ATmega16L+DS1337+AT26DF081A
16Mhz

A	 B	C	D	STB	CLK	OE	R1	R2	G1	G2		D1	D2	D3
PB3	PB1	PC7	PC6	PA6	PA7	PA0	PA2	PA5	PA1	PA3		PC5	PC4	PC2

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

//******************************************************************//
#include "iom16v.h"
#include "macros.h"
//#include    <absacc.h>
//#define EnBright PA0
//*************************宏定义*****************************************//
#define uchar unsigned char
#define uint unsigned int

#define FIRMWARE  "LED MOVING...V8" 

#define SCREENWIDE 0X08 				
/*DEFSCREENBWIDE*8 屏最大宽度>10晃屏*/
#define SCANLINES 0x0f	
//屏高度
#define BRIGHTNESS 0x08  
//#define ENISVCC					
//Kevin 2008-11-11
#define HC595SCAN   0
#define MBI5026		1

#define		ID				0x31			
#define 	PACKETLENGTH	1002

#ifdef RG_CONVERT
	 #define dispram1 ((char *)0x100)	
	 /*红显存*/  /*红绿于此处反*/
	 #define dispram2 ((char *)0x280)	
	 /*绿显存*/
# else
    #define dispram2 ((char *)0x100)	
	/*红显存*/  /*红绿于此处反*/
    #define dispram1 ((char *)0x280)	
	/*绿显存*/
# endif

#define		SCNL		0x01			//生产能力:年月日时分秒12位
#define		HDRJ		0x02			//核定入井:0123
#define		SJRJ		0x03			//实际入井:	
#define		DOWNTIME	0x04			//下载时间:		
#define		DOWNMES		0x05			//下载信息:12中文字
#define		DOWNADD		0x06			//下载地址:1-9
#define		DOWNBAUD	0x07			//下载波特率:2400-19200
#define		DOWNLIM		0x85			//限时

#define		UPMOVE			'0'		
#define		LEFTMOVE		'1'
#define		RIGHTMOVE		'2'
#define		DOWNMOVE		'3'	
#define		FLASH			'4'		
#define		HOLD			'5'

//*************************全局变量***************************************//
char sflag=0x00;
//uchar BRIGHTNESS;		//亮度
uchar BNCURSOR=0;			//
uchar NOWH=0;
//uchar SCANLINES;		//扫描行数
//uchar dispram1[384]_at_0x00;
//uchar dispram2[384]_at_0x200;
uchar comram[30];
uchar smdisp[26];
uchar dispr1[384];
uchar dispr2[384];

//**************************定时器1初始化*********************************//




//******************************************************************//
const uchar  Bmp002[]=
{
/*------------------------------------------------------------------------------
;  若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。
;  源文件 / 文字 : 欢迎光临子 宋体12号   测试或默认数据
;  宽×高(像素): 64×16
;  字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/128字节
;  数据转换日期  : 2007-12-15 0:40:32
------------------------------------------------------------------------------*/
0x00,0x80,0x40,0x00,0x01,0x00,0x01,0x00,0x00,0x80,0x21,0x80,0x21,0x10,0x09,0x80,
0xFC,0x80,0x36,0x7C,0x19,0x18,0x09,0x00,0x05,0xFE,0x24,0x44,0x0D,0x10,0x49,0xFE,
0x85,0x04,0x04,0x44,0x09,0x20,0x4A,0x20,0x4A,0x48,0x04,0x44,0x01,0x04,0x4A,0x10,
0x28,0x40,0xE4,0x44,0x7F,0xFE,0x4C,0x10,0x10,0x40,0x24,0x44,0x04,0x40,0x49,0x04,
0x18,0x40,0x25,0x44,0x04,0x40,0x49,0xFE,0x18,0x60,0x26,0x54,0x04,0x40,0x49,0x24,
0x24,0xA0,0x24,0x48,0x04,0x40,0x49,0x24,0x24,0x90,0x20,0x40,0x08,0x42,0x49,0x24,
0x41,0x18,0x20,0x40,0x08,0x42,0x49,0x24,0x86,0x0E,0x50,0x00,0x10,0x42,0x09,0xFC,
0x38,0x04,0x8F,0xFE,0x20,0x3E,0x09,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
};

const uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//SMZK0-9

//******************************************************************//
/*延时函数*/
void delay_ms(unsigned char i) {
 unsigned char a, b;
 for (a = 1; a < i; a++) {
  for (b = 1; b; b++) ;
  }}

//*****************************SPI********************************//
/*SPI接口初始化*/
void SPI_MasterInit(void) {
 DDRB |= (1<<PB5) | (1<<PB7);  /* 设置MOSI 和SCK 为输出,其他为输入 */
 SPCR = (1<<SPE) | (1<<MSTR)
  | (1<<SPR1) | (1<<SPR0);  /* 使能SPI 主机模式,设置时钟速率为fck/128 */
}
/*SPI数据发送*/
void SPI_MasterTransmit(uchar i) {
 
 SPDR = i;       /* 启动数据传输 */
 while (!(SPSR & (1<<SPIF))) {  /* 等待传输结束 */
  ;
  }
}
/*595数据输出*/
void SPI_595_Out(uchar i) {
 PORTB &= ~(1 << 4);     /*准备锁存*/
 SPI_MasterTransmit(i);
 PORTB |= (1 << 4);     /*锁存数据*/
}


//*****************************EEPROM********************************//
/*EEPROM读取函数*/
/*addr:地址;number:长度;p_buff:读出数据存放指针*/
void eprom_read(uint addr, uchar number, uchar *p_buff) {
 while(EECR & (1 << EEWE));
 EEARH = 0x00;
 
 while(number --) {
  EEARL = addr ++;
  EECR |= (1 << EERE);
  *p_buff++ = EEDR;
  }
}
/*EEPROM写入函数*/
/*addr:地址;number:长度;p_buff:写入数据存放指针*/
void eprom_write(uint addr, uchar number, uchar *p_buff) {
 EEARH = 0x00;
 while(number --) {
  while(EECR & (1 << EEWE));
  EEARL = addr ++;
  EEDR = *p_buff ++;
  EECR |= (1 << EEMWE);
  EECR |= (1 << EEWE);
  }
}

//*****************************DISPLAY********************************//
//R1 PA2  CLK PA7  STB  PA6  G1 PA1  G2 PA3  R2  PA5

void WD595(uchar *disdata,uchar k){
uchar mid;
	uchar i,j;
	uchar x;
	PORTA&=~0xC0;		//PA6,7 out 0

	for(j=0;j<k;j++)		  //send K bytes
	{
 	mid=disdata[j];
				   for(i=0;i<8;i++){		  //send one byte
						x=mid&0x80;		//
					  	if(x==0)
					  	PORTA&=~0x04;	//R1 out 0  
						//PORTA&=~0x18;	//R1,G1 out 0	  2513
						else
						PORTA|=0x04;	// R1 out 1
						//PORTA&=~0x18;	//R1,G1 out 0   四个数据
						PORTA|=0x80;		// CLK out 1
						mid=mid<<1;			//
						PORTA&=~0x80;		// clk out 0
					}
	}
 	PORTA|=0x40;		//STB SET1
	PORTA&=~0xC0;		//PA6,7 out 0
}

//-----------------------------------------------------------
/*串口初始化函数*/
void Uart_Init(void) {
 UCSRA = 0x00;  /*倍速0000 0010*/
 UCSRB = 0x00;  /*允许接收和发送0001 1000*/
 UCSRC = 0x06;  /*8位数据*0000 0110*/
 UBRRH = 0x00;
 UBRRL = 0x67;  /*9600*/  //16M  103  UBRR=FOSC/(BAUD*16)-1
 UCSRB=0X98;
 //UCR=0X00;
// UBRR=103;
// UCR=0XD8;
}

/*数据发送,查询方式*/
void Uart_Transmit(unsigned char i) {
 while (!(UCSRA & (1<<UDRE)));  /* 等待发送缓冲器为空*/
 UDR = i;    /* 发送数据*/
}
/*数据接收,查询方式*/
unsigned char Uart_Receive( void ) {
 while (!(UCSRA & (1<<RXC)));  /* 等待接收数据*/  //while(!(USR&0X80));
 return UDR;    /* 获取并返回数据*/
}

#pragma interrupt_handler ComR:12
uchar ComR(void)
{
//uart has received a character in UDR
//PORTA=UDR; //接收数据并输出
return UDR;
}



//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
//port_init();
Uart_Init();

MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//----------------Revecie-int--------------------------






//--------------------------------------------------
/*系统初始化函数*/
void Sys_init(void){
 DDRA = 0xef;      /*方向输入0xef*/
 PORTA = 0xFF;     /*打开上拉*/
 DDRB = 0xff;      /*方向输出0xde*/
 PORTB = 0xff;     /*电平设置*/
 DDRC = 0xff;
 PORTC = 0xFF;
 //DDRD = 0xFF;
 //PORTD = 0xFF;
 TIMSK=TIMSK|0X01;
 TCCR0=0X03;		//C0
 TCNT0=0X05;		//1MS
 SREG=SREG|0x80;
 TIFR=TIFR|0X01;
 
 NOWH=0x00;
 SEI();  //RE-ENABLE INTERRUPTS
}

//-----------------------------------------
void Enoff(void){
		#ifdef ENISVCC
        	PORTA&=~0x01;
        #else
        	PORTA|=0x01;
		#endif	
}

void Enon(void){
		#ifdef ENISVCC
         	PORTA|=0x01;
        #else
       		PORTA&=~0x01;
		#endif	
}

//*****************************定时扫描********************************//
//场频>60hz  16scan 行频>960hz   行扫时间<1ms  8scan 行频>480hz  行扫时间<0.5ms
//16Mhz 64分频   250 1ms    做16级亮度     ABCD PB 3,1  PC 7,6  DCBA 0000-1111
/*定时器T0 TCCR1A组比较匹配中断*/
#pragma interrupt_handler Timer0:10
void Timer0(void) { 
uchar i,j;
  /*  if (SCANLINES>8)
       	TCNT0=0xC1;		  //1/16MS
	else
 		TCNT0=0xe0;		  //.5/16MS
	if(BNCURSOR==0){		//关行,送数,选行,开行
		Enoff();
		//Bmp003[12]={0,1,2,3};
		WD595(dispr1,SCREENWIDE);
		i=j=NOWH;
		i=(i&0x01<<2)|(i&0x02>>1);
			   PORTB|=i;		//  AB
		j=(j&0x04<<4)|(j&0x08<<2);	   					 
			   PORTC|=j;		//CD
		NOWH++;
		Enon();}
	else if(BNCURSOR==BRIGHTNESS)	
		 Enoff();//关行
	BNCURSOR++;
	BNCURSOR&=0x0f;	   				//0-15*/
	//PORTC|=0X00;	
} 


void Send(uchar j);
void ScanRow(void);
void InitRam(void);
//*****************************主程序********************************//
void main(void) {
 //uint mid,x;
 uchar i,j,y,k;
  Sys_init();
  Uart_Init();
  init_devices();
  Uart_Transmit('o');
  Uart_Transmit('c');
 // Enon();
 InitRam();

 	while(1){	
		//if(BNCURSOR==0){		//送数,关行,锁存,选行,开行
		//Bmp003[12]={0,1,2,3};
		//WD595(dispr1,SCREENWIDE);
		//i=NOWH*
		Send(NOWH);
		Enoff();
		PORTA|=0x40;		//STB SET1
		PORTA&=~0x40;		//PA6 out 0
		ScanRow();
		Enon();  
		}	
	//else if(BNCURSOR==BRIGHTNESS)	
	//BNCURSOR++;
	//BNCURSOR&=0x0f;	   				//0-15*/
/*
	PORTC&=~0x10;					//D2	
	PORTC&=~0x04;					//D3
	PORTC&=~0x20;					//D1  */
	  
}

void ScanRow(void){
	 uchar i;
	 	PORTB&=~0X0A;	//ABCD cls		00001010	  
		PORTC&=~0XC0;		//1100 0000
		i=NOWH;
		i=((i&0x01)<<3)|(i&0x02);			//ok 20081129
		PORTB|=i;		//AB	
		i=NOWH;
		i=((i&0x04)<<5)|((i&0x08)<<3);		//ok 20081129 		
		PORTC|=i;		//CD
		
		NOWH++;
		NOWH&=0x0f;

}

void Send(uchar j){							 //列,行
uchar mid,y,x,i;
i=0;
		while(i<SCREENWIDE){
		    mid=Bmp002[j*SCREENWIDE+i];//dispr1[j*SCREENWIDE+i];// 			
		   	for(y=0;y<8;y++){		  //send one byte  OK
				x=mid&0x80;				  //
				PORTA&=~0x80;			  // clk out 0
			if(x!=0)				  //数据反向
				PORTA&=~0x0c;			  //R1 out 0  2513
			else
				PORTA|=0x0c;			  // R1 out 1 
			PORTA|=0x80;			  // CLK out 1
			mid=mid<<1;				  //
			}
			i++;
		}//while(i);
}

void InitRam(void){
uchar j;
uint i;
  	   j=1;
 for(i=0;i<384;i++){ 
 		dispr1[i]=j;
		j=(j<<1)+1;
		j&=0xFF;
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -