?? jhdavr.c
字號:
#include<avr/io.h>
//#include <intrins.h>
//-----------------管腳定義-----------------
/*
#ifndef AVR
#define LCD12864_IO P0 //數據端口
sbit LCD12864_RST=P2^0; //復位端口
sbit LCD12864_EN=P2^1; //使能端口
sbit LCD12864_RW=P2^2; //讀寫選擇斷口
sbit LCD12864_DIN=P2^3; //數據指令選擇端口
#define clr_LCD12864_RST LCD12864_RST=0;
#define set_LCD12864_RST LCD12864_RST=1;
#define clr_LCD12864_EN LCD12864_EN=0;
#define set_LCD12864_EN LCD12864_EN=1;
#define clr_LCD12864_RW LCD12864_RW=0;
#define set_LCD12864_RW LCD12864_RW=1;
#define clr_LCD12864_DIN LCD12864_DIN=0;
#define set_LCD12864_DIN LCD12864_DIN=1;
*/
#define LCD12864_IO PORTA
#define LCD12864_PIN PINA
#define LCD12864_IODDR DDRA
#define LCD12864_Ctrl PORTC
#define LCD12864_RST PC0
#define LCD12864_EN PC1
#define LCD12864_RW PC2
#define LCD12864_DIN PC3
#define clr_LCD12864_RST LCD12864_Ctrl &= ~_BV(LCD12864_RST);
#define set_LCD12864_RST LCD12864_Ctrl |= _BV(LCD12864_RST);
#define clr_LCD12864_EN LCD12864_Ctrl &= ~_BV(LCD12864_EN);
#define set_LCD12864_EN LCD12864_Ctrl |= _BV(LCD12864_EN);
#define clr_LCD12864_RW LCD12864_Ctrl &= ~_BV(LCD12864_RW);
#define set_LCD12864_RW LCD12864_Ctrl |= _BV(LCD12864_RW);
#define clr_LCD12864_DIN LCD12864_Ctrl &= ~_BV(LCD12864_DIN);
#define set_LCD12864_DIN LCD12864_Ctrl |= _BV(LCD12864_DIN);
//-----------------函數聲明------------------
void MPU_Init(void);
void MPU_Inter_Init(void);
void LCD12864_Init(void);
void LCD12864_Busy(void);
void LCD12864_Command(unsigned char Comm);
void LCD12864_Data(unsigned char Data);
void Delay(unsigned char N);
void delayus(unsigned char n);
void LCD12864_Address(unsigned char line,unsigned char row);
void LCD12864_String(unsigned char row,unsigned char line,unsigned char *s);
void LCD12864_Point(unsigned char Line,unsigned char Row);
void LCD12864_Read(void);
void LCD12864_GDRAM_Clear(void);
void LCD12864_Point(unsigned char Line,unsigned char Row);
void LCD12864_Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2);
void LCD12864_Circle(unsigned char x0,unsigned char y0,unsigned char r);
void Time0_inter();
void LCD12864_Ware_FangBo(unsigned char Y1,unsigned char Y2,unsigned char L1); //矩形波
void LCD12864_Ware_YuXian(unsigned char Y1,unsigned char Y2,unsigned char L1); //余弦波
//----------------全局變量-------------------
unsigned char LCD12864_GDRAM_DATA[2]={0x00,0x00};
unsigned char Num=0,List=0;
//-------------------------------------------
// 名字: 主函數
// 功能:調用子函數
// 參數:無
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void main(void)
{
MPU_Init();
while(1)
{
//LCD12864_Circle(32,32,32);
// LCD12864_Circle(48,32,32);
// LCD12864_Circle(63,32,32);
// LCD12864_Circle(79,32,32);
// LCD12864_Circle(96,32,32);
//LCD12864_Ware_FangBo(5,26,3);
//LCD12864_Ware_FangBo(30,56,30);
//LCD12864_Point(10,10);
LCD12864_String(1,1,"豐功偉績");
Delay(10);
// LCD12864_GDRAM_Clear();
//LCD12864_Command(0x01);
}
}
//-------------------------------------------
// 名字: MPU初始化
// 功能:初始化MPU
// 參數:無
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void MPU_Init(void)
{
LCD12864_Init();
//LCD12864_GDRAM_Clear();
//MPU_Inter_Init();
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
}
//-------------------------------------------
// 名字: LCD12864初始化
// 功能:初始化LCD12864
// 參數:無
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Init(void)
{
LCD12864_Command(0x01); // 清 DDRAM
LCD12864_Command(0x30); // 8 bits 數據模式
LCD12864_Command(0x02); // 指針復位
LCD12864_Command(0x0c); // 顯示開
LCD12864_Command(0x03);
LCD12864_Command(0x06);
LCD12864_Command(0x01); // 清 DDRAM
}
//-------------------------------------------
// 名字: 清GDRAM
// 功能: 清GDRAM(行 0-64,列 0-127)
// 參數:void
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_GDRAM_Clear(void)
{
unsigned char X = 0x80,Y = 0x80;
unsigned char i,j;
for(i=0;i<64;i++)
{
for(j=0;j<16;j++)
{
LCD12864_Command(0x34);
LCD12864_Command(Y);
LCD12864_Command(X);
LCD12864_Data(0x00); // low 8 bits
LCD12864_Data(0x00); // high 8 bits
LCD12864_Command(0x36);
X++;
j++;
}
Y++;
if(Y>0x9f)
Y=0x80;
X=0x80+((i+1)/32)*8;
}
LCD12864_Command(0x30);
}
//-------------------------------------------
// 名字: 矩形波
// 功能:矩形波
// 參數:unsigned char Y1,unsigned char Y2,unsigned char L1
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Ware_FangBo(unsigned char Y1,unsigned char Y2,unsigned char L1)
{ /*
LCD12864_Line(0,Y1,L1,Y1);
LCD12864_Line(L1,Y1,L1,Y2);
LCD12864_Line(L1,Y2,2*L1,Y2);
LCD12864_Line(2*L1,Y2,2*L1,Y1);
LCD12864_Line(2*L1,Y1,3*L1,Y1);
LCD12864_Line(3*L1,Y1,3*L1,Y2);
LCD12864_Line(3*L1,Y2,4*L1,Y2);
LCD12864_Line(4*L1,Y2,4*L1,Y1);
LCD12864_Line(4*L1,Y1,5*L1,Y1);
LCD12864_Line(5*L1,Y1,5*L1,Y2);
LCD12864_Line(5*L1,Y2,6*L1,Y2);
LCD12864_Line(6*L1,Y2,6*L1,Y1);
LCD12864_Line(6*L1,Y1,7*L1,Y1);
LCD12864_Line(7*L1,Y1,7*L1,Y2);
LCD12864_Line(7*L1,Y2,8*L1,Y2); */
unsigned char A,B,C,D,N;
N=128/L1;
A=0;
B=Y1;
C=L1;
D=Y1;
LCD12864_Line(A,B,C,D);
for(;N>0;N--)
{ A=C;
B=D;
if(D==Y1)
D=Y2;
else
D=Y1;
LCD12864_Line(A,B,C,D);
A=C;
B=D;
C=C+L1;
LCD12864_Line(A,B,C,D);
}
}
//-------------------------------------------
// 名字: 畫圓
// 功能:畫圓
// 參數:unsigned char x0,unsigned char y0,unsigned char r
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Circle(unsigned char x0,unsigned char y0,unsigned char r)
{
unsigned char x,y;
unsigned int xx,rr,xt,yt,rs;
yt=r;
rr=r*r+1; //補償 1 修正方形
rs=yt*3/4; //畫8分之一圓弧
for (xt=0;xt<=rs;xt++)
{
xx=xt*xt;
while ((yt*yt)>(rr-xx))
yt--;
x=x0+xt; //第一象限
y=y0-yt;
LCD12864_Point(x,y);
x=x0-xt; //第二象限
LCD12864_Point(x,y);
y=y0+yt; //第三象限
LCD12864_Point(x,y);
x=x0+xt; //第四象限
LCD12864_Point(x,y);
//----45度鏡象畫另外8分之一圓弧--------
x=x0+yt; //第一象限
y=y0-xt;
LCD12864_Point(x,y);
x=x0-yt; //第二象限
LCD12864_Point(x,y);
y=y0+xt; //第三象限
LCD12864_Point(x,y);
x=x0+yt; //第四象限
LCD12864_Point(x,y);
}
}
//-------------------------------------------
// 名字: 畫線
// 功能:畫線 (行 0-64,列 0-127)
// 參數:unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
{
unsigned char t;
signed int xerr=0,yerr=0;
signed int delta_x,delta_y,distance;
signed char incx,incy;
//--------------計算兩個方向的長度--------------
delta_x=x2-x1;
delta_y=y2-y1;
//---計算增量的方向,增量為"0"表示為垂直或水平線
if(delta_x>0)
incx=1;
else
{
if( delta_x==0 )
incx=0;
else
{
incx=-1;
delta_x =-delta_x;
}
}
if(delta_y>0)
incy=1;
else
{
if( delta_y==0 )
incy=0;
else
{
incy=-1;
delta_y =-delta_y;
}
}
//-----------確定畫線的范圍-----------------
if( delta_x > delta_y ) distance=delta_x;
else distance=delta_y;
//--------------畫線-----------------------
for(t=0;t<=distance+1;t++)
{
LCD12864_Point(x1,y1);
xerr+=delta_x;
yerr+=delta_y;
/**/
if(xerr>distance )
{
xerr-=distance;
x1+=incx;
}
if(yerr>distance )
{
yerr-=distance;
y1+=incy;
}
}
}
//-------------------------------------------
// 名字: 寫點
// 功能:在任何位置上寫點 (行 0-64,列 0-127)
// 參數:unsigned char Line,unsigned char Row (列,行)
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Point(unsigned char Line,unsigned char Row)
{
unsigned char X=0x80,Y=0x80,Low=0x00,High=0x00,X1;
//-------應該先判斷在那個字節------------
if(Row>31) //將其定位于下半區
{
X=X+0x08;
Y=Y+Row-32;
}
else //將其定位于上半區
{
Y=Y+Row;
}
switch(Line/16)
{
case 0:{X=X+0x00;}; break;
case 1:{X=X+0x01;}; break;
case 2:{X=X+0x02;}; break;
case 3:{X=X+0x03;}; break;
case 4:{X=X+0x04;}; break;
case 5:{X=X+0x05;}; break;
case 6:{X=X+0x06;}; break;
case 7:{X=X+0x07;}; break;
default:break;
}
//---------讀數據和數據處理-------------
LCD12864_Command(0x34);//設置為擴張指令集
LCD12864_Command(Y); //寫行
LCD12864_Command(X); //寫列
LCD12864_Read();
X1=Line-(Line/16)*16;
if(X1>7)
{
X1=X1-8;
High=LCD12864_GDRAM_DATA[1]|(0x01<<(7-X1));
Low=LCD12864_GDRAM_DATA[0];
}
else
{
High=LCD12864_GDRAM_DATA[1];
Low=LCD12864_GDRAM_DATA[0]|(0x01<<(7-X1));
}
//-------------寫數據--------------------
LCD12864_Command(0x34);//設置為擴張指令集
LCD12864_Command(Y); //寫行
LCD12864_Command(X); //寫列
LCD12864_Data(Low); // low 8 bits
LCD12864_Data(High); // high 8 bits
LCD12864_Command(0x36);
LCD12864_Command(0x30);
}
//-------------------------------------------
// 名字: 在指定位置顯示字符串
// 功能:在指定位置顯示字符串
// 參數:unsigned char row,unsigned char line,unsigned char *s
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_String(unsigned char row,unsigned char line,unsigned char *s)
{
unsigned char LCD12864_temp;
LCD12864_Address(row,line);
LCD12864_temp=*s;
while(LCD12864_temp != 0x00)
{
LCD12864_Data(LCD12864_temp);
LCD12864_temp=*(++s);
}
}
//-------------------------------------------
// 名字: 設置顯示位置
// 功能:設置顯示位置 X(1~8),Y(1~4)
// 參數:unsigned char line,unsigned char row
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Address(unsigned char line,unsigned char row)
{
switch(row)
{
case 1:LCD12864_Command(0x7f + line);
break;
case 2:LCD12864_Command(0x8f + line);
break;
case 3:LCD12864_Command(0x87 + line);
break;
case 4:LCD12864_Command(0x97 + line);
default:
break;
}
}
//-------------------------------------------
// 名字:LCD12864_busy()
// 功能:讀忙標志
// 參數:無
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Busy(void)
{
unsigned char BF = 0; //標志位清0
clr_LCD12864_EN; //使能端清0
clr_LCD12864_DIN; //設為指令方式
set_LCD12864_RW; //設為讀方式
LCD12864_IODDR=0x00;
LCD12864_IO=0xff; //單片機讀數據之前必須先置高位
do
{
set_LCD12864_EN;
BF=LCD12864_PIN & 0x80;
delayus(10);
clr_LCD12864_EN;
} while(BF);
LCD12864_IODDR=0xff;
}
//-------------------------------------------
// 寫命令
// 功能:寫命令
// 參數:unsigned char Comm
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Command(unsigned char Comm)
{
LCD12864_Busy();
clr_LCD12864_EN;
clr_LCD12864_DIN;
clr_LCD12864_RW;
delayus(10);
set_LCD12864_EN;
LCD12864_IO=Comm;
delayus(10);
clr_LCD12864_EN;
}
//-------------------------------------------
// 讀一個字節數據
// 功能:讀一個字節數據
// 參數:void
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Read(void)
{
int i;
LCD12864_Busy();
LCD12864_Command(0x30); //先將其設為基本模式
LCD12864_IO=0xFF;
set_LCD12864_DIN;
set_LCD12864_RW;
set_LCD12864_EN;
for(i=5;i>0;i--);
LCD12864_GDRAM_DATA[0]=LCD12864_IO; //虛讀
clr_LCD12864_EN;
LCD12864_Busy();
LCD12864_IO=0xFF;
set_LCD12864_DIN;
set_LCD12864_RW;
set_LCD12864_EN;
for(i=5;i>0;i--);
LCD12864_GDRAM_DATA[0]=LCD12864_IO; //真讀高8bit
clr_LCD12864_EN;
LCD12864_Busy();
LCD12864_IO=0xFF;
set_LCD12864_DIN;
set_LCD12864_RW;
set_LCD12864_EN;
for(i=5;i>0;i--);
LCD12864_GDRAM_DATA[1]=LCD12864_IO; //真讀低8bit
clr_LCD12864_EN;
}
//-------------------------------------------
// 寫一個字節數據
// 功能:寫一個字節數據
// 參數:unsigned char Data
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void LCD12864_Data(unsigned char Data)
{
LCD12864_Busy();
clr_LCD12864_EN;
set_LCD12864_DIN;
clr_LCD12864_RW;
delayus(10);
set_LCD12864_EN;
LCD12864_IO=Data;
delayus(10);
clr_LCD12864_EN;
}
//-------------------------------------------
// 延時函數
// 功能:延時
// 參數:unsigned char N
// 設計:羅杰 時間:2007-07-26
//-------------------------------------------
void Delay(unsigned char N)
{
unsigned char i;
unsigned int j;
for(;N>0;i--)
for(i=0;i<200;i++)
for(j=1000;j>0;j--);
}
void delayus(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -