分享一些ATmega16的基本的lcd12864顯示函數,可能對大家的學習有用.仿真文件可以從本帖附件下載
- #include<iom16v.h>
- #include<macros.h>
- #include"12864.h"
- #include"main.h"
- void port_init(void)
- {
- DDRC=0xFF; //12864數據口,置為輸出
- PORTC=0xFF;
-
- en_out; //置EN輸出
- rw_out; //置rw輸出
- rs_out; //置rs輸出
- cs1_out;//置cs1輸出
- cs2_out;//置cs2輸出
- }
- /***
- ******12864寫命令函數
- ***/
- void lcd_write_com(uchar com)
- {
- rw_clr; //寫操作
- delay_us(3);
- rs_clr; //寫數據
- PORTC=com;
- en_set;
- delay_us(3);
- en_clr;
- }
- /***
- ******12864寫數據函數
- ***/
- void lcd_write_date(uchar date)
- {
- rw_clr; //寫操作
- delay_us(3);
- rs_set; //寫數據
- PORTC=date;
- en_set;
- delay_us(3);
- en_clr;
- }
- /***
- ******12864確定位置數據函數
- ******頁地址:x范圍0-7
- ******列地址:y范圍0-63
- ***/
- void lcd_setxy(uchar x,uchar y)
- {
- lcd_write_com(0xb8+x);
- lcd_write_com(0x40+y);
- }
- /***
- ******12864寫一個字母或數字函數
- ******頁地址:x范圍0-3
- ******列地址:y范圍0-15
- ***/
- void lcd_write_ch(uchar x,uchar y,const uchar *ch)
- {
- uchar i,j;
- if(y<8) //判斷列地址,如果小于8列,顯示在左屏
- {
- cs1_clr; // CS1=0;
- cs2_set; // CS2=1;
- }
- else //判斷列地址,如果大于8列,顯示在右屏
- {
-
- cs1_set; // CS1=1;
- cs2_clr; // CS2=0;
- y=y-8;
- }
- for(i=0;i<2;i++)
- {
- lcd_setxy(x*2+i,y*8); // x*2+i的意思是每個字符占用兩頁,一共可以顯示4行(一共8頁)
- // y*8 的意思是每次寫入的列都是8的整數倍
- for(j=0;j<8;j++)
- {
- lcd_write_date(ch[i*8+j]) ; //一共16個字節
- delay_us(1);
- }
- }
- cs1_clr; // CS1=0;
- cs2_clr; // CS2=0;
- }
- /***
- ******12864寫一個漢字函數
- ******頁地址:x范圍0-3
- ******列地址:y范圍0-7
- ***/
- void lcd_write_hanzi(uchar x,uchar y,const uchar *dat)
- {
- uchar i,j;
- if(y<4)
- {
- cs1_clr; //CS1=0;
- cs2_set; //CS2=1;
- }
- else
- {
- cs1_set; //CS1=1;
- cs2_clr; //CS2=0;
- y-=4;
- }
- for(i=0;i<2;i++)
- {
- lcd_setxy(x*2+i,y*16); // x*2+i的意思是每個漢字占用兩頁,一共可以顯示4行(一共8頁)
- delay_us(1); //每次寫入都是16的倍數列
- for(j=0;j<16;j++)
- {
- lcd_write_date(dat[i*16+j]) ; //一共16個字節
- delay_us(3);
- }
- }
- cs1_clr; //CS1=0;
- cs2_clr; //CS2=0;
- }
- /***
- ******12864寫一行字符函數
- ******頁地址:x范圍0-3
- ******列地址:y范圍0-15
- ******字符數:0-15
- ***/
- void lcd_write_str_hang(uchar x,uchar y,const uchar *ch,uchar n)
- {
- uchar i;
- for(i=0;i<n;i++)
- {
- lcd_write_ch(x,y,ch+16*i); //指針相加
- y++;
- delay_us(3);
- }
- }
- /***
- ******12864寫一行漢字函數
- ******頁地址:x范圍0-3
- ******列地址:y范圍0-7
- ******字符數:0-7
- ***/
- void lcd_write_hanzi_hanzi_hang(uchar x,uchar y,const uchar *date,uchar n)
- {
- uchar i;
- for(i=0;i<n;i++)
- {
- lcd_write_hanzi(x,y,date+i*32);
- //注意理解ch+i*32:指的是數組指向下 i*32個數組
- y++;
- delay_us(3);
- }
- }
- /***
- ******12864寫一個字母或數字反白函數
- ******頁地址:x范圍0-3
- ******列地址:y范圍0-15
- ***/
- void lcd_write_ch_fb(uchar x,uchar y,const uchar *ch)
- {
- uchar i,j;
- if(y<8)
- {
- cs1_clr; //CS1=0;
- cs2_set; //CS2=1;
- }
- else
- {
- cs1_set; //CS1=1;
- cs2_clr; //CS2=0;
- y-=8;
- }
-
- for(i=0;i<2;i++)
- {
- lcd_setxy(x*2+i,y*8);
- {
- for(j=0;j<8;j++)
- {
- lcd_write_date(255-ch[i*8+j]) ; //一共16個字節
- delay_us(3);
- }
- }
- }
- cs1_clr; //CS1=0;
- cs2_clr; //CS2=0;
- }
- /***
- ******12864寫一行字母或數字反白函數
- ******頁地址:x范圍0-3
- ******列地址:y范圍0-15
- ***/
- void lcd_write_str_fb(uchar x,uchar y,const uchar *ch,uchar n)
- {
- uchar i;
- for(i=0;i<n;i++)
- {
- lcd_write_ch_fb(x,y,ch+i*16);
- y++;
- delay_us(3);
- }
- }
- /***
- ******12864寫一個漢字反白顯示函數
- ******頁地址:x范圍0-3
- ******列地址:y范圍0-7
- ******字符數: n范圍0-7
- ***/
- void lcd_write_hanzi_fb(uchar x,uchar y,const uchar *date)
- {
- uchar i,j;
- if(y<4)
- {
- cs1_clr; //CS1=0;
- cs2_set; //CS2=1;
- }
- else
- {
- cs1_set; //CS1=1;
- cs2_clr; //CS2=0;
- y-=4;
- }
- for(i=0;i<2;i++)
- {
- lcd_setxy(x*2+i,y*16);
- for(j=0;j<16;j++)
- {
- lcd_write_date(255-date[i*16+j]) ; //一共16個字節
- delay_us(3);
- }
- }
- cs1_clr; //CS1=0;
- cs2_clr; //CS2=0;
- }
- /***
- ******12864寫一行漢字反白顯示函數
- ******頁地址:x范圍0-3
- ******列地址:y范圍0-7
- ******字符數: n范圍0-7
- ***/
- void lcd_write_hanzi_hang_fb(uchar x,uchar y,const uchar *date,uchar n)
- {
- uchar i;
- for(i=0;i<n;i++)
- {
- lcd_write_hanzi_fb(x,y,date+i*32);
- y++;
- delay_us(3);
- }
- }
- /***
- ******12864初始化函數
- ***/
- void lcd_init(void)
- {
- lcd_write_com(0x3f); //開顯示開關
- lcd_write_com(0xc0); //LCD行初始地址,共64行
- lcd_write_com(0xb8); //LCD頁初始地址 共8頁
- lcd_write_com(0x40); //LCD列初始地址,共64列
- }
- /***
- ******12864清屏函數
- ***/
- void lcd_clear_csr(void)
- {
- uchar i,j;
- // CS1=0;
- cs1_clr;
- // CS2=1;
- cs2_set;
- for(i=0;i<8;i++) //清除左屏
- {
- lcd_setxy(i,0);
- for(j=0;j<64;j++)
- {
- lcd_write_date(0) ;
- delay_us(1);
- }
- lcd_setxy(0,0);
- }
- //CS1=1;
- cs1_set; //清除右屏
- //CS2=0;
- cs2_clr;
- for(i=0;i<8;i++)
- {
- lcd_setxy(i,0);
- for(j=0;j<64;j++)
- {
- lcd_write_date(0) ;
- delay_us(1);
- }
- lcd_setxy(0,0);
- }
- }
- /***
- ******12864清除一行顯示函數
- **** x :0-3
- ***/
- void lcd_clear_hang(uchar x)
- {
- uchar i,j;
- cs1_clr; //CS1=0; //左屏
- cs2_set; //CS2=1;
- for(i=0;i<2;i++)
- {
- lcd_setxy(x*2+i,0);
- delay_us(2);
- for(j=0;j<64;j++)
- {
- lcd_write_date(0);
- delay_us(2);
- }
- }
- cs1_set; //CS1=1; 右屏
- cs2_clr; //CS2=0;
- for(i=0;i<2;i++)
- {
- lcd_setxy(x*2+i,0);
- delay_us(2);
- for(j=0;j<64;j++)
- {
- lcd_write_date(0);
- delay_us(2);
- }
- }
- }
復制代碼
所有資料下載:
12864顯示avr單片機.rar
(68.2 KB, 下載次數: 117)
2016-9-8 20:48 上傳
點擊文件名下載附件
|