📄 tp12ztest.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 + -