导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→小弟求助了,嵌入式考试要不及格了!!!![willerwang]

 *第49500篇: 小弟求助了,嵌入式考试要不及格了!!!!

  
楼 主:willerwang 2007年6月5日09:37
 小弟求助了,嵌入式考试要不及格了!!!!
求助了,一个KEY程序,一个LCD程序如何结合在一起!!
[color=#000000][B]用key控制lcd显示 
2个程序如下:
#define LCDCON  *(unsigned long *)0x800002c0
#define PALLSW  *(unsigned long *)0x80000580
#define PALMSW  *(unsigned long *)0x80000540
#define FBADDR  *(unsigned long *)0x80001000
#define SYSCON1         *(unsigned long *)0x80000100

#define LEFTMASK        "\x00\x80\xc0\xe0\xf0\xf8\xfc\xfe"
#define RIGHTMASK       "\xff\x7f\x3f\x1f\x0f\x07\x03\x01"
#define R2MASK          "\x7f\x3f\x1f\x0f\x07\x03\x01\x00"
#define L2MASK          "\x80\xc0\xe0\xf0\xf8\xfc\xfe\xff"

#define FONT_FILE "/bin/hzk"

typedef struct{
      unsigned char id[2];
      long filesize;
      short reserved[2];
      long headsize;
      long infosize;
      long width;
      long height;
      short planes;
      short bits;
      long biCompression;
      long sizeimage;
      long biXpp;
      long biYpp;
      long biclrused;
      long biclrimportant;
}BMPHEAD;

int lcd_setup(unsigned long start_addr, unsigned short width, unsigned short xmax, unsigned short ymax, unsigned short bits_per_pixel)
{

        /* disable LCD first */
        SYSCON1 &= ~0x00001000;

 LCDCON = 0xE60f7c1f;
 PALLSW = 0x76543210;
 PALMSW = 0xFEDCBA98;

        /* setup LCDFRAME  */
 FBADDR = 0x0000000C;
 /* Enable LCD */
 SYSCON1 |= 0x00001000;
        
 return 0;
}

int _lcd_vline(
 unsigned char *fbuf,
 int  x, 
 int  y, 
 int  y1, 
 int  color,
 int  xorm
)
{
 unsigned char *p;
 int tmp;
 
 if (y1     < y){
  tmp = y;
  y = y1;
  y1 = tmp;
 }

 p = fbuf + x * 12 / 8 + y * (320 * 3 * 4 / 8);
   for (; y     <= y1; y++){
   
    if(x&1)
  {
   *p&=0x0f;
   //*p|=0x70;
   *(p+1)&=0x07;
  }
  else
  {
   *p=0x70;
   *(p+1)&=0xf0;
   *(p+1)|=0xf7;
  }
    p += (320 * 3 * 4 / 8);
 }
//   return 0;
}

int lcd_vline(
 short x, 
 short y1, 
 short y2, 
 unsigned char c,
 int xorm
)
{
 return _lcd_vline(
  (unsigned char*)0xc0000000,
  x,
  y1,
  y2,
  c,
  xorm
 );
}

int _lcd_fillrect(
 unsigned char *fbuf,
 int  x, 
 int  y, 
 int  x1, 
 int  y1, 
 int  color
)
{
 // unsigned char *dst;
 int xt, xf; //xmf, xmt;
 // int xi;
 int tmp, w, h;
 
 if (x1     < x){
  tmp = x;
  x = x1;
  x1 = tmp;
 }
 
 if (y1     < y){
  tmp = y;
  y = y1;
  y1 = tmp;
 }
 w  = x1 - x + 1;
 h = y1 - y + 1;
  
    
   xf = x * 12 / 8; 
   xt = (x + w - 1) * 12 / 8;
   for (w += x; x     < w; x++) {
    lcd_vline(x, y, y1, 0, 0);
   }

   return 0;
}

int lcd_fillrect(short x1, short y1, short x2, short y2, int c)
{
 return _lcd_fillrect(
  (unsigned char *)0xc0000000,
  x1,
  y1,
  x2,
  y2,
  c
 );
}

static int lcd_putbigpixel(short x, short y, unsigned char c, int xorm){
 lcd_fillrect(x-2, y-2, x+2, y+2, c);
 return 0;
}

int lcd_ellipse(
 short x, 
 short y, 
 short a,
 short b, 
 unsigned char c, 
 int xorm
)
{
 int wx, wy;
 int thresh;
 int asq = a * a;
 int bsq = b * b;
 int xa, ya;
 
 lcd_putbigpixel(x, y+b, c, xorm);
 lcd_putbigpixel(x, y-b, c, xorm);
 
 wx = 0;
 wy = b;
 xa = 0;
 ya = asq * 2 * b;
 thresh = asq / 4 - asq * b;
 
 for (;;) {
  thresh += xa + bsq;
  
  if (thresh >    = 0) {
   ya -= asq * 2;
   thresh -= ya;
   wy--;
  }
  
  xa += bsq * 2;
  wx++;
  
  if (xa >    = ya)
    break;
  
  
  lcd_putbigpixel(x+wx, y-wy, c, xorm);
  lcd_putbigpixel(x-wx, y-wy, c, xorm);
  lcd_putbigpixel(x+wx, y+wy, c, xorm);
  lcd_putbigpixel(x-wx, y+wy, c, xorm);
 }
 
 lcd_putbigpixel(x+a, y, c, xorm);
 lcd_putbigpixel(x-a, y, c, xorm);
 
 wx = a;
 wy = 0;
 xa = (bsq * a)     <    < 1;
 
 ya = 0;
 thresh = (bsq >    >     2) - bsq * a;
 
 for (;;) {
  thresh += ya + asq;
  
  if (thresh >    = 0) {
   xa -= bsq + bsq;
   thresh = thresh - xa;
   wx--;
  }
  
  ya += asq + asq;
  wy++;
  
  if (ya >     xa)
    break;
   
  lcd_putbigpixel(x+wx, y-wy, c, xorm);
  lcd_putbigpixel(x-wx, y-wy, c, xorm);
  lcd_putbigpixel(x+wx, y+wy, c, xorm);
  lcd_putbigpixel(x-wx, y+wy, c, xorm);
 } 
// return 0;
}

void lcd_clear(void)
{
        {
                unsigned char *base = (unsigned char *)0xc0000000;
                int i;
                for (i = 0; i     < 320 * 240 * 12 /8 ; i++){
                        *base++ = 0x77;
                }
        }
}
// int main()
static int LCD_Driver(void)//_start()
{
 lcd_setup(0xC0000000,240, 240, 320, 4);
 lcd_clear();
 lcd_ellipse(150,150,100,50,0,0);
// lcd_vline(122,20,165,0,0);
// lcd_fillrect(20,20, 200, 200, 0);
}

int c_entry(){
 init_serial1();
 puts1("LCD TEST\n");

 LCD_Driver();
loop: 
 goto loop;

// return 0;[/B][/color]

第2个key程序:
#define SFR_BADDR 0x80000000         
#define rSYSCON1        (*(volatile unsigned *)(SFR_BADDR + 0x0100))
#define rPADR       (*(volatile unsigned char *)(SFR_BADDR + 0x0000))
#define rPADDR      (*(volatile unsigned char *)(SFR_BADDR + 0x0040))

static unsigned char Keyvalue;

static unsigned char Function_Key_value;

static unsigned char value;

static unsigned char keyold;
static unsigned char keynew;
static unsigned char ckeynum;


void dly(int n)
 {
  int i, j;
  for(i = 0; i     < 1000; i++)
   for(j = 0; j     < n; j++);
 }

unsigned char Key_Driver(void)

{

 value = 0;
 ckeynum = 0;
                 
        while(1)
        {
           
          rSYSCON1 &= ~0xf; // 键盘的第一列扫描
          dly(10);
      
  value = rPADR;        // 得到PA口的值,当PA0,PA1,PA2,PA3其中为一时,表示有按键发生,按键
                    // 的行号即对应的PA几,列号就是1。本按键可支持同时按键。即支持带功能键
  value &= 0xf;
  if(value == 0)
  {
   keyold = 0;
   break;
  } 
  else
   dly(100); //10ms????????????????????????
   value = rPADR;
   value &= 0xf;

   if(value == 0)
   {
    keyold = 0;
         break;
   }      
   else
    rSYSCON1 |= 0x8;
    dly(10);

    value = rPADR;
    value &= 0xf;

    if(value & 0x1)
    { 
     keynew = 1;
     ckeynum++;
    }
    if (value & 0x2) 
    {
     keynew = 5;
     ckeynum++;
    }
    if (value & 0x4) 
    {
     keynew = 9;
     ckeynum++;
    } 
    if (value & 0x8) 
    {
     keynew = 13;
     ckeynum++;
    } 

        
          rSYSCON1 &= ~0xf;   // 键盘的第二列扫描
     rSYSCON1 |= 0x9; // 键盘的第二列置高电平
     dly(10);  
     value = rPADR;
    value &= 0xf;
   
     if (value & 0x01)      // 第二列扫描开始
     {
     keynew = 2;
     ckeynum++;
    } 
  
    if (value & 0x2) 
    {
     keynew = 6;
     ckeynum++;
    } 

    if (value & 0x4) 
    {
     keynew = 10;
     ckeynum++;
    } 
   
    if (value & 0x8) 
    {
     keynew = 14;
     ckeynum++;
    }
  
     rSYSCON1 &= ~0xf;     // 键盘的第三列扫描
     rSYSCON1 |= 0xA;  // 键盘的第三列置高电平
     dly(10); 
     value = rPADR;
     value &= 0xf;
     if (value & 0x01)     // 第三列扫描开始
     {
     keynew = 3;
     ckeynum++;
    } 
  
     if (value & 0x2) 
    {
     keynew = 7;
     ckeynum++;
    } 

    if (value & 0x4) 
    {
     keynew = 11;
     ckeynum++;
    } 
   
    if (value & 0x8) 
    {
     keynew = 15;
     ckeynum++;
    }
 
    rSYSCON1 &= ~0xf;     // 键盘的第四列扫描
     rSYSCON1 |= 0xB;  // 键盘的第四列置高电平
     dly(10); 
     value = rPADR;
     value &= 0xf;
     if (value & 0x01)     // 第四列扫描开始
     {
     keynew = 4;
     ckeynum++;
    } 
  
    if (value & 0x2) 
    {
     keynew = 8;
     ckeynum++;
    } 

    if (value & 0x4) 
    {
     keynew = 12;
     ckeynum++;
    } 
   
    if (value & 0x8) 
    {
     keynew = 16;
     ckeynum++;

    }
    
    {
    if(ckeynum == 1)
     ckeynum = 0;
     if(keyold != keynew)
     {
      keyold = keynew;
      if(keynew==1)
       puts1("Keyvalue =1\n");
      else if(keynew ==2)
       puts1("Keyvalue =2\n");
      else if(keynew ==3)
       puts1("Keyvalue =3\n"); 
      else if(keynew ==4)
       puts1("Keyvalue =4\n");
      else if(keynew ==5)
       puts1("Keyvalue =5\n");
      else if(keynew ==6)
       puts1("Keyvalue =6\n");
      else if(keynew ==7)
       puts1("Keyvalue =7\n");
      else if(keynew ==8)
       puts1("Keyvalue =8\n");
      else if(keynew ==9)
       puts1("Keyvalue =9\n");
      else if(keynew ==10)
       puts1("Keyvalue =10\n");
      else if(keynew ==11)
       puts1("Keyvalue =11\n");
      else if(keynew ==12)
       puts1("Keyvalue =12\n");
      else if(keynew ==13)
       puts1("Keyvalue =13\n");
      else if(keynew ==14)
       puts1("Keyvalue =14\n");
      else if(keynew ==15)
       puts1("Keyvalue =15\n");
      else if(keynew ==16)
       puts1("Keyvalue =16\n");
     }  
    }
 }
}

int c_entry(){

 init_serial1();
 puts1("KEY TEST\n");
 
loop:
 Key_Driver();
 goto loop;
 return 0;
}


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:CD4046,汗!!

[下一篇主题]:求助了,一个KEY程序,一个LCD程序如何结合在一起!!