SOGO論壇
  登入   註冊   找回密碼
查看: 1154|回覆: 3
列印 上一主題 下一主題

[程式設計] 程式盲點我看不懂 求助一下!! [複製連結]

Rank: 3Rank: 3

狀態︰ 離線
跳轉到指定樓層
1
發表於 2013-7-26 21:04:19 |只看該作者 |倒序瀏覽
#include "reg51.h"       
#define COLS 16
#define ROWS 2
#define NUMS 2   每個字間隔2行 但是顯示出來只有一行#define SPACE 2
void delay(unsigned int);
char ScanLine=0;
char i=0;
char j;
char k=COLS+SPACE;
sbit ctrls=0x96;
sbit P1_4=0x94;
sbit P1_5=0x95;
unsigned char *ptr1[COLS];
unsigned char *ptrn[COLS];
unsigned char code pattern[(COLS+SPACE)*NUMS][ROWS]=
        {{0x45,0xff},{0x15,0xc0},        【一個字元
         {0x55,0xd5},{0x40,0xd5},       
         {0x7f,0xd5},{0x47,0xd5},       
         {0x10,0xc0},{0x55,0xd5},
         {0x45,0xd5},{0xdf,0xff},
         {0xef,0xdf},{0xf0,0xef},
         {0x17,0xf0},{0xf7,0xef},
         {0x87,0xdf},{0xff,0xff},            】

         {0xff,0xff},{0xff,0xff},  兩行編碼       

         {0x6e,0xdf},{0xad,0xef},       
         {0x4b,0xf7},{0xef,0xe8},       
         {0xff,0xdf},{0x03,0xdc},       
         {0xfb,0xde},{0x7d,0xdf},
         {0xbd,0xdf},{0x02,0xd0},
         {0xfb,0xdf},{0xfb,0xde},
         {0xfb,0xdd},{0x03,0xde},
         {0xff,0xdf},{0xff,0xff},
       
        {0xff,0xff},{0xff,0xff} };          兩行編碼
main()
{
  void ShiftLeft(void);
  char i;
  IE=0x82;
  TMOD=0x01;
  TH0=(65536-1000)/256;
  TL0=(65536-1000)%256;
  P1_4=0;
  P1_5=0;
  TR0=1;
       
       
  for(i=0;i<COLS;i++)
    *(ptr1+i)=*(pattern+i);       
  while(1)
    {
       for(i=0;i<COLS;i++)
         *(ptrn+i)=*(pattern+i+k);        
       for(i=0;i<COLS;i++)
                 {
           delay(100000);
           ShiftLeft();
         }       
       k=k+COLS+SPACE;       
       if(k==(COLS+SPACE)*2)
                         k=0;       
    }                           
}
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

Rank: 4

數位軟體勳章

狀態︰ 離線
2
發表於 2013-7-26 22:04:30 |只看該作者
既然程式開頭已宣告 void delay(unsigned int);
所以 delay(100000); 會有問題?
unsigned int 無號整數型態 2 byte,範圍 0 ~ 65535,顯然 100000 已超出 65535
未見 ShiftLeft ( ) 函數定義,顯然整個程式尚未完整,所以 compiler 會出錯!

#include <at89x52.h> 取代 #include "reg51.h"  就不需要再宣告 sbit P1_4=0x94;
在程式中直接就可以使用 P1_4

macro 巨集指令 #define COLS 16
意思是在以下的程式中有 COLS 就以 16 來取代
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 1 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 1   查看全部評分

Rank: 3Rank: 3

狀態︰ 離線
3
發表於 2013-7-26 22:25:27 |只看該作者
完整程式碼
#include "reg51.h"       
#define COLS 16
#define ROWS 2
#define NUMS 4
#define SPACE 2
void delay(unsigned int);
char ScanLine=0;
char i=0;
char j;
char k=COLS+SPACE;
sbit ctrls=0x96;
sbit P1_4=0x94;
sbit P1_5=0x95;
unsigned char *ptr1[COLS];
unsigned char *ptrn[COLS];
unsigned char code pattern[(COLS+SPACE)*NUMS][ROWS]=
        {{0x45,0xff},{0x15,0xc0},       
         {0x55,0xd5},{0x40,0xd5},       
         {0x7f,0xd5},{0x47,0xd5},       
         {0x10,0xc0},{0x55,0xd5},
         {0x45,0xd5},{0xdf,0xff},
         {0xef,0xdf},{0xf0,0xef},
         {0x17,0xf0},{0xf7,0xef},
         {0x87,0xdf},{0xff,0xff},

         {0xff,0xff},{0xff,0xff},       

         {0x6e,0xdf},{0xad,0xef},       
         {0x4b,0xf7},{0xef,0xe8},       
         {0xff,0xdf},{0x03,0xdc},       
         {0xfb,0xde},{0x7d,0xdf},
         {0xbd,0xdf},{0x02,0xd0},
         {0xfb,0xdf},{0xfb,0xde},
         {0xfb,0xdd},{0x03,0xde},
         {0xff,0xdf},{0xff,0xff},
       
         {0xff,0xff},{0xff,0xff},       

         {0xdf,0xff},{0xdf,0xdf},       
         {0xdf,0xef},{0xdd,0xf7},       
         {0xd3,0xf9},{0x1f,0xfe},       
         {0xdf,0xff},{0xc0,0xff},
         {0xdf,0xff},{0x1f,0xe0},
         {0xd7,0xdf},{0xdb,0xdf},
         {0xdd,0xdf},{0xdd,0xdf},
         {0xdf,0xc3},{0xff,0xff},

         {0xff,0xff},{0xff,0xff},       

         {0x00,0xe0},{0xee,0xee},       
         {0xe0,0xe0},{0xee,0xee},       
         {0x0e,0xee},{0xff,0xff},       
         {0xf7,0xe1},{0xf8,0xed},
         {0x85,0xed},{0xb5,0xe1},
         {0xb5,0xff},{0xb5,0xe1},
         {0xb5,0xed},{0x85,0xed},
         {0xfd,0xe1},{0xff,0xff},

     {0xff,0xff},{0xff,0xff} };        
main()
{
  void ShiftLeft(void);
  char i;
  IE=0x82;
  TMOD=0x01;
  TH0=(65536-1000)/256;
  TL0=(65536-1000)%256;
  P1_4=0;
  P1_5=0;
  TR0=1;
       
       
  for(i=0;i<COLS;i++)
    *(ptr1+i)=*(pattern+i);       
  while(1)
    {
       for(i=0;i<COLS;i++)
         *(ptrn+i)=*(pattern+i+k);        
       for(i=0;i<COLS;i++)
                 {
           delay(100000);
           ShiftLeft();
         }       
       k=k+COLS+SPACE;       
       if(k==(COLS+SPACE)*4)
                         k=0;       
    }                           
}

void ShiftLeft(void)
  {
    char i;
    char *temp;
    TR0=0;
    temp=*ptrn;
    for(i=0;i<COLS-1;i++)
      {
        *(ptr1+i)=*(ptr1+i+1);
        *(ptrn+i)=*(ptrn+i+1);
      }
    *(ptr1+COLS-1)=temp;
    TR0=1;
  }

void T0_int(void) interrupt 1
{
  TH0=(65536-1000)/256;
  TL0=(65536-1000)%256;

        ctrls=1;
       
       
       
        j=0;
  P2=*(*(ptr1+i)+j);
        P1_4=1;
        P1_4=0;
        j++;

       
       
        P2=*(*(ptr1+i)+j);
        P1_5=1;
        P1_5=0;

       
       
        P1=ScanLine;
        ctrls=0;
        ScanLine++;       
        i++;
       
        if(ScanLine==16)
          {
            ScanLine=0;
            i=0;
          }
               
               
}       

void delay(unsigned int count)
{
  int i;
  for(i=0;i<count;i++)
                ;
}

Rank: 3Rank: 3

狀態︰ 離線
4
發表於 2013-7-26 22:28:32 |只看該作者
delay(100000); 左移動速度快慢
#define SPACE 2 每個字間隔2行 但是顯示出來只有一行
#define COLS 16共有16行
16X16點距陣顯示器
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 1 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 1   查看全部評分

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-11-11 19:58

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部