久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4366|回復(fù): 0
收起左側(cè)

lcd240*128液晶屏的單片機驅(qū)動程序(貪食蛇)

[復(fù)制鏈接]
ID:74985 發(fā)表于 2015-3-21 04:51 | 顯示全部樓層 |閱讀模式




#ifndef _lcd_h
#define _lcd_h
#define uchar unsigned  char
#define uint unsigned short
#define cd(x) (x?(IOSET1|=1<<16):(IOCLR1|=1<<16))
#define rd(x) (x?(IOSET1|=1<<17):(IOCLR1|=1<<17))
#define wr(x) (x?(IOSET1|=1<<18):(IOCLR1|=1<<18))
#define portout(dat) do{IOSET1 = (unsigned char)dat<<19;IOCLR1 = (~(unsigned char)dat<<19)&0x07f80000;}while(0)
#define portint() (IO1PIN&0X07f80000)
#define output() (IO1DIR |=0X07f80000)
#define input()  ((IO1DIR |=0Xf807ffff))
extern void lcd_init(void);
extern void sel_big(uchar x,uchar y);
extern void erect(uchar y0,uchar y1,uchar x);
extern void horizontal(uchar x0,uchar x1,uchar y);
extern void graph_mode_writeword(uchar x,uchar y,uchar *dat);
extern void word_byte(uchar row ,uchar list, uchar *pdat);
extern void lcd_writecom_two(uchar onedat,uchar twodat,uchar com);
extern void lcd_writedat_onebyte(uchar onedat,uchar com);
extern void lcd_writedat_nbyte(uchar *dat,uchar len);
extern void clear_point(uchar x,uchar y);
extern void sel_point(uchar x,uchar y);
extern void clr_big(uchar x,uchar y);
extern void clr_lcd(void);
extern void draw_circle(int x, int y, int r);
extern void Draw_line(uchar x0,uchar y0,uchar x1,uchar y1);
#endif

#include "includes.h"
/**********************************
       讀取lcd狀態(tài)
**********************************/
uchar lcd_readcom()
{
  uchar temp;
  input();
  cd(1);
  //ce=0;
  rd(0);
  wr(1);
  temp=portint();
  rd(1);
  return temp;
}
/*********************************
   判斷指令/數(shù)據(jù)讀寫忙碌狀態(tài)
*********************************/
void check_busy()
{
uchar temp;
do{
   temp=lcd_readcom();
   }while((temp&0x03)!=0x03);
}
/*********************************
   判斷數(shù)據(jù)自動寫忙碌狀態(tài)
*********************************/
void check_auto_write_busy()
{
uchar temp;
do{
   temp=lcd_readcom();
   }while((temp&0x08)!=0x08);
}
/*********************************
       向lcd寫命令
*********************************/
void lcd_writecom(uchar dat)
{
output();
//check_busy();
cd(1);
//ce=0;
portout(dat);
wr(0);
rd(1);
wr(1);
}
/************************************
        向lcd寫數(shù)據(jù)
************************************/
void lcd_writedat(uchar dat)
{
output();
//check_busy();
cd(0);
//ce=0;
portout(dat);
wr(0);
rd(1);
wr(1);
}
/********************************
     從lcd讀數(shù)據(jù)
*********************************/
uchar lcd_readdat()
{
  uchar temp;
input();
  cd(0);
  wr(1);
  //ce=0;
   rd(0);
  temp=portint();
  rd(1);
  return temp;
}
/************************************************
  發(fā)出命令控制 參數(shù) onedat  twodat 命令com
*************************************************/
void lcd_writecom_two(uchar onedat,uchar twodat,uchar com)
{
lcd_writedat(onedat);
lcd_writedat(twodat);
lcd_writecom(com);
}
/****************************************
      一次讀/寫一個數(shù)據(jù)
****************************************/
void lcd_writedat_onebyte(uchar onedat,uchar com)
{
lcd_writedat(onedat);
lcd_writecom(com);
}
/*uchar lcd_readdat_onebyte(uchar com)
{
uchar dat;
lcd_writedat(com);
dat=lcd_readdat();
return dat;
}*/
/****************************************
       一次寫n個數(shù)據(jù)
****************************************/
void lcd_writedat_nbyte(uchar *dat,uchar len)
{
   
   lcd_writecom(0xb0);
  check_auto_write_busy();
   while(len)
   {
     lcd_writedat(*dat);
  dat++;
     len--;
   }
   lcd_writecom(0xb2);
}
/************************************************
清除一個點坐標(biāo) X,Y  左上角第一個點為0,0
************************************************/
void clear_point(uchar x,uchar y)
{
uint addr;
uchar temp1,temp2;
addr=y*30+(x>>3);//32+8
temp1=addr&0x00ff;
temp2=addr>>8;
lcd_writecom_two(temp1,temp2,0x24);
lcd_writecom(0xf7-(x&0x07));
}
/************************************************
點亮一個點 坐標(biāo) X,Y  左上角第一個點為0,0
************************************************/
void sel_point(uchar x,uchar y)
{
uint addr;
uchar temp1,temp2;
addr=y*30+(x>>3);//32+8
temp1=addr&0x00ff;
temp2=addr>>8;
lcd_writecom_two(temp1,temp2,0x24);
lcd_writecom(0xff-(x&0x07));
}
void clr_lcd(void)
{
unsigned int len ;
  len=30<<7;
lcd_writecom_two(0,0x00,0x24);
  lcd_writecom(0xb0);
  check_auto_write_busy();
   while(len)
   {
     lcd_writedat(0x00);
     len--;
   }
   lcd_writecom(0xb2);
}
/*sel_big(uchar x,uchar y)
{
  uint addr;
  uchar temp1,temp2,n;
addr=y*160+(x>>1);//x/8*4;
for(n=0;n<4;n++)
{
  temp1=addr%256;
  temp2=addr>>8;
  lcd_writecom_two(temp1,temp2,0x24);
  if(x%2)
  {

    lcd_writecom(0xfb);
  lcd_writecom(0xfa);
  lcd_writecom(0xf9);
  lcd_writecom(0xf8);
  }
  else
  {
  lcd_writecom(0xff);
  lcd_writecom(0xfe);
  lcd_writecom(0xfd);
  lcd_writecom(0xfc);
  
}
  addr+=40;
}
}*/
void sel_big(uchar x,uchar y)
{
  uint addr;
  uchar temp1,temp2,n;
addr=y*240+(x);//x/8*4;y*320=y*(256+64)=(y<<8)+(y<<6)
for(n=0;n<8;n++)
{
  temp1=addr&0x00ff;//addr%256
  temp2=addr>>8;
  lcd_writecom_two(temp1,temp2,0x24);

  lcd_writecom(0xfb);
  lcd_writecom(0xfa);
  lcd_writecom(0xf9);
  lcd_writecom(0xf8);
  lcd_writecom(0xff);
  lcd_writecom(0xfe);
  lcd_writecom(0xfd);
  lcd_writecom(0xfc);
  addr+=30;
}
}
void clr_big(uchar x,uchar y)
{
  uint addr;
  uchar temp1,temp2,n;
addr=y*240+(x);//x/8*4;y*320=y*(256+64)=(y<<8)+(y<<6)
for(n=0;n<8;n++)
{
  temp1=addr&0x00ff;//addr%256
  temp2=addr>>8;
  lcd_writecom_two(temp1,temp2,0x24);

  lcd_writecom(0xf3);
  lcd_writecom(0xf2);
  lcd_writecom(0xf1);
  lcd_writecom(0xf0);
  lcd_writecom(0xf7);
  lcd_writecom(0xf6);
  lcd_writecom(0xf5);
  lcd_writecom(0xf4);
  addr+=30;
}
}
void graph_mode_writeword(uchar x,uchar y,uchar *dat)
{
  uint addr;
  uint temp1;   //4
  uchar n;
  temp1=y;temp1=temp1*480;//512+128  640
  addr=temp1+2*x;
   for(n=0;n<16;n++)
  {
  
  lcd_writecom_two((addr&0x00ff),(addr>>8),0x24);
  lcd_writedat_onebyte(*dat,0xc0);
  dat++;
  lcd_writedat_onebyte(*dat,0xc4);
  dat++;
  addr=addr+30;
  }
}
void word_byte(uchar row ,uchar list, uchar *pdat)
{
uchar addr_h,addr_l,n;
uint p_addr;
for(n=0;n<16;n++)
{
p_addr=(list+n)*30+row;
addr_h=p_addr>>8;
addr_l=p_addr%256;
lcd_writecom_two(addr_l,addr_h,0x24);
lcd_writecom(0xb0);
  
  lcd_writedat(*(pdat+n));
lcd_writecom(0xb2);
}
}

void horizontal(uchar x0,uchar x1,uchar y)
{
uchar temp,n;
if(x0>x1)
{
  temp=x0;
  x0=x1;
  x1=temp;
}
n=x1-x0;
for(;n>0;n--)
{
  sel_point(x0+n,y);
}
}

void erect(uchar y0,uchar y1,uchar x)
{
  uchar temp,n;
if(y0>y1)
{
  temp=y0;
  y0=y1;
  y1=temp;
}
n=y1-y0;
for(;n>0;n--)
{
  sel_point(x,y0+n);
}
}



void Draw_line(uchar x0,uchar y0,uchar x1,uchar y1)
{
int dx,dy;                //定義X.Y軸上增加的變量值
int  sub;
int temp;                //起點、終點大小比較,交換數(shù)據(jù)時的中間變量
uchar flag;
if(x0>x1)                //X軸上,起點大于終點,交換數(shù)據(jù)
   {
   temp=x1;
   x1=x0;
   x0=temp;  
   temp=y1;
   y1=y0;
   y0=temp;   
   }

   
dx=x1-x0;                //X軸方向上的增量
dy=y1-y0;                //Y軸方向上的增量
   if(dx==0)               
   //Draw_shu(x0,y0,y1);
   erect(y0,y1,x0);
if(dy==0)                 
   //Draw_zhi(x0,x1,y0);
   horizontal(x0,x1,y0);


   if(dy>0)
    flag=1;
    else
    flag=0;

if((dx!=0)&&(dy!=0))
{
// 布蘭森漢姆(Bresenham)算法畫線 /
if(flag==1)
{
  if(dx>=dy)                  //靠近X軸
{
   sub=2*dy-dx;              //計算下個點的位置         
   while(x0!=x1)
   {
   sel_point(x0,y0);        //畫起點
     x0++;                  // X軸上加1
     if(sub>0)                // 判斷下下個點的位置
     {
       y0++;                  // 為右上相鄰點,即(x0+1,y0+1)
       sub+=2*dy-2*dx;
     }
     else         
       sub+=2*dy;            // 判斷下下個點的位置         
   }
   sel_point(x0,y0);
}
     
   else
   {
   sub=2*dy-dx;              //靠近Y軸        
   while(y0!=y1)
     {
   sel_point(x0,y0);        //畫起點
   y0++;                  
     if(sub>0)              //判斷下下個點的位置

     {
       x0++;               
       sub+=2*dx-2*dy;
     }
     else
       sub+=2*dx;
     }
    sel_point(x0,y0);
   }
}
else
{
   dy=y0-y1;
   if(dx>=dy)                  //靠近X軸
{
   sub=2*dy-dx;              //計算下個點的位置         
   while(x0!=x1)
   {
   sel_point(x0,y0);        //畫起點
     x0++;                  // X軸上加1
     if(sub>0)                // 判斷下下個點的位置
     {
       y0--;                  // 為右上相鄰點,即(x0+1,y0+1)
       sub+=2*dy-2*dx;
     }
     else         
       sub+=2*dy;            // 判斷下下個點的位置         
   }
   sel_point(x0,y0);
}
else
  {
    sub=2*dx-dy;              //靠近Y軸        
   while(y0!=y1)
     {
   sel_point(x0,y0);        //畫起點
     y0--;                  
     if(sub>0)              //判斷下下個點的位置
     {
       x0++;               
       sub+=2*dx-2*dy;
     }
     else
       sub+=2*dx;
     }
    sel_point(x0,y0);
  }
      
}
}   
}


void draw_circle(int x, int y, int r)
{
    int a, b, num;
    a = 0;
    b = r;
    while(2 * b * b >= r * r)          // 1/8圓即可
    {
        sel_point(x + a, y - b); // 0~1
        sel_point(x - a, y - b); // 0~7
        sel_point(x - a, y + b); // 4~5
        sel_point(x + a, y + b); // 4~3
        sel_point(x + b, y + a); // 2~3
        sel_point(x + b, y - a); // 2~1
        sel_point(x - b, y - a); // 6~7
        sel_point(x - b, y + a); // 6~5
        
        a++;
        num = (a * a + b * b) - r*r;
        if(num > 0)
        {
            b--;
            a--;
        }
    }
}

void lcd_init()
     {
     lcd_writecom_two(0x00,0x00,0x24);
        lcd_writecom_two(0x00,0x00,0x21);
        lcd_writecom_two(0x00,0x00,0x42);
        lcd_writecom_two(0x1e,0x00,0x43);
        lcd_writecom_two(0x00,0x10,0x40);
        lcd_writecom_two(0x1e,0x00,0x41);
        lcd_writecom(0xa0);
        lcd_writecom(0x9c);
        lcd_writecom(0x80);
     }







評分

參與人數(shù) 1黑幣 +2 收起 理由
huluguojian + 2 很給力!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区在线播放 | 亚洲国产成人av好男人在线观看 | 天天曰夜夜 | 欧美亚洲一级 | 久久99成人| 欧美一区二区免费 | 在线免费观看视频你懂的 | 日本a视频 | 夜夜爽99久久国产综合精品女不卡 | www.日日干 | 久久久91| 亚洲精品一区二区三区蜜桃久 | 精品九九九 | 国产麻豆乱码精品一区二区三区 | 成人在线精品视频 | 亚洲91精品 | 成人二区 | 国产精品免费观看 | 欧美精品一区三区 | 成人免费观看网站 | 91久久精品日日躁夜夜躁国产 | 久久久久网站 | 二区在线观看 | 欧美一级高清片 | 欧美激情视频一区二区三区免费 | 国产成人精品免费视频大全最热 | 亚洲精品电影在线观看 | av中文字幕网站 | 久久婷婷麻豆国产91天堂 | 日韩在线播放第一页 | 久久久久一区二区三区四区 | a级黄色片在线观看 | www.久久99 | 国产在线1区 | 成人性视频免费网站 | 国产7777| 欧美日韩在线电影 | 欧美中文在线 | 亚洲欧美国产视频 | 亚洲综合视频一区 | 成人在线免费视频观看 |