📄 hulandengm16.c
字号:
if(((PIND&0X10)==0)||((PIND&0X08)==0)||((PIND&0X04)==0)||((PINB&0X01)==0)||((PINB&0X40)==0))
{
Delay(2);
if(((PIND&0X10)==0)||((PIND&0X08)==0)||((PIND&0X04)==0)||((PINB&0X01)==0)||((PINB&0X40)==0))
{
if((PIND&0X08)==0)
{
ankey=3;
}
if((PIND&0X10)==0)
{
ankey=4;
}
if((PIND&0X04)==0)
{
ankey=2;
}
if((PINB&0X01)==0)
{
ankey=1;
}
if((PINB&0X40)==0)
{
ankey=5;
}
key_transact(ankey);
}
do
{
disp_update();
zhongduan_set();
}
while(((PIND&0X04)==0)||((PIND&0X08)==0)||((PIND&0X10)==0)||((PINB&0X01)==0)||((PINB&0X40)==0));
}
}
void send_data(unsigned char temp_data)
{
volatile unsigned char red_temp,green_temp,blue_temp,i;
switch(color)
{
case 1: red_temp=temp_data; green_temp=shield_data; blue_temp=shield_data; break;
case 2: red_temp=shield_data; green_temp=temp_data; blue_temp=shield_data; break;
case 3: red_temp=shield_data; green_temp=shield_data; blue_temp=temp_data; break;
case 4: red_temp=temp_data; green_temp=temp_data; blue_temp=shield_data; break;
case 5: red_temp=shield_data; green_temp=temp_data; blue_temp=temp_data; break;
case 6: red_temp=temp_data; green_temp=shield_data; blue_temp=temp_data; break;
case 7: red_temp=temp_data; green_temp=temp_data; blue_temp=temp_data; break;
}
for(i=0;i<8;i++)
{
if((red_temp&0x01)==1)
{
SBI_R;
}
else
{
CBI_R;
}
if((green_temp&0x01)==1)
{
SBI_G;
}
else
{
CBI_G;
}
if((blue_temp&0x01)==1)
{
SBI_B;
}
else
{
CBI_B;
}
SBI_SCK;
red_temp>>=1;
green_temp>>=1;
CBI_SCK;
blue_temp>>=1;
}
}
void send_data_msb(unsigned char temp_data)
{
volatile unsigned char red_temp,green_temp,blue_temp,i;
switch(color)
{
case 1: red_temp=temp_data; green_temp=shield_data; blue_temp=shield_data; break;
case 2: red_temp=shield_data; green_temp=temp_data; blue_temp=shield_data; break;
case 3: red_temp=shield_data; green_temp=shield_data; blue_temp=temp_data; break;
case 4: red_temp=temp_data; green_temp=temp_data; blue_temp=shield_data; break;
case 5: red_temp=shield_data; green_temp=temp_data; blue_temp=temp_data; break;
case 6: red_temp=temp_data; green_temp=shield_data; blue_temp=temp_data; break;
case 7: red_temp=temp_data; green_temp=temp_data; blue_temp=temp_data; break;
}
for(i=0;i<8;i++)
{
if((blue_temp&0x80)==0x80)
{
SBI_B;
}
else
{
CBI_B;
}
if((green_temp&0x80)==0x80)
{
SBI_G;
}
else
{
CBI_G;
}
if((red_temp&0x80)==0x80)
{
SBI_R;
}
else
{
CBI_R;
}
SBI_SCK;
red_temp<<=1;
green_temp<<=1;
CBI_SCK;
blue_temp<<=1;
}
}
void send_pels(unsigned char temp)
{
unsigned char temp_data,i;
switch(temp)
{
case 1:temp_data=0x3f; break;
case 2:temp_data=0x5f; break;
case 3:temp_data=0x9f; break;
case 4:temp_data=0x7f; break;
case 5:temp_data=0xdf; break;
case 6:temp_data=0xbf; break;
case 7:temp_data=0xff; break;
case 8:temp_data=0x00; break;
}
for(i=0;i<3;i++)
{
if((temp_data&0x80)==0x80)
{
SBI_DATA;
}
else
{
CBI_DATA;
}
SBI_SCK;
temp_data<<=1;
CBI_SCK;
}
}
void abc(unsigned char h)
{
switch(h)
{
case 0: CBI_CC;CBI_BB;CBI_AA; break; //0000
case 1: CBI_CC;CBI_BB;SBI_AA; break; //0001
case 2: CBI_CC;SBI_BB;CBI_AA; break; //0010
case 3: CBI_CC;SBI_BB;SBI_AA; break; //0011
case 4: SBI_CC;CBI_BB;CBI_AA; break; //0100
case 5: SBI_CC;CBI_BB;SBI_AA; break; //0101
case 6: SBI_CC;SBI_BB;CBI_AA; break; //0110
case 7: SBI_CC;SBI_BB;SBI_AA; break; //0111
}
}
void Port_init(void)
{
DDRC=0xff;
DDRA=0xff;
DDRB&=~(1<<6); //SW5 按键4,取消/返回 右键
PORTB|=(1<<6); //SW5 使能上拉电阻
DDRD&=~(1<<4); //SW4 按键4,快捷改变颜色
PORTD|=(1<<4); //SW4 使能上拉电阻
DDRD&=~(1<<3); //SW3 按键3,快捷改变模式
PORTD|=(1<<3); //SW3 使能上拉电阻
DDRD&=~(1<<2); //SW2 按键2,快捷改变型号
PORTD|=(1<<2); //SW2 使能上拉电阻
DDRB&=~(1<<0); //SW1 按键2,快捷改变型号
PORTB|=(1<<0); //SW1 使能上拉电阻
DDRD|=(1<<7); //R
DDRD|=(1<<6); //B
DDRD|=(1<<5); //G
DDRB|=(1<<7); //sck
DDRC|=(1<<0); //lat
DDRC|=(1<<1); //oe
DDRB|=(1<<3); //a
DDRB|=(1<<2); //b
DDRB|=(1<<1); //c
DDRB|=(1<<5); /*d (暂用)*/
}
void send_frame(void)
{
unsigned char k,j;
for(k=0;k<disp_number;k++)
{
for(j=0;j<16;j++)
{
send_pels(color);
}
}
SBI_LAT;
SBI_LAT;
CBI_LAT;
}
void time0_init(void) //定时器0初始化
{
TCNT0=225;
TCCR0=4;
TIMSK|=(1<<TOIE0);
}
void time1_init(void) //定时器1初始化
{
TCNT1L=0Xbd;
TCNT1H=0xf0;
TCCR1A=0;
TCCR1B=5;
TIMSK|=(1<<TOIE1);
}
void time2_init(void) //定时器1初始化
{
TCNT2=155;
TCCR2=2;
TIMSK|=(1<<TOIE2);
}
SIGNAL(SIG_OVERFLOW2) //定时器2溢出中断.用于控制亮度
{
if(temp_bright>0)
{
CBI_OE;
temp_bright--;
}
else
{
SBI_OE;
}
if(time2_count>0)
{
time2_count--;
}
else
{
time2_count=10;
temp_bright=brightness;
}
TCNT2=205;
}
SIGNAL(SIG_OVERFLOW0) //定时器0中断 用于显示
{
unsigned char k,j;
TIMSK&=~(1<<TOIE1);
sei();
switch(type)
{
case 0:
if(hang<7)
{
hang++;
}
else
{
hang=0;
}
for(k=0;k<4;k++)
{
send_data(disp_ram[hang*4+k]);
send_data_msb(disp_ram[hang*4+32+k]);
}
SBI_OE;
SBI_LAT;
abc(hang);
CBI_LAT;
TCNT0=247;
CBI_OE;
break;
case 1:
send_data((disp_ram[36]&0xf0)|(disp_ram[32]>>4));
send_data((disp_ram[44]&0xf0)|(disp_ram[40]>>4));
send_data((disp_ram[36]<<4)|(disp_ram[32]&0x0f));
send_data((disp_ram[44]<<4)|(disp_ram[40]&0x0f));
send_data((disp_ram[37]&0xf0)|(disp_ram[33]>>4));
send_data((disp_ram[45]&0xf0)|(disp_ram[41]>>4));
send_data((disp_ram[37]<<4)|(disp_ram[33]&0x0f));
send_data((disp_ram[45]<<4)|(disp_ram[41]&0x0f)); //4
send_data((disp_ram[52]&0xf0)|(disp_ram[48]>>4));
send_data((disp_ram[60]&0xf0)|(disp_ram[56]>>4));
send_data((disp_ram[52]<<4)|(disp_ram[48]&0x0f));
send_data((disp_ram[60]<<4)|(disp_ram[56]&0x0f));
send_data((disp_ram[53]&0xf0)|(disp_ram[49]>>4));
send_data((disp_ram[61]&0xf0)|(disp_ram[57]>>4));
send_data((disp_ram[53]<<4)|(disp_ram[49]&0x0f));
send_data((disp_ram[61]<<4)|(disp_ram[57]&0x0f)); //3
send_data((disp_ram[4]&0xf0)|(disp_ram[0]>>4));
send_data((disp_ram[12]&0xf0)|(disp_ram[8]>>4));
send_data((disp_ram[4]<<4)|(disp_ram[0]&0x0f));
send_data((disp_ram[12]<<4)|(disp_ram[8]&0x0f));
send_data((disp_ram[5]&0xf0)|(disp_ram[1]>>4));
send_data((disp_ram[13]&0xf0)|(disp_ram[9]>>4));
send_data((disp_ram[5]<<4)|(disp_ram[1]&0x0f));
send_data((disp_ram[13]<<4)|(disp_ram[9]&0x0f)); //2
send_data((disp_ram[20]&0xf0)|(disp_ram[16]>>4));
send_data((disp_ram[28]&0xf0)|(disp_ram[24]>>4));
send_data((disp_ram[20]<<4)|(disp_ram[16]&0x0f));
send_data((disp_ram[28]<<4)|(disp_ram[24]&0x0f));
send_data((disp_ram[21]&0xf0)|(disp_ram[17]>>4));
send_data((disp_ram[29]&0xf0)|(disp_ram[25]>>4));
SBI_OE;
send_data((disp_ram[21]<<4)|(disp_ram[17]&0x0f));
send_data((disp_ram[29]<<4)|(disp_ram[25]&0x0f)); //1
lat();
TCNT0=230;
CBI_OE;
break;
case 2: TCNT0=230;
break;
case 3: if(hang<15)
{
hang++;
}
else
{
hang=0;
}
for(j=0;j<2;j++)
{
for(k=4;k>0;k--)
{
send_data(~(disp_ram[hang*4+k-1]));
}
}
SBI_OE;
SBI_LAT;
abc(hang);
CBI_LAT;
TCNT0=247;
CBI_OE;
break;
}
TIMSK|=(1<<TOIE1);
}
SIGNAL(SIG_OVERFLOW1) //定时器1 用于扫描更新数据
{
unsigned char i,j;
union data_union
{
unsigned int word;
unsigned char byte[2];
}data;
sei();
data.word=65535-(speed*781);
if(type==2)
{
switch(mode)
{
case 0: send_frame();
CBI_OE;
TCNT1L=data.byte[0];
TCNT1H=data.byte[1];
break;
case 1: gray_scale++;
data.word=65535-(speed*30);
TCNT1L=data.byte[0];
TCNT1H=data.byte[1];
break;
case 2: send_pels(color);
CBI_OE;
if(send_pels_count>disp_number*16)
{
if(color>=color_amount)
{
color=1;
}
else
{
color++;
}
send_pels_count=0;
if(disp_set==0) //设置时屏蔽更新数据 以防显示错乱
{
update_color();
}
}
else
{
send_pels_count++;
}
lat();
data.word=65535-(speed*50);
TCNT1L=data.byte[0];
TCNT1H=data.byte[1];
break;
}
}
else
{
switch(mode)
{
case 0: for(i=0;i<64;i++)
{
disp_ram[i]=0xff;
}
TCNT1L=data.byte[0];
TCNT1H=data.byte[1];
break;
case 1: if(scan<7)
{
scan++;
}
else
{
scan=0;
}
j=0x80>>scan;
for(i=0;i<64;i++)
{
disp_ram[i]=j;
}
for(i=0;i<4;i++)
{
disp_ram[scan*4+i]=0xff;
disp_ram[scan*4+32+i]=0xff;
}
TCNT1L=data.byte[0];
TCNT1H=data.byte[1];
break;
case 2: if(scan<7)
{
scan++;
}
else
{
scan=0;
}
for(j=0;j<4;j++)
{
for(i=0;i<16;i++)
{
disp_ram[i*4+j]=(pgm_read_byte(shaomiao+i)<<scan)|(pgm_read_byte(shaomiao+i)>>(8-scan));
}
}
TCNT1L=data.byte[0];
TCNT1H=data.byte[1];
break;
case 3: if(scan<7)
{
scan++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -