12864LCD智能.docx
《12864LCD智能.docx》由会员分享,可在线阅读,更多相关《12864LCD智能.docx(22页珍藏版)》请在冰豆网上搜索。
12864LCD智能
总程序如下:
------杨晖晖(09042315)
1、主程序
#include
#include"12864.h"
#include"key_8.h"
#include"PCf8591.h"
#include"sin_code.h"
#definePCF85910x90//PCf8591地址
staticcharA=3;//振幅
staticcharf=5;//频率
staticunsignedcharwave;//波形选择
staticunsignedchardat;
staticbitchange=1;
staticbitdot;
unsignedcharDIS4[]={"Vpp:
VFreg:
H"};
voidsys_init();
voidlcd_init();
voidfil_buf();
voiddisplay();
voidkey_charge(unsignedcharkey);
/*********************************************************
*主函数*
*********************************************************/
voidmain()
{
intf_sta;
unsignedcharkey;
delay(100);//上电,等待稳定
lcd_init();//初始化LCD
delay(100);
sys_init();
while
(1)
if(dot)
DACconversion(PCF8591,0x40,A*dat/5.0);
dot=0;
}
if(change)
EA=0;
display();
f_sta=65536-(1000000/255.0)/f;
RCAP2H=f_sta/256;//定时器2的16位捕捉/自动重载寄存器
RCAP2L=f_sta%256;
EA=1;
change=0;
if(key=got_key())//若有键,则处理按键
key_charge(key);
/*****************************/
/****系统初始化****/
voidsys_init()
RCAP2L=0X00;
RCAP2H=0XFF;
ET2=1;
TR2=1;
/****键处理函数定义****/
voidkey_charge(unsignedcharkey)
switch(key)
case1:
if(++A>5)A=0;
break;
case2:
if(++f>10)f=1;
case3:
if(++wave>2)wave=0;
change=1;
/****填充显示缓冲区****/
voidfil_buf()
ucharx,y,i,h,l;
memset(disp,0,64*16);//disp的前64*16清零
DIS4[5]=A+'0';
DIS4[13]=f/10+'0';
DIS4[14]=f%10+'0';
for(x=0;x<128;x++)
switch(wave)
case0:
y=A*sin_code[(2*x*f)%255]/(255*5/48)+24-A*4.8;
y=A*(x%32)/(32*5/48)+24-A*4.8;//sanjiao
y=((x%64/32)?
48-y:
y);
l=24-A*4.8;//juxing
h=(A*46/5+24-A*4.8);
y=(x%64/32)?
l:
h;
if(!
(x%32))
for(i=l;i{set_dot(x,i);}break;}set_dot(x,y);}}/*****************************//****显示函数定义****//*****************************/voiddisplay(){uchari;clr_screen();fil_buf();lcd_pos(4,0);for(i=0;i<16;i++){lcd_wdat(DIS4[i]);}delay(30);photodisplay(disp);}/*******************************************************************//*LCD初始化设定*//*******************************************************************/voidlcd_init(){LCD_PSB=1;//并口方式LCD_RST=0;//液晶复位delay(3);LCD_RST=1;delay(3);lcd_wcmd(0x34);//扩充指令操作delay(5);lcd_wcmd(0x30);//基本指令操作delay(5);lcd_wcmd(0x0C);//显示开,关光标delay(5);lcd_wcmd(0x01);//清除LCD的显示内容delay(5);}voidtimer2(void)interrupt5using2//该中断程序中使用第3组工作寄存器串行{staticunsignedcharx;TF2=0;//溢出标志if(x++>=255)x=0;switch(wave){case0:dat=sin_code[x];break;case1:dat=x/128?2*(255-x):2*x;break;case2:if(x==1)dat=0;if(x==128)dat=A*(255/5);break;}dot=1;}2、12864lcd头文件#ifndef_12864_H#define_12864_H#include#defineucharunsignedchar#defineuintunsignedint/*************12864LCD引脚定义*************/#defineLCD_dataP0//数据口sbitLCD_RS=P2^5;//寄存器选择输入sbitLCD_RW=P2^6;//液晶读/写控制sbitLCD_EN=P2^7;//液晶使能控制sbitLCD_PSB=P2^2;//串/并方式控制sbitLCD_RST=P2^4;//液晶复位端口 externxdatauchardisp[65][16];voidset_dot(ucharx,uchary);//voidclr_dot(ucharx,uchary);voiddelay(intms);bitlcd_busy();voidlcd_wcmd(ucharcmd);voidlcd_wdat(uchardat);voidlcd_pos(ucharX,ucharY);//voidlcdflag();voidphotodisplay(uchar*bmp);voidclr_screen();#endif3、12864lcd程序/******************************************************************************描述:**12864标准字库液晶演示数据p0,控制p2*********************************************************************************/#include#include"12864.h"#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};xdatauchardisp[65][16];voidset_dot(ucharx,uchary){disp[y][x/8]|=0x80>>(x%8);}//voidclr_dot(ucharx,uchary)//{//disp[y][x/8]&=~(0x80>>(x%8));//}/*******************************************************************//*延时函数*//*******************************************************************/voiddelay(intms){while(ms--){uchary;for(y=0;y<100;y++);}}/*******************************************************************//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*//**//*******************************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();result=(bit)(P0&0x80);LCD_EN=0;return(result);}/*******************************************************************//**//*写指令数据到LCD*//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*//**//*******************************************************************/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*******************************************************************//*写显示数据到LCD*//*RS=H,RW=L,E=高脉冲,D0-D7=数据。*//*******************************************************************/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*********************************************************//*设定显示位置*//*********************************************************/voidlcd_pos(ucharX,ucharY){ucharpos;if(X==1){X=0x80;}elseif(X==2){X=0x90;}elseif(X==3){X=0x88;}elseif(X==4){X=0x98;}pos=X+Y;lcd_wcmd(pos);//显示地址}/**********************************************************图形显示**********************************************************/voidphotodisplay(uchar*bmp){uchari,j;lcd_wcmd(0x34);//写数据时,关闭图形显示for(i=0;i<32;i++){lcd_wcmd(0x80+i);//先写入水平坐标值lcd_wcmd(0x80);//写入垂直坐标值for(j=0;j<16;j++)//再写入两个8位元的数据lcd_wdat(*bmp++);delay(1);}for(i=0;i<32;i++){lcd_wcmd(0x80+i);lcd_wcmd(0x88);for(j=0;j<16;j++)lcd_wdat(*bmp++);delay(1);}lcd_wcmd(0x36);//写完数据,开图形显示lcd_wcmd(0x32);}/**********************************************************清屏函数**********************************************************/voidclr_screen(){lcd_wcmd(0x34);//扩充指令操作delay(5);lcd_wcmd(0x30);//基本指令操作delay(5);lcd_wcmd(0x01);//清屏delay(5);}4、DA-PCF8591头文件#ifndef_PCF8591_H#define_PCF8591_H#includebitDACconversion(unsignedcharsla,unsignedcharc,unsignedcharVal);#endif5、DA-PCF8591程序#include"I2C.H"/*******************************************************************DAC变换,转化函数*******************************************************************/bitDACconversion(unsignedcharsla,unsignedcharc,unsignedcharVal){Start_I2c();//启动总线SendByte(sla);//发送器件地址if(ack==0)return(0);SendByte(c);//发送控制字节if(ack==0)return(0);SendByte(Val);//发送DAC的数值if(ack==0)return(0);Stop_I2c();//结束总线return(1);} 杨晖晖(09042315)机械与电子工程学院2012.07.026、正弦波函数及256点#ifndef_SINCODE_H#define_SINCODE_Hcodeunsignedcharsin_code[]={128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245,246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179,176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131,128,124,121,118,115,112,109,106,103,99,96,93,90,87,84,81,79,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,19,18,16,15,13,12,10,9,8,7,6,5,4,3,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,2,3,3,4,5,6,7,8,9,10,12,13,15,16,18,19,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,79,81,84,87,90,93,96,99,103,106,109,112,115,118,121,124};#endif杨晖晖(09042315)机械与电子工程学院2012.07.02 7、I2C头文件声明#ifndef_I2C_H#define_I2C_H#include#include#include#defineNOP()_nop_()/*定义空指令*/#define_Nop()_nop_()/*定义空指令*/sbitSCL=P1^5;//I2C时钟sbitSDA=P3^6;//I2C数据externbitack;//起动总线函数externvoidStart_I2c();//结束总线函数externvoidStop_I2c();//应答子函数#endif8、I2C总线的驱动程序/**********************I2C总线的驱动程序*****************/#include"I2C.H"bitACK;/*************************************************************起动总线函数函数原型:voidStart_I2c();功能:启动I2C总线,即发送I2C起始条件.********************************************************************/voidStart_I2c(){SDA=1;/*发送起始条件的数据信号*/_Nop();SCL=1;_Nop();/*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0;/*发送起始信号*/_Nop();/*起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop();SCL=0;/*钳住I2C总线,准备发送或接收数据*/_Nop();_Nop();}/*******************************************************************结束总线函数函数原型:voidStop_I2c();功能:结束I2C总线,即发送I2C结束条件.********************************************************************/voidStop_I2c(){SDA=0
set_dot(x,i);
set_dot(x,y);
/****显示函数定义****/
voiddisplay()
uchari;
clr_screen();
fil_buf();
lcd_pos(4,0);
for(i=0;i<16;i++)
lcd_wdat(DIS4[i]);
delay(30);
photodisplay(disp);
/*******************************************************************/
/*LCD初始化设定*/
voidlcd_init()
LCD_PSB=1;//并口方式
LCD_RST=0;//液晶复位
delay(3);
LCD_RST=1;
lcd_wcmd(0x34);//扩充指令操作
delay(5);
lcd_wcmd(0x30);//基本指令操作
lcd_wcmd(0x0C);//显示开,关光标
lcd_wcmd(0x01);//清除LCD的显示内容
voidtimer2(void)interrupt5using2//该中断程序中使用第3组工作寄存器串行
staticunsignedcharx;
TF2=0;//溢出标志
if(x++>=255)x=0;
dat=sin_code[x];
dat=x/128?
2*(255-x):
2*x;
if(x==1)dat=0;
if(x==128)dat=A*(255/5);
dot=1;
2、12864lcd头文件
#ifndef_12864_H
#define_12864_H
#defineucharunsignedchar
#defineuintunsignedint
/*************12864LCD引脚定义*************/
#defineLCD_dataP0//数据口
sbitLCD_RS=P2^5;//寄存器选择输入
sbitLCD_RW=P2^6;//液晶读/写控制
sbitLCD_EN=P2^7;//液晶使能控制
sbitLCD_PSB=P2^2;//串/并方式控制
sbitLCD_RST=P2^4;//液晶复位端口
externxdatauchardisp[65][16];
voidset_dot(ucharx,uchary);
//voidclr_dot(ucharx,uchary);
voiddelay(intms);
bitlcd_busy();
voidlcd_wcmd(ucharcmd);
voidlcd_wdat(uchardat);
voidlcd_pos(ucharX,ucharY);
//voidlcdflag();
voidphotodisplay(uchar*bmp);
voidclr_screen();
#endif
3、12864lcd程序
/*****************************************************************************
*描述:
*
*12864标准字库液晶演示数据p0,控制p2*
********************************************************************************/
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
xdatauchardisp[65][16];
voidset_dot(ucharx,uchary)
disp[y][x/8]|=0x80>>(x%8);
//voidclr_dot(ucharx,uchary)
//{
//disp[y][x/8]&=~(0x80>>(x%8));
//}
/*延时函数*/
voiddelay(intms)
while(ms--)
uchary;
for(y=0;y<100;y++);
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/
/**/
bitlcd_busy()
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
voidlcd_wcmd(ucharcmd)
while(lcd_busy());
LCD_RW=0;
_nop_();
P0=cmd;
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
voidlcd_wdat(uchardat)
LCD_RS=1;
P0=dat;
/*********************************************************/
/*设定显示位置*/
voidlcd_pos(ucharX,ucharY)
ucharpos;
if(X==1)
{X=0x80;}
elseif(X==2)
{X=0x90;}
elseif(X==3)
{X=0x88;}
elseif(X==4)
{X=0x98;}
pos=X+Y;
lcd_wcmd(pos);//显示地址
*图形显示*
voidphotodisplay(uchar*bmp)
uchari,j;
lcd_wcmd(0x34);//写数据时,关闭图形显示
for(i=0;i<32;i++)
lcd_wcmd(0x80+i);//先写入水平坐标值
lcd_wcmd(0x80);//写入垂直坐标值
for(j=0;j<16;j++)//再写入两个8位元的数据
lcd_wdat(*bmp++);
delay
(1);
lcd_wcmd(0x80+i);
lcd_wcmd(0x88);
for(j=0;j<16;j++)
lcd_wcmd(0x36);//写完数据,开图形显示
lcd_wcmd(0x32);
*清屏函数*
voidclr_screen()
lcd_wcmd(0x01);//清屏
4、DA-PCF8591头文件
#ifndef_PCF8591_H
#define_PCF8591_H
bitDACconversion(unsignedcharsla,unsignedcharc,unsignedcharVal);
5、DA-PCF8591程序
#include"I2C.H"
/*******************************************************************
DAC变换,转化函数
*******************************************************************/
bitDACconversion(unsignedcharsla,unsignedcharc,unsignedcharVal)
Start_I2c();//启动总线
SendByte(sla);//发送器件地址
if(ack==0)return(0);
SendByte(c);//发送控制字节
SendByte(Val);//发送DAC的数值
Stop_I2c();//结束总线
return
杨晖晖(09042315)
机械与电子工程学院
2012.07.02
6、正弦波函数及256点
#ifndef_SINCODE_H
#define_SINCODE_H
codeunsignedcharsin_code[]=
128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,
176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,
218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245,
246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,
255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,
246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,
218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179,
176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131,
128,124,121,118,115,112,109,106,103,99,96,93,90,87,84,81,
79,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,
37,35,33,31,29,27,25,23,21,19,18,16,15,13,12,10,
9,8,7,6,5,4,3,3,2,1,1,0,0,0,0,0,
0,0,0,0,0,0,1,1,2,3,3,4,5,6,7,8,
9,10,12,13,15,16,18,19,21,23,25,27,29,31,33,35,
37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,
79,81,84,87,90,93,96,99,103,106,109,112,115,118,121,124
};
7、I2C头文件声明
#ifndef_I2C_H
#define_I2C_H
#defineNOP()_nop_()/*定义空指令*/
#define_Nop()_nop_()/*定义空指令*/
sbitSCL=P1^5;//I2C时钟
sbitSDA=P3^6;//I2C数据
externbitack;
//起动总线函数
externvoidStart_I2c();
//结束总线函数
externvoidStop_I2c();
//应答子函数
8、I2C总线的驱动程序
/**********************I2C总线的驱动程序*****************/
bitACK;
/*************************************************************
起动总线函数
函数原型:
voidStart_I2c();
功能:
启动I2C总线,即发送I2C起始条件.
********************************************************************/
voidStart_I2c()
SDA=1;/*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop();/*起始条件建立时间大于4.7us,延时*/
SDA=0;/*发送起始信号*/
_Nop();/*起始条件锁定时间大于4μs*/
SCL=0;/*钳住I2C总线,准备发送或接收数据*/
结束总线函数
voidStop_I2c();
结束I2C总线,即发送I2C结束条件.
voidStop_I2c()
SDA=0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1