?? main.c
字號:
/*****http://hi.baidu.com/echoas**********
程序:MCS-51驅動AMPIRE128*64液晶
內容:LCD12864綜合顯示--漢字,圖片、幾何圖形
編譯器:keil uVision3
開發板:Proteus仿真圖
作者:大海橡樹
整理日期:2011-01-28
修改:無
備注:有什么錯誤的地方,歡迎網友們到空間留言
O(∩_∩)O~
******http://hi.baidu.com/echoas*********/
#include<AT89X52.h>
#include<intrins.h>
#include<math.h>
#include"source.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_databus P0 //LCD12864的8位數據口
sbit RS=P2^2; //RS為0---命令;1----數據
sbit RW=P2^1; //RW為1---寫;0---讀
sbit EN=P2^0; //使能端
sbit CS1=P2^4; //片選1低電平有效,控制左半屏
sbit CS2=P2^3; //片選1低電平有效,控制右半屏
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2; //三個按鍵控制口
void delay(uint i)
{
while(--i);
}
void Read_busy()//讀“忙”函數-----數據線的最高位DB71則busy
{
P0=0x00;
RS=0;
RW=1;
EN=1;
while(P0 & 0x80);
EN=0;
}
void write_LCD_command(uchar value) //寫命令函數
{
Read_busy(); //對LCD的每次讀寫都要讀忙
RS=0; //選擇命令
RW=0; //讀操作
LCD_databus=value;
EN=1; //EN由1----0鎖存有效數據
_nop_();
_nop_();
EN=0;
}
void write_LCD_data(uchar value)//寫數據函數
{
Read_busy();
RS=1; //選擇數據
RW=0;
LCD_databus=value;
EN=1; //EN由1----0鎖存有效數據
_nop_();
_nop_();
EN=0;
}
uchar Read_LCD(void) //讀數據函數
{
uchar value;
Read_busy();
LCD_databus=0xFF; //先進行一次空讀操作
RS=1;
RW=1;
EN=1;
_nop_();
_nop_();
EN=0;
LCD_databus=0xFF; //讀取真正的數據
RS=1;
RW=1;
EN=1;
value=LCD_databus;
_nop_();
_nop_();
EN=0;
return value;
}
void Set_page(uchar page) //設置“頁”LCD12864共8頁,一頁是8行點陣點
{
page=0xb8|page; //頁的首地址為0xB8
write_LCD_command(page);
}
void Set_line(uchar startline) //設置顯示的起始行
{
startline=0xC0|startline; //起始行地址為0xC0
write_LCD_command(startline); //設置從哪行開始:共0--63;一般從0 行開始顯示
}
void Set_column(uchar column) //設置顯示的列
{
column=column &0x3f; //列的最大值為64
column= 0x40|column; //列的首地址為0x40
write_LCD_command(column); //規定顯示的列的位置
}
void SetOnOff(uchar onoff) //顯示開關函數:0x3E是關顯示,0x3F是開顯示
{
onoff=0x3e|onoff; //onoff:1---開顯示;0---關顯示
write_LCD_command(onoff);
}
void SelectScreen(uchar screen) //選擇屏幕
{
switch(screen)
{
case 0: CS1=0;CS2=0;break; //全屏
case 1: CS1=0;CS2=1;break;//左半屏
case 2: CS1=1;CS2=0;break;//右半屏
default:break;
}
}
void ClearScreen(uchar screen) //清屏函數
{
uchar i,j;
SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏
for(i=0;i<8;i++) //控制頁數0-7,共8頁
{
Set_page(i);
Set_column(0);
for(j=0;j<64;j++) //控制列數0-63,共64列
{
write_LCD_data(0x00); //寫入0,地址指針自加1
}
}
}
void init_LCD() //LCD的初始化
{
SetOnOff(1); //開顯示
SelectScreen(0);
ClearScreen(0); //清屏
Set_line(0); //開始行:0
}
void Draw_dots(uchar x,uchar y,uchar color)
{
uchar x_byte;
uchar x_bit;
uchar Temp_data; //暫時存放從LCD讀出的數據
x_byte=(y>>3); //計算出該點屬于哪個字節
x_bit=y-(x_byte<<3); //屬于字節的哪一位
if(x>63) //x>63則顯示在右半屏
{
SelectScreen(2);
x=x-64;
}
else //顯示在左半屏
{
SelectScreen(1);
}
Set_page(x_byte); //設置行地址
Set_column(x); //設置列地址
Temp_data=Read_LCD(); //先讀出沒打點前LCD中的數據
switch(color)
{
case 0x01 : Temp_data &= ~(1<<x_bit);break; //擦除
case 0x02 : Temp_data ^= (1<<x_bit); break; //反白
case 0x03 : Temp_data |= (1<<x_bit); break; //畫點
default : break;
}
Set_page(x_byte);
Set_column(x);
write_LCD_data(Temp_data); //將處理后的數據送到LCD中顯示
}
/**********************************
兩點間畫直線:
x1<x2<127,y1<y2<64
***********************************/
void Draw_line(unsigned char x1,y1,x2,y2)
{
unsigned char i;
for(i=x1;i<x2+1;i++)
Draw_dots(i,(y2-y1)*(i-x1)/(x2-x1)+y1,2);
}
/**********************************
畫圓:
(x,y)為圓心,r為半徑
***********************************/
void Draw_circle(unsigned char x,y,r)
{
unsigned char i;
for(i=x-r;i<x+r+1;i++)
{
Draw_dots(i,y-sqrt(r*r-(x-i)*(x-i)),2);
Draw_dots(i,y+sqrt(r*r-(x-i)*(x-i)),2);
}
}
/**********************************
兩矩形:
(x1,y1)為矩形左上角坐標點
(x2,y2)為矩形右上角坐標點
***********************************/
void Draw_retic(uchar x1,uchar y1,uchar x2,uchar y2)//畫正方形,x1,y1為左上角坐標,x2,y2為右下角坐標
{
uchar i;
for(i=0;i<=x2-x1;i++)
{
Draw_dots(x1+i,y1,2);
Draw_dots(x1+i,y2,2);
}
for(i=0;i<=y2-y1;i++)
{
Draw_dots(x1,y1+i,2);
Draw_dots(x2,y1+i,2);
}
}
void Display_ASCII(uchar screen,uchar page,uchar column,uchar *p)
{
uchar i;
SelectScreen(screen);
Set_page(page);
Set_column(column);
for(i=0;i<8;i++) //顯示字符上半部分:8*8
{
write_LCD_data(p[i]);
}
Set_page(page+1); //顯示字符下半部分:8*8
Set_column(column);
for(i=0;i<8;i++)
{
write_LCD_data(p[i+8]);
}
}
void Display_HZ(uchar screen,uchar page,uchar column,uchar *p)
{
uchar i;
SelectScreen(screen);
Set_page(page); //寫上半頁:16*8
Set_column(column*16); //控制列
for(i=0;i<16;i++) //控制16列的數據輸出
{
write_LCD_data(p[i]); //漢字的上半部分
}
Set_page(page+1); //寫下半頁:16*8
Set_column(column*16); //控制列
for(i=0;i<16;i++) //控制16列的數據輸出
{
write_LCD_data(p[i+16]); //漢字的下半部分
}
}
void Display_picture(uchar a[][64])//顯示圖形—128*64大小
{
uchar i,j;
for(j=0;j<8;j++)
{
SelectScreen(1);
Set_page(j);
Set_column(0);
for(i=0;i<64;i++)
{
write_LCD_data(a[2*j][i]);//每隔一行取一次數組中的數據
}
SelectScreen(2);
Set_page(j);
Set_column(0);
for(i=0;i<64;i++)
{
write_LCD_data(a[2*j+1][i]);//每隔一行取一次數組中的數據
}
}
}
void key_scan(void)
{
uchar i;
if(KEY1==0) //按鍵1按下,顯示漢字
{
delay(5000);
if(KEY1==0)
{
while(!KEY1);
ClearScreen(0);
for(i=8;i>0;i--) //滾屏
{
Display_HZ(1,0+i,2,huan);
Display_HZ(1,0+i,3,ying);
Display_HZ(2,0+i,0,fang);
Display_HZ(2,0+i,1,wen);
Display_HZ(1,2+i,0,da);
Display_HZ(1,2+i,1,hai);
Display_HZ(1,2+i,2,xiang);
Display_HZ(1,2+i,3,shu);
Display_HZ(2,2+i,0,bai);
Display_HZ(2,2+i,1,du);
Display_HZ(2,2+i,2,kong);
Display_HZ(2,2+i,3,jian);
delay(30000);
ClearScreen(0);
}
Display_HZ(1,0+i,2,huan);
Display_HZ(1,0+i,3,ying);
Display_HZ(2,0+i,0,fang);
Display_HZ(2,0+i,1,wen);
Display_HZ(1,2+i,0,da);
Display_HZ(1,2+i,1,hai);
Display_HZ(1,2+i,2,xiang);
Display_HZ(1,2+i,3,shu);
Display_HZ(2,2+i,0,bai);
Display_HZ(2,2+i,1,du);
Display_HZ(2,2+i,2,kong);
Display_HZ(2,2+i,3,jian);
}
}
if(KEY2==0) //按鍵2按下,顯示圖片---大海橡樹
{
delay(5000);
if(KEY2==0)
{
while(!KEY2);
ClearScreen(0);
Display_picture(BMP);
}
}
if(KEY3==0) //按鍵3按下,顯示幾何圖形
{
delay(5000);
if(KEY3==0)
{
while(!KEY3);
ClearScreen(0);
Display_HZ(1,0,2,zhi);
Display_HZ(1,0,3,xian);
Display_HZ(2,2,1,ju);
Display_HZ(2,2,2,xing);
Display_HZ(1,4,1,yuan);
Draw_line(0,0,127,63);
Draw_retic(70,0,120,33);
Draw_circle(30,40,20);
}
}
}
void main()
{
init_LCD(); //初始12864
ClearScreen(0); //清屏
Set_line(0); //顯示開始行
Display_HZ(1,2,1,qing);
Display_HZ(1,2,2,an);
Display_HZ(1,2,3,button);
Display_HZ(2,2,0,xuan);
Display_HZ(2,2,1,ze);
Display_HZ(2,2,2,andsoon); //上電顯示:“請按鍵選擇…”
while(1)
{
key_scan();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -