?? main.c
字號(hào):
/*****http://hi.baidu.com/echoas********
程序:MCS-51驅(qū)動(dòng)LCD12864液晶
內(nèi)容:LCD12864顯示正弦曲線
編譯器:keil uVision3
開(kāi)發(fā)板:Proteus仿真圖
作者:大海橡樹(shù)
整理日期:2011-01-28
修改:無(wú)
備注:有什么錯(cuò)誤的地方,歡迎網(wǎng)友們到空間留言
O(∩_∩)O~
******http://hi.baidu.com/echoas*********/
#include <AT89X52.h>
#include <intrins.h>
#include<math.h>
#include"ZB.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_databus P0 //LCD12864的8位數(shù)據(jù)口
sbit RS=P2^2; //RS為0---命令;1----數(shù)據(jù)
sbit RW=P2^1; //RW為1---寫(xiě);0---讀
sbit EN=P2^0; //使能端
sbit CS1=P2^4; //片選1低電平有效,控制左半屏
sbit CS2=P2^3; //片選1低電平有效,控制右半屏
void Read_busy()//讀“忙”函數(shù)-----數(shù)據(jù)線的最高位DB71則busy
{
P0=0x00;
RS=0;
RW=1;
EN=1;
while(P0 & 0x80);
EN=0;
}
void write_LCD_command(uchar value) //寫(xiě)命令函數(shù)
{
Read_busy(); //對(duì)LCD的每次讀寫(xiě)都要讀忙
RS=0; //選擇命令
RW=0; //讀操作
LCD_databus=value;
EN=1; //EN由1----0鎖存有效數(shù)據(jù)
_nop_();
_nop_();
EN=0;
}
void write_LCD_data(uchar value)//寫(xiě)數(shù)據(jù)函數(shù)
{
Read_busy();
RS=1; //選擇數(shù)據(jù)
RW=0;
LCD_databus=value;
EN=1; //EN由1----0鎖存有效數(shù)據(jù)
_nop_();
_nop_();
EN=0;
}
uchar Read_LCD(void) //讀數(shù)據(jù)函數(shù)
{
uchar value;
Read_busy();
LCD_databus=0xFF; //先進(jìn)行一次空讀操作
RS=1;
RW=1;
EN=1;
_nop_();
_nop_();
EN=0;
LCD_databus=0xFF; //讀取真正的數(shù)據(jù)
RS=1;
RW=1;
EN=1;
value=LCD_databus;
_nop_();
_nop_();
EN=0;
return value;
}
void Set_page(uchar page) //設(shè)置“頁(yè)”LCD12864共8頁(yè),一頁(yè)是8行點(diǎn)陣點(diǎn)
{
page=0xb8|page; //頁(yè)的首地址為0xB8
write_LCD_command(page);
}
void Set_line(uchar startline) //設(shè)置顯示的起始行
{
startline=0xC0|startline; //起始行地址為0xC0
write_LCD_command(startline); //設(shè)置從哪行開(kāi)始:共0--63;一般從0 行開(kāi)始顯示
}
void Set_column(uchar column) //設(shè)置顯示的列
{
column=column &0x3f; //列的最大值為64
column= 0x40|column; //列的首地址為0x40
write_LCD_command(column); //規(guī)定顯示的列的位置
}
void SetOnOff(uchar onoff) //顯示開(kāi)關(guān)函數(shù):0x3E是關(guān)顯示,0x3F是開(kāi)顯示
{
onoff=0x3e|onoff; //onoff:1---開(kāi)顯示;0---關(guān)顯示
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) //清屏函數(shù)
{
uchar i,j;
SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏
for(i=0;i<8;i++) //控制頁(yè)數(shù)0-7,共8頁(yè)
{
Set_page(i);
Set_column(0);
for(j=0;j<64;j++) //控制列數(shù)0-63,共64列
{
write_LCD_data(0x00); //寫(xiě)入0,地址指針自加1
}
}
}
void InitLCD() //LCD的初始化
{
SetOnOff(1); //開(kāi)顯示
SelectScreen(0);
ClearScreen(0); //清屏
Set_line(0); //開(kāi)始行:0
}
void Draw_dots(uchar x,uchar y,uchar color)
{
uchar x_byte;
uchar x_bit;
uchar Temp_data; //暫時(shí)存放從LCD讀出的數(shù)據(jù)
x_byte=(y>>3); //計(jì)算出該點(diǎn)屬于哪個(gè)字節(jié)
x_bit=y-(x_byte<<3); //屬于字節(jié)的哪一位?
if(x>63) //x>63則顯示在右半屏
{
SelectScreen(2);
x=x-64;
}
else //顯示在左半屏
{
SelectScreen(1);
}
Set_page(x_byte); //設(shè)置行地址
Set_column(x); //設(shè)置列地址
Temp_data=Read_LCD(); //先讀出沒(méi)打點(diǎn)前LCD中的數(shù)據(jù)
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; //畫(huà)點(diǎn)
default : break;
}
Set_page(x_byte);
Set_column(x);
write_LCD_data(Temp_data); //將處理后的數(shù)據(jù)送到LCD中顯示
}
void Display_HZ(uchar ss,uchar page,uchar column,uchar *p)
{
uchar i;
SelectScreen(ss);
Set_page(page); //寫(xiě)上半頁(yè)
Set_column(column*16); //控制列
for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出
{
write_LCD_data(p[i]); //漢字的上半部分
}
Set_page(page+1); //寫(xiě)下半頁(yè)
Set_column(column*16); //控制列
for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出
{
write_LCD_data(p[i+16]); //漢字的下半部分
}
}
void Display_picture(uchar a[][64])//顯示圖形--坐標(biāo)
{
uchar i,j;
for(j=0;j<6;j++)
{
SelectScreen(1);
Set_page(j+2); //從第三頁(yè)開(kāi)始顯示
Set_column(0);
for(i=0;i<64;i++)
{
write_LCD_data(a[2*j][i]);//每隔一行取一次數(shù)組中的數(shù)據(jù)
}
SelectScreen(2);
Set_page(j+2);
Set_column(0);
for(i=0;i<64;i++)
{
write_LCD_data(a[2*j+1][i]);//每隔一行取一次數(shù)組中的數(shù)據(jù)
}
}
}
void main()
{
uchar x,y;
InitLCD(); //初始12864
ClearScreen(0); //清屏
Set_line(0); //顯示開(kāi)始行
Display_HZ(1,0,0,da); //大
Display_HZ(1,0,1,hai); //海
Display_HZ(1,0,2,xiang); //橡
Display_HZ(1,0,3,shu); //樹(shù)
Display_HZ(2,0,0,bai); //百
Display_HZ(2,0,1,du); //度
Display_HZ(2,0,2,kong); //空
Display_HZ(2,0,3,jian); //間
Display_picture(BMP); //坐標(biāo)圖
for(x=12;x<128;x++) //正弦曲線
{
y=35-18*sin((x-12)*3.14/16);
Draw_dots(x,y,2);
}
while(1);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -