新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Atmega16單片機實用程序

Atmega16單片機實用程序

作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
/****************************************************************
名稱:設(shè)置顯示列地址
功能:設(shè)置顯示列地址y,範(fàn)圍0~63;
*****************************************************************/
void LCD_Command_set_y(uchar column)
{
RW_WRITE;
RS_COMM;
EN_CLR;
SET_DATA(0x40+column); //設(shè)置顯示列地址y,範(fàn)圍0~63;
EN_SET;
delayus(2);
EN_CLR;
}
/********************************************************************
名稱:LCD顯示數(shù)據(jù)寫入
功能:將顯示數(shù)據(jù)寫入12864液晶
*********************************************************************/
void LCD_Command_writebyte(uchar data)
{
RW_WRITE;
RS_DATA;
EN_CLR;
SET_DATA(data);
EN_SET;
delayus(2);
EN_CLR;
}
/*********************************************************************
名稱:LCD複位操作
功能:複位LCD
**********************************************************************/
void LCD_RESET()
{
RESET;
NOP();
NOP();
NOP();
RESET_OVER;
}
/************************************************************
名稱:清除指定範(fàn)圍函數(shù)
功能:清除LCD屏幕指定範(fàn)圍起始行~結(jié)束行的顯示內(nèi)容
************************************************************/
void LCD_CLEAR_LINE(uchar startline,uchar endline)
{
uchar i,j;
for(i-startline;i<=endline;i++)
{
CS1_EN;
CS2_EN;
LCD_Command_set_x(i);
LCD_Command_set_y(0); //y地址每次操作後自動加1;
for(j=0;j<64;j++)
{
LCD_Command_writebyte(0x00);
}
}
}
/*************************************************************
名稱:顯示初始化
功能:初始化LCD
*************************************************************/
void LCD_init()
{
LCD_RESET();
LCD_CLEAR_LINE(0,7);
NOP();
LCD_Command_Displayonoff(1);
NOP();
LCD_Command_setstartline(0);
}
/**************************************************************
名稱:LCD_WRITE_DATA
輸入:x in [0,7] and y in [0,127]
輸出:無
功能:在LCD指定行列寫一個數(shù)據(jù)
**************************************************************/
void LCD_write_data(uchar x,uchar y,uchar data)
{
if(y<64)
{
CS1_EN;
CS2_DIS;
LCD_Command_set_x(x);
LCD_Command_set_y(y);
}
else
{
CS1_DIS;
CS2_EN;
LCD_Command_set_x(x);
LCD_Command_set_y(y-64);
}
LCD_Command_writebyte(data);
delayus(1);
}
/*********************************************************
名稱:LCD_WRITE_DOT
輸入:x in [0,63] and y in [0,127]
輸出:無
功能:在指定像素位置描點,此函數(shù)為覆蓋式描點,原位置一個
字節(jié)數(shù)據(jù)被覆蓋
*********************************************************/
void LCD_write_dot(uchar x,uchar y)
{
uchar x_address,y_address;
uchar data=0;
if((x<64)&&(y<128))
{
x_address=x>>3;
y_address=y;
LCD_write_data(x_address,y_address,data|(1<<(x%8)));
}
}
/**********************************************************
名稱:LCD_WRITE_CHAR
輸入:x in [0,3],y in [0,15], disp-顯示字符自模數(shù)組首地址
輸出:無
功能:在LCD指定顯示單元顯示一個字符,每個顯示單元默認(rèn)為8*16
點陣字體,對12864點陣LCD,x最多顯示4行,y最多顯示16個字
符。
***********************************************************/
void LCD_write_char(uchar x,uchar y,const uchar *disp)
{
uchar i;
uchar x_address;
uchar y_address;
if((x<4)&&(y<16))
{
for(i=0;i<8;i++)
{
x_address=x<<1;
y_address=(y<<3)+i;
LCD_write_data(x_address,y_address,*disp++);
}
for(i=0;i<8;i++)
{
x_address=(x<<1)+1;
y_address=(y<<3)+i;
LCD_write_data(x_address,y_address,*disp++);
}
}
}
/***********************************************************
名稱:LCD_write_word
輸入:x in [1,3],y in [1,14] disp-顯示字符字模組首地址
輸出:無
功能:在LCD指定顯示單元顯示一個中文字符,每個顯示單元默認(rèn)為
16*16點陣字體,對128*64點陣LCD,x最多顯示4行,y最多顯
示16個字符,不允許顯示半個漢字
***********************************************************/
void LCD_write_word(int x,int y,const uchar *disp)
{
int i;
int x_address;
int y_address;
if((x<4)&&(y<15))
{
for(i=0;i<16;i++)
{
x_address=x<<1;
y_address=(y<<3)+i;
LCD_write_data(x_address,y_address,*disp++);
}
}
for(i=0;i<16;i++)
{
x_address=(x<<1)+1;
y_address=(y<<3)+i;
LCD_write_data(x_address,y_address,*disp++);
}
}
/************************************************************
名稱:LCD_write_picture
輸入:x in [1,7] and y in [0,127],x1_length-縱向像素(8的整數(shù)倍),
y1_length-橫向像素(不一定為8的整數(shù)倍)
輸出:無
功能:在指定區(qū)域顯示指定像素大小的圖片
************************************************************/
void LCD_write_picture(int x1,int y1,int x_length,int y_length,const int *pdata)
{
int x_address;
int y_address;
for(x_address=x1;x_address<=x1+(x_length>>3)-1;x_address++)
{
for(y_address=y1;y_address {
LCD_write_data(x_address,y_address,*pdata);
}
}
}
/**********************************************************
名稱: busy
輸入:無
輸出:忙狀態(tài)返回1,空閒狀態(tài)返回0;
功能:判別LCD控制器內(nèi)部狀態(tài),忙時返回1,閑時返回0
**********************************************************/
uchar busy(void)
{
RS_COMM;
RW_READ;
if(BIT(7)==0)
{
return 0;
}
else
return 1;
}
/***************************************************************
名稱:12864測試
功能:逐點掃描
****************************************************************/
void LCD_test()
{
uchar i,j;
for(i=0;i<63;i++)
{
for(j=0;j<127;j++)
{
delayms(20);
LCD_write_dot(i,j);
delayms(100);
}
}
}
/**************************************************************
名稱:axis()
輸入:無
輸出:無
功能:標(biāo)定界面坐標(biāo)
***************************************************************/
void axis()
{
uchar a,b,y,x;
for(a=0;a<63;a++) //y軸坐標(biāo)及分位點;
{
LCD_write_data(a,29,0x01);
}
for(b=0;b<127;b+=5) //x軸坐標(biāo)及分位點;
{
LCD_write_data(30,b,0x04);
}
}
/**********************************************************
/********************************************************
名稱:定時器0初始化
輸入:
輸出:
描述:普通方式,中斷工作方式,注意中斷響應(yīng)程序中要重裝初值
*********************************************************/
void timer0_init()
{
SFIOR|=BIT(0); //復(fù)位預(yù)定比例分頻器;
TCCR0|=(BIT(2)|BIT(0)); //設(shè)定分頻器為1024分頻;
//TCCR0|=BIT(0); //設(shè)定分頻器為無分頻;
TCNT0=255; //裝訂計數(shù)初值
TIMSK|=BIT(0); //開啟T/C0中斷;
SEI(); //開總中斷;
DDRC|=BIT(0);
PORTC|=BIT(0);
}
/************************************************************
中斷處理函數(shù)
************************************************************/
#pragma interrupt_handler time0_proc:10
void time0_proc()
{
TIMSK&=~BIT(0); //關(guān)閉中斷;
TCNT0=255; //重新裝訂計數(shù)初值;
PORTC^=BIT(0);
TIMSK|=BIT(0); //開啟T0中斷
}
/*************************************************************
名稱:6位數(shù)碼管按鍵位移顯示
輸入:無
輸出:無
描述:按鍵輸入時在LED上移位顯示按鍵值,當(dāng)按下f時,全部清零。
**************************************************************/
void keymovedis()
{
uchar keyval1,keyval2,presstimes;
while(1)
{
if(keyscan()==15) //F的鍵值為15;
{
for(presstimes=0;presstimes<5;presstimes++)
{
dispbuf[presstimes]=date[0];
show(0,presstimes);
}
}
else
{
for(presstimes=0;presstimes<5;presstimes++)
{
dispbuf[5-presstimes]=dispbuf[4-presstimes];
dispbuf[0]=keyscan();
show(dispbuf[presstimes],presstimes);
}
}
}
}
/*********************************************************
主函數(shù)main().c,地球人都知道,不必廢話
**********************************************************/
void main()
{
while(1)
{
}
}
上一頁 1 2 3 下一頁

關(guān)鍵詞: Atmega16單片機實用程

評論


技術(shù)專區(qū)

關(guān)閉