- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit SHCP=P3^6;//595的移位信號
- sbit STCP=P3^5;//是595的鎖存信號
- sbit SDA=P3^4;//紅數據
- sbit IA=P1^0;//行控制線A
- sbit IB=P1^1;//行控制線B
- sbit IC=P1^2;//行控制線C
- /********************************************************************/
- #define scan0 {IA=0;IB=0;IC=0;}
- #define scan1 {IA=1;IB=0;IC=0;}
- #define scan2 {IA=0;IB=1;IC=0;}
- #define scan3 {IA=1;IB=1;IC=0;}
- #define scan4 {IA=0;IB=0;IC=1;}
- #define scan5 {IA=1;IB=0;IC=1;}
- #define scan6 {IA=0;IB=1;IC=1;}
- #define scan7 {IA=1;IB=1;IC=1;}
- #define light 3
- extern uint uiAllData; //定義亮度
- uchar code hanzi[]; //漢字字模
- uchar Move,Speed,line,tome_count; //(移位 速度 行 ) 定義
- uint zimuo; //字模計數器
- uint uiAllData;
- uchar BUFF[10]; //緩存
- void DelayMs(void); // 延時
- void in_data(); // 調整移動數據
- void rxd_data(); // 發送移動數據
- uchar time_count=0; //計數
- void rxd_data1(); // 發送移動數據
- /******************************************************/
- /*****不影響其他端口的掃描*************************/
- void scan(unsigned char Value)
- {switch(Value)
- { case 0: scan0;break;
- case 1: scan1;break;
- case 2: scan2;break;
- case 3: scan3;break;
- case 4: scan4;break;
- case 5: scan5;break;
- case 6: scan6;break;
- case 7: scan7;break;
- default:break;
- }
- }
- /**************************延時***********************/
- void DelayMs(void)
- {
- uchar TempCyc;
- for(TempCyc=250;TempCyc>1;TempCyc--)
- {;}
- }
- /********************************************/
- /*主函數*/
- void main()
- {
- Move=0;
- zimuo=0;
- while(1)
- {
- //利用sizeof()語句 運算字幕有效數據的總數;
- while(zimuo<1024)//2048)//定義顯示字幕數據的長度 2048/32=64 即顯示完64個16*16大小的字符后 重新循環
- {
- while(Move<16) //數據移位。
- {
- for(Speed=0;Speed<3;Speed++) //移動速度控制
- {
- for(line=0;line<8;line++)
- {
- in_data(); //調整移動數據
- rxd_data(); //裝載移動數據
- scan(line); //輸出行掃描
-
- STCP=1;//鎖存
- STCP=0;
-
- DelayMs(); //延時,等待一段時間,讓這列顯示的內容在人眼內產生“視覺暫留”現象。
- DelayMs();
-
- }
- }
- Move++; //移動一步
- }
- Move=0;
- zimuo=zimuo+64; //換下一個字 這里不在移動地址 就實現了靜態顯示
- }
-
- TMOD=0x01; //定時器0 16位定時定時器1方式2
- TH0=0x4c; //50ms
- TL0=0x00;
- TR0=1; //開定時器計數
- ET0=1; //開定時器中斷
- EA=1; //開中斷
- while(tome_count<9) //怎么樣跳出這個循環????????
- {
- }
-
- zimuo=0;
- }
- }
-
- /**********************************************************/
- void in_data(void) //調整數據一個屏2個字的數據
- {
- char s;
- for(s=2;s>=0;s--) //一個屏能顯示4個字 取最前面的字發送給595的最前面
- { //zimuo 是個計算顯示到哪個字的計數器 s是取4個字的循環 line是顯示到哪一行 根據這幾個參數計算出一個屏中現在需要顯示的數據 放入BUFF 內存中 等待發送給595
- BUFF[2*s]=hanzi[zimuo+32*s+2*line]; //要知道為什么這么算就需要知道取模的方向和原理 一行有8個字節 (一個中文16*16的字 一行有2個字節)
- BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*line];//把一個字的首字節放入BUFF[0]中 后面一個字節放入BUFF[1] 以此類推剩下的3個字
- }
- }
- /***********************發送移動的數據****************************/
- void rxd_data(void) //串行發送數據
- {
- uchar s;
- uchar temp,k;
- for(s=0;s<4;s++) //發送4字節數據
- {
- temp=BUFF[s];
- temp=255-temp;
- SDA=0;
- for(k=0;k<8;k++)//一個字節8位 發送給595
- {
- SHCP=0; //上升沿移位595
- SDA=(bit)(temp&0x01);//通過IO口送一個位給 595 0x01
- temp=temp>>1; //字節移位 準備送下一位
- SHCP=1;
- }
- }
- }
- void Timer0Interrupt(void) interrupt 1 //定時器中斷
- {
- TH0 = 0x04C;//定時50MS 這里的晶振是18.432M 測試無需理會晶振大小
- TL0 = 0x000;
-
- time_count++;
- if(time_count>8)//發送一次數據
- {
- time_count=0;
- line++; //下一行
- if(line>8) //共16行
- {
- line=0; //重新移動
- }
- rxd_data1();//發送數據
- scan(line); //打開行掃描
- STCP=1;//鎖存
- STCP=0;
- }
-
- }
- void rxd_data1(void) //串行發送數據
- {
- uchar s;
- uchar k;
- for(s=0;s<4;s++)//發送4字節數據 一行4個字節
- {
- for(k=0;k<8;k++) //一個字節8位
- {
- SHCP=0; //上降沿移位595
- SDA=1;
- SHCP=1;
- }
- }
- }
- const uchar code hanzi[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
- 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
- 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,/*"未命名文件",0*/
- 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
- 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,/*"未命名文件",0*/
- 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
- 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,/*"未命名文件",0*/
- 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
- 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,/*"未命名文件",0*/
- 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
- 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,/*"未命名文件",0*/
- 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
- 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,/*"未命名文件",0*/
- 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
- 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,/*"未命名文件",0*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
- 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,/*"未命名文件",0*/
- 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,/*"未命名文件",0*/
- 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"未命名文件",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"未命名文件",0*/
- };
復制代碼 |