?? main.c
字號:
/****************************************
主控芯片;STC12C5A32S2 晶振:30M
通信波特率:9600
使用點陣屏 :32*64雙色
程序實現功能:
通過上位機字幕軟件生成的字幕數據下載到單片機內部的EEPROM
此款單片機內部有32K的EEPROM 所以可以存儲較多的字
字幕軟件可配置16*16 和32*32字體
其中 16*16字體可設置顯示顏色 紅 綠 黃 三種
可設置移動速度
移動方式目前只有一種左移 往后繼續加
其他功能待開發
上位機使用見說明
歡迎大家做技術交流:QQ 77554971
手上有多片STC12C5A32S2最小系統版 如有需要 25元出售 板上40個IO全部引出 板載DS1302接口 DHT11溫濕度接口 紅外接收一體化頭 4個獨立按鍵
http://item.taobao.com/item.htm?id=15255080252
另外如需要2手32*64雙色點陣屏的朋友可聯系我
祝大家學習進步!
*****************************************/
#include "NEW_8051.H"
#include "main.h"
#define light 3 //定義亮度
uchar code hanzi[]; //漢字字模
uchar code hanzi1[]; //漢字字模
//0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
uchar code sw[16]={0X00,0X08,0x04,0x0C,0X02,0X0A,0X06,0X0E,0X01,0X09,0X05,0X0D,0X03,0X0B,0X07,0X0F};/*16行段碼*///138驅動數據
sbit IA =P4^0; //行控制線A
sbit IB =P2^0; //行控制線B
sbit IC =P2^1; //行控制線C
sbit ID =P2^2; //行控制線D
#define scan0 {IA=0;IB=0;IC=0;ID=0;}
#define scan1 {IA=1;IB=0;IC=0;ID=0;}
#define scan2 {IA=0;IB=1;IC=0;ID=0;}
#define scan3 {IA=1;IB=1;IC=0;ID=0;}
#define scan4 {IA=0;IB=0;IC=1;ID=0;}
#define scan5 {IA=1;IB=0;IC=1;ID=0;}
#define scan6 {IA=0;IB=1;IC=1;ID=0;}
#define scan7 {IA=1;IB=1;IC=1;ID=0;}
#define scan8 {IA=0;IB=0;IC=0;ID=1;}
#define scan9 {IA=1;IB=0;IC=0;ID=1;}
#define scan10 {IA=0;IB=1;IC=0;ID=1;}
#define scan11 {IA=1;IB=1;IC=0;ID=1;}
#define scan12 {IA=0;IB=0;IC=1;ID=1;}
#define scan13 {IA=1;IB=0;IC=1;ID=1;}
#define scan14 {IA=0;IB=1;IC=1;ID=1;}
#define scan15 {IA=1;IB=1;IC=1;ID=1;}
sbit STR=P4^1; //鎖存
sbit SCK=P2^7; //時鐘
sbit SERr1= P2^4; //數據
sbit SERg1= P2^6;
sbit SERr= P2^3;
sbit SERg= P2^5;
uchar Move,Speed,line; //時間溫度變量
uint zimuo; //字模計數器
uchar BUFF[20]; //緩存
uchar BUFF1[20]; //緩存
uchar ucTimeOut;
uchar i;
uint uiBaseAddress=0;
uint uiFontNumber=0;
//void DelayMs(void); // 延時
void in_data(); // 調整移動數據
void rxd_data(); // 串口發送移動數據
/******************************************************/
uchar ucSetSpeed=0;
uchar ucSpeed=3;
uchar ucSetPlateNum=0;
uchar ucPlateNum=0;
uchar ucSetShowMode=0;
uchar ucShowMode=0;
uchar ucSetFontSize=0;
uchar ucFontSize=0;
uchar BuffCount=0;
uchar ucSetFontColor=0;
uchar ucFontColor=0;
uchar DelayMs=0;
uchar l=0;
bit bDelayMsOver=0;
uchar ucEEPArray=0;
uchar ucUdateTime=0;
void Send8Line();
void Send16Line();
void Send24Line();
void Send32Line();
void Load32();
/*****不影響其他端口的掃描*************************/
void scan(unsigned char Value)
{switch(Value)
{case 15: scan0;break;
case 0: scan1;break;
case 1: scan2;break;
case 2: scan3;break;
case 3: scan4;break;
case 4: scan5;break;
case 5: scan6;break;
case 6: scan7;break;
case 7: scan8;break;
case 8: scan9;break;
case 9:scan10;break;
case 10:scan11;break;
case 11:scan12;break;
case 12:scan13;break;
case 13:scan14;break;
case 14:scan15;break;
default:break;
}
}
/*************************/
void DelayMss(void)
{
uchar TempCyc;
for(TempCyc=150;TempCyc>1;TempCyc--)
{;}
}
/**************************延時***********************/
void InitTimer0(void)
{
TMOD|= 0x01;
TH0 = 0x0C4;
TL0 = 0x00;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/***********************************/
void Send_data(unsigned char d) /*從串口發送數據*/
{
ES=0;
SBUF=d;
while(TI==0); //等待發送完畢
TI=0;
ES=1;
}
/*****************************************/
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0C4;
TL0 = 0x00;
if( ucTimeOut )
{
ucTimeOut--;
if( !ucTimeOut )
{
//bEanle=0;
LED4=1;
}
}
if(ucUdateTime)
{
ucUdateTime--;
if(!ucUdateTime)
{
//uiBaseAddress=0;
//bEanle=0;
}
}
/**************************************/
}
/****************************************/
void LED_Display(void)
{
ucSetPlateNum=byte_read(0x0003);//讀取EEPROM里設置的點陣屏塊數量(32*64一塊)
switch ( ucSetPlateNum )
{
case 0X01:
ucPlateNum=8; //1塊
break;
case 0X02:
ucPlateNum=16; //2塊
break;
case 0X03:
ucPlateNum=24;//3塊
break;
case 0X04:
ucPlateNum=32;//4塊
break;
case 0X05:
ucPlateNum=40; //5塊
break;
default:
ucPlateNum=8; //1塊
break;
}
/***********************************/
ucSetShowMode=byte_read(0x0004); //顯示方式
switch ( ucSetShowMode )
{
case 0X01:
ucShowMode=1; //左移
break;
case 0X02:
ucShowMode=2; //右移
break;
case 0X03:
ucShowMode=3;
break;
case 0X04:
ucShowMode=4;
break;
case 0X05:
ucShowMode=5;
break;
default:
ucShowMode=2;
break;
}
/***********************************/
ucSetSpeed=byte_read(0x0000); //移動速度
switch ( ucSetSpeed )
{
case 0X01:
ucSpeed=2;
break;
case 0X02:
ucSpeed=4;
break;
case 0X03:
ucSpeed=6;
break;
case 0X04:
ucSpeed=8;
break;
case 0X05:
ucSpeed=10;
break;
default:
ucSpeed=5;
break;
}
/********************************************/
ucSetFontSize=byte_read(0x0001); //字體大小
switch ( ucSetFontSize )
{
case 0X01:
ucFontSize=16;
break;
case 0X02:
ucFontSize=32;
break;
default:
ucFontSize=16;
break;
}
/**************************************************/
ucSetFontColor=byte_read(0x0002); //字體顏色
switch ( ucSetFontColor )
{
case 0X01:
ucFontColor=1; //紅
break;
case 0X02:
ucFontColor=2; //綠
break;
case 0X03:
ucFontColor=3; //黃
break;
default:
ucFontColor=1;
break;
}
uiFontNumber=(byte_read(0x0100)<<8)+byte_read(0x0101);
}
/*主函數*/
void main()
{
InitTimer0();
uart_init();
Move=0;
zimuo=0;
LED_Display();
//uart_rBIT=1;
/*******************************************/
while(1)
{
while(zimuo<uiFontNumber+64)
{
//if( !bEanle ) //下載數據和設置屏參數時不顯示信息
//{
if(ucShowMode==0x01)
{
while(Move<ucFontSize) //數據移位。
{
for(Speed=0;Speed<ucSpeed;Speed++) //移動速度
{
for(line=0;line<16;line++)
{
in_data(); //調整移動數據
rxd_data();
// P0=sw[line];
scan(line);
STR=1;//鎖存
STR=0;
STR=1;
DelayMss(); //延時,等待一段時間,讓這列顯示的內容在人眼內產生“視覺暫留”現象。
}
}
/****************************************************/
l++;
if(l==16)l=0;
Move++; //移動一步
}
Move=0;
if(ucFontSize==32)
{
zimuo=zimuo+128;
}
else
{
zimuo=zimuo+32;
}
}
/**********************************************************/
else if(ucShowMode==0x02)
{
for(i=0;i<32;i++)
{
for(Speed=0;Speed<16;Speed++) //移動速度
{
for(line=0;line<16;line++)
{
in_data();//調整移動數據
if((i<=15)&&(line<=i))
Send8Line();
else
Send16Line();
if(i>15)
{
if(line<=(i-15))
{
Send24Line();
}
else
{
Send32Line();
}
}
STR=1;//鎖存
STR=0;
STR=1;
//P0 =sw[line];
if(i>15)
{
if(i-15>line)
P0 =sw[i-15-line];
else
P0=sw[line+15-i];
}
//P0= sw[line];
else
P0 =sw[i-line];
}
DelayMss();
}
}
/********************************************************/
for(i=0;i<120;i++)
{
for(line=0;line<16;line++)
{
Load32();
Send24Line();
STR=1;//鎖存
STR=0;
STR=1;
P0 =sw[line];
}
}
//zimuo=zimuo+256;
}
}
zimuo=0;
}
}
/*********************************************************/
void Send8Line()
{
uchar k,i;
SERg=SERg1=1;
for(i=0;i<8;i++)
{
for(k=0;k<8;k++)
{
SCK=0;
SERr=(bit)(BUFF1[i]&0x01);//這里SERr定義成普通IO口就得了
BUFF1[i]=BUFF1[i]>>1;
SERr1=1;
SCK =1;
}
}
}
/*********************************************************/
void Send16Line()
{
uchar k,i;
SERg=1;
SERg1=1;
for(i=0;i<8;i++)
{
for(k=0;k<8;k++)
{
SCK=0;
SERr=1;//這里SERr定義成普通IO口就得了
SERr1=1;
SCK=1;
}
}
}
/*********************************************************/
void Send24Line()
{
uchar k,i;
SERg=SERg1=1;
for(i=0;i<8;i++)
{
for(k=0;k<8;k++)
{
SCK=0;
SERr=(bit)(BUFF[i]&0x01);//這里SERr定義成普通IO口就得了
BUFF[i]=BUFF[i]>>1;
SERr1=(bit)(BUFF1[i]&0x01); //這里SERr定義成普通IO口就得了
BUFF1[i]=BUFF1[i]>>1;
SCK=1;
}
}
}
/********************************************************/
void Send32Line()
{
uchar k,i;
SERg=SERg1=1;
for(i=0;i<8;i++)
{
for(k=0;k<8;k++)
{
SCK=0;
SERr=(bit)(BUFF[i]&0x01);//這里SERr定義成普通IO口就得了
BUFF[i]=BUFF[i]>>1;
SERr1=1;
SCK =1;
}
}
}
void Load32()
{
char s;
for(s=2;s>=0;s--) //i為向后先擇字節計數器,zimuoo為向后先字計數器
{
BUFF[4*s]=byte_read(0x200+zimuo+128*s+4*line);
BUFF[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*line);
BUFF[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*line);
BUFF[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*line);
BUFF1[4*s]=byte_read(0x200+zimuo+128*s+4*line+64);
BUFF1[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*line+64);
BUFF1[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*line+64);
BUFF1[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*line+64);
}
}
/**********************************************************/
void in_data(void) //調整數據
{
char s;
if(ucShowMode==0x01)//左移
{
if( ucFontSize==16 )//如果字體是16*16
{
for(s=8;s>=0;s--) //i為向后先擇字節計數器,zimuoo為向后先字計數器
{
BUFF[2*s+1]=byte_read(0x200+zimuo+1+32*s+2*line); //把第一個字模的第一個字節放入BUFF0中,第二個字模和第一個字節放入BUFF2中
BUFF[2*s]=byte_read(0x200+zimuo+32*s+2*line); //把第一個字模的第二個字節放入BUFF1中,第二個字模的第二個字節放入BUFF3中
BUFF1[2*s+1]=byte_read(0x200+zimuo+1+32*s+2*line); //把第一個字模的第一個字節放入BUFF0中,第二個字模和第一個字節放入BUFF2中
BUFF1[2*s]=byte_read(0x200+zimuo+32*s+2*line);
}
}
else if( ucFontSize==32 ) //如果字體是32*32
{
Load32();
}
}
else if(ucShowMode==0x02)//右移
{
if(ucFontSize==32)
{
for(s=1;s>=0;s--) //i為向后先擇字節計數器,zimuoo為向后先字計數器
{
BUFF[4*s]=byte_read(0x200+zimuo+128*s+4*(15-line));
BUFF[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*(15-line));
BUFF[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*(15-line));
BUFF[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*(15-line));
BUFF1[4*s]=byte_read(0x200+zimuo+128*s+4*(15-line)+64);
BUFF1[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*(15-line)+64);
BUFF1[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*(15-line)+64);
BUFF1[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*(15-line)+64);
}
}
}
}
/***********************發送移動的數據****************************/
void rxd_data(void) //串行發送數據
{
uchar s;
uchar inc,tempyid,temp,k,temp1;
if(Move<8)
{
inc=0;
}
else if((Move>=8)&&(Move<16))
{
inc=1;
}
else if((Move>=16)&&(Move<24))
{
inc=2;
}
else if(Move>=24)
{
inc=3;
}
for(s=0+inc;s<8+inc;s++) //發送ucSePlateNum字節數據
{
if(l<8)
tempyid=l;
else
tempyid=l-8;
temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的數據。
//temp=255-temp;
temp1=(BUFF1[s]>>tempyid)|(BUFF1[s+1]<<(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的數據。
// temp1=255-temp1;
/************************************************************/
if(ucFontColor==1) //紅色
{
SERg=SERg1=1;
for(k=0;k<8;k++)
{
SCK=0;
SERr=(bit)(temp&0x01);//這里SERr定義成普通IO口就得了
temp=temp>>1;
SERr1=(bit)(temp1&0x01);
temp1=temp1>>1;
SCK=1;
}
}
/***********************************************/
else if(ucFontColor==2)//綠色
{
SERr=SERr1=1;
for(k=0;k<8;k++)
{
SCK=0;
SERg=(bit)(temp&0x01);//這里SERr定義成普通IO口就得了
temp=temp>>1;
SERg1=(bit)(temp1&0x01);
temp1=temp1>>1;
SCK=1;
}
}
else if(ucFontColor==3)//黃色
{
for(k=0;k<8;k++)
{
SCK=0;
SERr=SERg=(bit)(temp&0x01);//這里SERr定義成普通IO口就得了
temp=temp>>1;
SERr1=SERg1=(bit)(temp1&0x01);
temp1=temp1>>1;
SCK=1;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -