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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2323|回復: 1
打印 上一主題 下一主題
收起左側

求助工程大佬們 基于51單片機12864電子時鐘,不采用時鐘芯片

[復制鏈接]
跳轉到指定樓層
樓主
ID:432611 發表于 2018-11-25 19:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
求一個基于51單片機和12864設計的簡單電子時鐘,且不采用時鐘芯片的C51源程序和.hex可執行文件和proteus仿真,顯示時分秒即可,謝謝
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:442767 發表于 2018-12-9 18:14 | 只看該作者
#include<msp430f149.h>
#include "p_lcd12864.h"


/**************************************************
函數名稱:lcd_delay_n
功    能:大致延時 只要滿足正常顯示即可 根據實際調節
參    數:n
返回值  :無
**************************************************/
void lcd_delay_n(unsigned int n)
{
    unsigned int i;
    for(i=n;i>0;i--)  _NOP();
}



/**************************************************
函數名稱:my_abs
功    能:求絕對值   調用math。h中的abs總是有警告 于是自己寫
參    數:a
返回值  :無
**************************************************/
unsigned int my_abs(int a)
{
    if(a<0)
        a=-a;
    return a;
}



/**************************************************
函數名稱:write_cmd
功    能:向液晶中寫控制命令
參    數:cmd--控制命令
返回值  :無
**************************************************/
void write_cmd(unsigned char cmd)
{
    unsigned char lcdtemp = 0;
    LCD_RS_L;
    LCD_RW_H;
    LCD_DataIn;
    do
    {
        LCD_EN_H;
        _NOP();
        lcdtemp = LCD2MCU_Data;
        LCD_EN_L;
    }
    while(lcdtemp&0x80);
   
    LCD_DataOut;
    LCD_RS_L;
    LCD_RW_L;
    MCU2LCD_Data = cmd;
   
    LCD_EN_H;
    _NOP();
    LCD_EN_L;
}



/**************************************************
函數名稱:write_data
功    能:向液晶中寫數據
參    數:dat--顯示數據
返回值  :無
**************************************************/
void write_data(unsigned char dat)
{
    unsigned char lcdtemp;
    LCD_RS_L;
    LCD_RW_H;
    LCD_DataIn;
    do
    {
        LCD_EN_H;
        _NOP();
        lcdtemp = LCD2MCU_Data;
        LCD_EN_L;
    }
    while(lcdtemp&0x80);
   
    LCD_RS_H;
    LCD_RW_L;
    LCD_DataOut;
    MCU2LCD_Data = dat;
    LCD_EN_H;
    _NOP();
    LCD_EN_L;
}




/**************************************************
函數名稱:lcd_read_data
功    能:讀取12864中一個字節的數據
參    數:無
返回值  :顯示的數據
**************************************************/
unsigned char lcd_read_data(void)
{
    unsigned char Data_Temp;
    unsigned char lcdtemp;
    LCD_RS_L;
    LCD_RW_H;
    LCD_DataIn;
    do
    {
        LCD_EN_H;
        _NOP();
        lcdtemp = LCD2MCU_Data;
        LCD_EN_L;
    }
    while(lcdtemp&0x80);
   
    LCD_RS_H;
    LCD_RW_H;
    LCD_DataIn;
   
    LCD_EN_H;
    _NOP();
    Data_Temp = LCD2MCU_Data;
    LCD_EN_L;
   
    return Data_Temp;
}




/**************************************************
函數名稱:lcd_setxy
功    能:設置顯示位置   
參    數:X(1~16),Y(1~4)
返回值  :無
**************************************************/
void lcd_setxy(unsigned char x,unsigned char y)
{
    switch(y)
    {
        case 1:
        write_cmd(0x7F+x);break;
        case 2:
        write_cmd(0x8F+x);break;
        case 3:
        write_cmd(0x87+x);break;
        case 4:
        write_cmd(0x97+x);break;
        default:break;
    }
}




/**************************************************
函數名稱:display_line
功    能:在指定位置顯示字符串   
參    數:坐標x y 字符串str
返回值  :無
**************************************************/
void display_line(unsigned char x,unsigned char y,const char* str)
{
    unsigned char LCD_temp;
    lcd_setxy(x,y);
    LCD_temp=*str;
    while(LCD_temp != 0x00)
    {
        write_data(LCD_temp);
        LCD_temp=*(++str);
    }
}




/**************************************************
函數名稱:display_3digit
功    能:在指定位置開始顯示三位數字   
參    數:坐標x y 數字d
返回值  :無
**************************************************/
void display_3digit(unsigned char x,unsigned char y,unsigned int d)
{
    unsigned char a[3],i;
    a[0]=d/100;
    a[1]=(d%100)/10;
    a[2]=d%10;
    lcd_setxy(x,y);
    for(i=0;i<3;i++)
    {
        write_data(0x30+a[i]);
        //DelayUs2x(15);
        lcd_delay_n(1);
    }
}




/**************************************************
函數名稱:display_2digit
功    能:在指定位置開始顯示兩位數字   
參    數:坐標x y 數字d
返回值  :無
**************************************************/
void display_2digit(unsigned char x,unsigned char y,unsigned int d)
{
    unsigned char a[2],i;
    a[0]=d/10;
    a[1]=d%10;
    lcd_setxy(x,y);
    for(i=0;i<2;i++)
    {
        write_data(0x30+a[i]);
        //DelayUs2x(15);
        lcd_delay_n(1);
    }
}




/**************************************************
函數名稱:display_float
功    能:在指定位置開始顯示浮點數   
參    數:坐標x y 數字d
返回值  :無
**************************************************/
void display_float(unsigned char x,unsigned char y,float d)
{
    char a[15];           
    sprintf(a,"%.2f",d);  //修改.f中間的數字可改變保留幾位小數
    display_line(x,y,a);
   
}




/**************************************************
函數名稱:display_float
功    能:清除顯示   
參    數:無
返回值  :無
**************************************************/
void clr_screen(void)
{
    write_cmd(0x01);
    //delay_ms(15);
}




/**************************************************
函數名稱:display_page
功    能:顯示一頁字符   
參    數:字符數組s
返回值  :無

格式const  char   *Page1[]=
{
     {"**【>>菜單<<】**"},
     {"撥號  通訊   QQ "},
     {"信息  設置  相機"},
     {"娛樂  備忘   UC "}
     
};
**************************************************/
void display_page( const char **s)
{
    unsigned char  i;
    clr_screen();
    for(i=1;i<5;i++)
        display_line(1,i,s[i-1]);
   
}




/**************************************************
函數名稱:init12864
功    能:初始化液晶模塊
參    數:無
返回值  :無
**************************************************/
void init12864(void)
{
    LCD_DataOut;
    LCD_CMDOut;                  //液晶控制端口設置為輸出
   
    lcd_delay_n(50);
    write_cmd(0x30);            //基本指令集
    lcd_delay_n(50);
    write_cmd(0x30);            //選擇8bit數據流
    lcd_delay_n(50);
    write_cmd(0x02);            //地址歸位
    lcd_delay_n(50);
    write_cmd(0x0c);            //整體顯示打開,游標關閉
    lcd_delay_n(50);
    write_cmd(0x01);            //清除顯示
    lcd_delay_n(50);
    write_cmd(0x06);            //游標右移
    lcd_delay_n(50);
    write_cmd(0x80);            //設定顯示的起始地址
    lcd_delay_n(2000);
}





/**************************************************
函數名稱:Clear_GDRAM
功    能:清除液晶GDRAM中的隨機數據
參    數:無
返回值  :無
**************************************************/
void clear_GDRAM(void)
{
    unsigned char i,j,k;
   
    write_cmd(0x34);               //打開擴展指令集
    i = 0x80;            
    for(j = 0;j < 32;j++)
    {
        write_cmd(i++);
        write_cmd(0x80);
        for(k = 0;k < 16;k++)
        {
            write_data(0x00);
        }
    }
    i = 0x80;
    for(j = 0;j < 32;j++)
    {
        write_cmd(i++);
        write_cmd(0x88);           
        for(k = 0;k < 16;k++)
        {
            write_data(0x00);
        }
    }   
    write_cmd(0x30);                  //回到基本指令集
}




/*******************************************
函數名稱:draw_picture
功    能:在整個液晶屏幕上畫圖
參    數:圖片數組ptr
返回值  :無
格    式: 寬度x高度=128x64
unsigned char const logo[]={
    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,
    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,
    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,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x01,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x7F,0x80,0x00,0x00,
    0x00,0x03,0xFF,0xFF,0xFE,0x00,0x00,0x01,0xFF,0xE0,0x00,0x01,0xFF,0xE0,0x00,0x00,
    0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x07,0xFF,0xF0,0x00,0x07,0xFF,0xF0,0x00,0x00,
    0x00,0x0F,0xF9,0xFD,0xFF,0x00,0x00,0x0F,0xFF,0xF8,0x00,0x0F,0xFF,0xF8,0x00,0x00,
    0x00,0x0F,0xF0,0xF0,0xFF,0x80,0x00,0x1F,0xFF,0xFC,0x00,0x1F,0xFF,0xFC,0x00,0x00,
    0x00,0x1F,0xF0,0x70,0x7F,0x80,0x00,0x3F,0xFF,0xFC,0x00,0x3F,0xFF,0xFC,0x00,0x00,
    0x00,0x1F,0xE1,0x70,0x7F,0x80,0x00,0x7F,0xFF,0xFE,0x00,0x7F,0xFF,0xFE,0x00,0x00,
    0x00,0x3F,0xE1,0x66,0x7F,0xC0,0x00,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFE,0x00,0x00,
    0x00,0x3F,0xE3,0xE0,0x7F,0xC0,0x01,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFE,0x00,0x00,
    0x00,0x3F,0xE0,0x60,0x7F,0xE0,0x01,0xFF,0xEF,0xFF,0x01,0xFF,0xEF,0xFF,0x00,0x00,
    0x00,0x7F,0xF0,0xF0,0x7F,0xC0,0x03,0xFF,0x87,0xFF,0x03,0xFF,0x87,0xFF,0x00,0x00,
    0x00,0x3F,0xF0,0xF8,0xFF,0xE0,0x03,0xFF,0x83,0xFF,0x83,0xFF,0x81,0xFF,0x80,0x00,
    0x00,0x7F,0xFF,0xFF,0xFF,0xE0,0x07,0xFF,0x01,0xFF,0x07,0xFF,0x01,0xFF,0x00,0x00,
    0x00,0x7F,0xFF,0xFF,0xFF,0xF0,0x07,0xFF,0x00,0xFF,0x87,0xFF,0x00,0xFF,0x80,0x00,
    0x00,0x7F,0xE0,0x00,0xBF,0xF0,0x0F,0xFE,0x00,0xFF,0x8F,0xFE,0x00,0xFF,0x80,0x00,
    0x00,0xFF,0x80,0x00,0x0F,0xF0,0x0F,0xFE,0x00,0xFF,0x8F,0xFE,0x00,0xFF,0x80,0x00,
    0x00,0xFE,0x00,0x00,0x07,0xF0,0x1F,0xFC,0x00,0x7F,0x9F,0xFC,0x00,0x7F,0x80,0x00,
    0x00,0xFF,0xB0,0x00,0x5F,0xF0,0x0F,0xFC,0x00,0xFF,0x8F,0xFC,0x00,0x7F,0x80,0x00,
    0x01,0xFF,0xF8,0x01,0xFF,0xF0,0x1F,0xF8,0x3D,0xFF,0x9F,0xFC,0x3D,0xFF,0x80,0x00,
    0x01,0xFF,0xFF,0xDF,0xFF,0xF8,0x0F,0xFC,0x37,0x0F,0x8F,0xFC,0x37,0x9F,0x80,0x00,
    0x07,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xF8,0x66,0x07,0x1F,0xF8,0x26,0x0F,0x80,0x00,
    0x07,0xFF,0xFF,0xFF,0xFF,0xFC,0x0F,0xFC,0x6C,0x63,0x8F,0xFC,0x66,0x63,0x80,0x00,
    0x1F,0xC7,0xFF,0xFF,0xFC,0xFE,0x0F,0xFE,0xEC,0x80,0x8F,0xFE,0xED,0x80,0x80,0x00,
    0x1F,0xC3,0xFF,0xFF,0xF0,0x7E,0x07,0xFF,0xFC,0x00,0x07,0xFF,0xFE,0x80,0x00,0x00,
    0x3F,0xC7,0xFF,0xFF,0x80,0x7F,0x07,0xFF,0xFE,0x00,0x07,0xFF,0xFE,0x00,0x00,0x00,
    0x3F,0xC3,0xFD,0xFA,0x00,0x3F,0x01,0xFF,0xFF,0x00,0x21,0xFF,0xFF,0x00,0x20,0x00,
    0x3F,0x87,0xF0,0x00,0x00,0x3F,0x00,0xFF,0xFF,0x00,0x40,0xFF,0xFF,0x00,0x40,0x00,
    0x7F,0x83,0xF8,0x00,0x00,0x3F,0x00,0x1F,0xFF,0x80,0x40,0x1F,0xFF,0xC0,0xC0,0x00,
    0x7F,0x87,0xF0,0x00,0x00,0x3F,0x00,0x00,0x00,0xC1,0x80,0x00,0x00,0xE3,0x80,0x00,
    0x7F,0xC3,0xF8,0x00,0x00,0x3F,0x80,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,
    0x7B,0x83,0xF0,0x00,0x00,0x3F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,
    0x79,0xC1,0xF0,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x21,0xC0,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0xE0,0x00,0x00,0x00,0x40,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0xE0,0x00,0x00,0x00,0xC0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x30,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x38,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x9C,0x00,0x00,0x06,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x01,0x07,0x00,0x00,0x0C,0x60,0x07,0xF8,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x70,
    0x01,0x81,0xC0,0x00,0x38,0x10,0x03,0x30,0x00,0x00,0x00,0x03,0x60,0x00,0x00,0x30,
    0x01,0x00,0xF8,0x00,0xE0,0x10,0x03,0x30,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x30,
    0x01,0x00,0x03,0xAD,0x00,0x10,0x01,0xE1,0xE3,0xF7,0xF8,0x06,0x01,0xE1,0xE1,0xF0,
    0x00,0xA0,0x0B,0x0E,0xA2,0xA0,0x01,0xE3,0x31,0xC3,0x30,0x06,0x03,0x33,0x33,0x30,
    0x00,0x00,0x54,0x00,0x00,0x00,0x01,0xE3,0xF1,0x81,0xE0,0x06,0xF3,0x33,0x33,0x30,
    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xE3,0x01,0x81,0xE0,0x06,0x63,0x33,0x33,0x30,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0x31,0x80,0xC0,0x03,0x63,0x33,0x33,0x30,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0xE3,0xE0,0xC0,0x01,0xC1,0xE1,0xE1,0xF8,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,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,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,0x00,0x00,0x00,0x00,0x00,
};
********************************************/
void draw_picture(const unsigned char *ptr)
{
    unsigned char i,j,k;
   
    clr_screen();
   
    write_cmd(0x34);        //打開擴展指令集
    i = 0x80;            
    for(j = 0;j < 32;j++)
    {
        write_cmd(i++);
        write_cmd(0x80);
        for(k = 0;k < 16;k++)
        {
            write_data(*ptr++);
        }
    }
    i = 0x80;
    for(j = 0;j < 32;j++)
    {
        write_cmd(i++);
        write_cmd(0x88);           
        for(k = 0;k < 16;k++)
        {
            write_data(*ptr++);
        }
    }  
    write_cmd(0x36);        //打開繪圖顯示
    write_cmd(0x30);        //回到基本指令集
}




/**************************************************
函數名稱:set_white
功    能:任意位置反白   
參    數:行數y 起始x 結束end_x  模式clear 0反白 1復原
返回值  :無
**************************************************/
void set_white(unsigned char y,unsigned char x,unsigned char end_x,unsigned char clear)
{
    unsigned char i, j, white_x, white_y,white_end_x,clr_x,clr_y;                //
    white_end_x = (end_x-x+1);
    white_end_x <<= 1;
    write_cmd(0x36);                   //打開繪圖模式
    if(y==1)
    {
        white_x = (0x80+x-1);
        white_y = 0x80;
        clr_x = 0x80;
        clr_y = 0x80;
    }
    else if(y==2)
    {
        white_x = (0x80+x-1);
        white_y = 0x90;
        clr_x = 0x80;
        clr_y = 0x90;
    }
    else if(y==3)
    {
        white_x = (0x88+x-1);
        white_y = 0x80;
        clr_x = 0x88;
        clr_y = 0x80;
    }
    else if(y==4)
    {
        white_x = (0x88+x-1);
        white_y = 0x90;
        clr_x = 0x88;
        clr_y = 0x90;
    }
    if(clear==0)                     //要反白時,先將整行的液晶全部清成不反白(此處行指y)
    {
        for(i=0;i<16;i++ )                //16行
        {
            write_cmd(clr_y++);                 //設置繪圖區的Y地址坐標0
            write_cmd(clr_x);                 //設置繪圖區的X地址坐標0
            for(j=0;j<16;j++)                 //
            {
                write_data(0x00);         //清成不反白
                //nop();
            }
        }
    }
    //nop();
    for(i=0;i<16;i++ )                        //16行,因為是16*16漢字
    {
        write_cmd(white_y++);                //設置繪圖區的Y地址坐標0
        write_cmd(white_x);                //設置繪圖區的X地址坐標0
        for(j=0;j<white_end_x;j++)        //
        {
            if(clear==1)
            {
                write_data(0x00);       //取消這一行的8個點的反白,液晶地址自動加1
                //(此處行指一個一個液晶點所組成的行)
            }
            else
            {
                write_data(0xff);       //反白這一行的8個點,液晶地址自動加1
                //(此處行指一個一個液晶點所組成的行)
            }
            // nop();
        }
    }
    write_cmd(0x30);                   //回到基本模式
}




/**************************************************
函數名稱:draw_dot
功    能:任意位置打點   
參    數:坐標xy  color 0反白 1復原
返回值  :無
**************************************************/
void draw_dot(unsigned char x,unsigned char y,unsigned char color)
{
    unsigned char  row,tier,tier_bit;
    unsigned char  read_old_h,read_old_l;
    write_cmd(0x34);
    write_cmd(0x36);
    tier=x>>4;
    tier_bit=x&0x0f;
    if(y<32)
        row=y;
    else
    {
        row=y-32;
        tier+=8;
    }
    write_cmd(row+0x80);
    write_cmd(tier+0x80);
    lcd_read_data();
    read_old_h=lcd_read_data();
    read_old_l=lcd_read_data();
    write_cmd(row+0x80);
    write_cmd(tier+0x80);
   
    if(tier_bit<8)
    {
        switch(color)
        {
            case 0:read_old_h&=(~(0x01<<(7-tier_bit)));break;
            case 1:read_old_h|=(0x01<<(7-tier_bit))   ;break;
            case 2:read_old_h^=(0x01<<(7-tier_bit))   ;break;
            default:break;
        }
        write_data(read_old_h);
        write_data(read_old_l);
        
    }
    else
    {
        switch(color)
        {
            case 0:read_old_l&=(~(0x01<<(15-tier_bit)));break;
            case 1:read_old_l|=(0x01<<(15-tier_bit))   ;break;
            case 2:read_old_l^=(0x01<<(15-tier_bit))   ;break;
            default:break;
        }
        
        write_data(read_old_h);
        write_data(read_old_l);
    }
   
    write_cmd(0x30);
   
}




/**************************************************
函數名稱:draw_level_line
功    能:水平線   
參    數:起始x0 x1 和y坐標  color 0反白 1復原
返回值  :無
**************************************************/
void draw_level_line(unsigned char x0,unsigned char x1,unsigned char y,unsigned char color)
{
    unsigned char temp;
    if(x0>x1)
    {
        temp=x1;
        x1=x0;
        x0=temp;
    }
    for(;x0<=x1;x0++)
    {
        draw_dot(x0,y,color);
    }
   
}



/**************************************************
函數名稱:draw_vertical_line
功    能:垂直線   
參    數:起始y0 y1 和x坐標  color 0 1
返回值  :無
**************************************************/
void draw_vertical_line(unsigned char y0,unsigned char y1,unsigned char x,unsigned char color)
{
    unsigned char temp;
    if(y0>y1)
    {
        temp=y1;
        y1=y0;
        y0=temp;
    }
    for(;y0<=y1;y0++)
        draw_dot(x,y0,color);
}




/**************************************************
函數名稱:draw_line
功    能:畫任意直線   
參    數:startx starty endx endy    color
返回值  :無
**************************************************/
void draw_line(unsigned char startx,unsigned char starty
               ,unsigned char endx,unsigned char endy,unsigned char color)
{
    int t,distance;
    int x=0,y=0,delta_x,delta_y;
    int incx,incy;
    delta_x=endx-startx;
    delta_y=endy-starty;
   
    if(delta_x>0)
    {
        incx=1;
    }
    else if(delta_x==0)
    {
        draw_vertical_line(startx,starty,endy,color);
        return;
    }
    else
    {
        incx= -1;
    }
    if(delta_y>0)
    {
        incy=1;
    }
    else if(delta_y==0)
    {
        draw_level_line(startx,endx,starty,color);
        return;
    }
    else
    {
        incy=-1;
    }
    delta_x=my_abs(delta_x);
    delta_y=my_abs(delta_y);
    if(delta_x>delta_y)
    {
        distance=delta_x;
    }
    else
    {
        distance=delta_y;
    }
    draw_dot(startx,starty,color);
    for(t=0;t<=distance+1;t++)
    {
        draw_dot(startx,starty,color);
        x+=delta_x;
        y+=delta_y;
        if(x>distance)
        {
            x-=distance;
            startx+=incx;
        }
        if(y>distance)
        {
            y-=distance;
            starty+=incy;
        }
        
    }
   
}




/**************************************************
函數名稱:contin_line
功    能:連續輸入Y 連成線,Y為0-63注意輸入進來時做轉換  線從startx至endx 0-127為最大范圍   
參    數:startx  endx endy    color
返回值  :無
**************************************************/
void contin_line(unsigned char startx ,unsigned char endx ,unsigned char Y)
{
     static unsigned char i=0,y0=0,y1=0,f=1; //i連線開始坐標
     if(f)                                     //用于將startx只在第一次傳遞給i
     {
          f=0;
        i = startx;
     }
    // x0=i;
     y1=Y;                              //畫該函數的圖形,完全連接了,
     if(i!=startx)                      //保證不與00坐標連到一起
          draw_line(i-1,y0,i,y1,1);
     //x1=x0;
     y0=y1;
      
     if(i++>=endx)  //連線結束坐標
     {
         
          i=startx;
          clear_GDRAM();
     }
}




/**************************************************
函數名稱:draw_curve
功    能:將一系列無符號字符數組str的數 大小0-63注意傳遞前做處理,曲線開始位置 xstart 數組大小size   
參    數:起點startx    size  *str
返回值  :無
**************************************************/
void draw_curve(unsigned char xstart, unsigned char size ,unsigned char *str)
{
    static unsigned char i=0,endx=0,y0=0,y1=0,f=1;
    if(f) //只傳遞一次
    {
        f=0;
        i = xstart;
    }
   
    endx = xstart + size;
    if(endx>=128)  //保證圖形不溢出
        endx =127;
    for(;i<endx;i++)
    {
        y1 = str[i-xstart];
        if(i!=xstart)
            draw_line(i-1,y0,i,y1,1);
        y0 = y1;
    }
    i = xstart;  
    //Clear_GDRAM();
   
}





/**************************************************
函數名稱:draw_circle
功    能:畫任意圓   
參    數:圓心坐標xy 半徑r    color
返回值  :無
**************************************************/
void draw_circle(unsigned char x,unsigned char y,unsigned char r,unsigned char color)
{
    unsigned char a,b;
    float c;
    a = 0;
    b = r;
    //  c = 1.25 - r;
    c = 3 - 2*r;
    while(a < b)
    {
        draw_dot(x+a,y+b,color);
        draw_dot(x-a,y+b,color);
        draw_dot(x+a,y-b,color);
        draw_dot(x-a,y-b,color);
        
        draw_dot(x+b,y+a,color);
        draw_dot(x-b,y+a,color);
        draw_dot(x+b,y-a,color);
        draw_dot(x-b,y-a,color);
        
        if(c < 0)
        {
            c = c+4*a + 6;
        }
        else
        {
            c= c + 4*(a - b) + 10;
            b-=1;
        }
        a = a + 1;  //控制打點間隔
        
    }
    if(a == b)
    {
        draw_dot(x+a,y+b,color);
        draw_dot(x-a,y+b,color);
        draw_dot(x+a,y-b,color);
        draw_dot(x-a,y+b,color);
        
        draw_dot(x+b,y+a,color);
        draw_dot(x-b,y+a,color);
        draw_dot(x+b,y-a,color);
        draw_dot(x-b,y-a,color);
        
    }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日在线 | 亚洲天堂色 | 欧美成人综合 | 99视频久 | 国产精品免费一区二区三区 | 毛片一区二区三区 | 成人在线不卡 | 最新国产精品视频 | 麻豆视频在线免费观看 | 久久久av | 亚洲国产精品久久久 | 欧美在线色 | 国产精品区一区二 | 超碰av免费 | 欧美群妇大交群中文字幕 | 中文字幕一区在线 | 欧美中文字幕一区二区三区亚洲 | 天堂男人av | 亚洲精品一区二区三区中文字幕 | 看羞羞视频免费 | 日韩在线小视频 | 亚洲欧洲成人av每日更新 | 91精品国产91久久综合桃花 | 午夜精品一区二区三区在线播放 | 99久久久久久99国产精品免 | 精品国产乱码久久久久久闺蜜 | 亚洲国产精品第一区二区 | 一区二区三区国产 | 久久亚洲欧美日韩精品专区 | 亚洲免费在线观看av | 一级做a爰片久久毛片免费看 | 国产小网站 | 涩涩视频网站在线观看 | www操操 | 成人在线免费网站 | 久久成人综合 | 亚洲一区综合 | 日韩一区在线播放 | 麻豆久久久久久久久久 | 777zyz色资源站在线观看 | www.久|