12864LCD智能.docx

上传人:b****8 文档编号:9725703 上传时间:2023-02-06 格式:DOCX 页数:22 大小:19.20KB
下载 相关 举报
12864LCD智能.docx_第1页
第1页 / 共22页
12864LCD智能.docx_第2页
第2页 / 共22页
12864LCD智能.docx_第3页
第3页 / 共22页
12864LCD智能.docx_第4页
第4页 / 共22页
12864LCD智能.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

12864LCD智能.docx

《12864LCD智能.docx》由会员分享,可在线阅读,更多相关《12864LCD智能.docx(22页珍藏版)》请在冰豆网上搜索。

12864LCD智能.docx

12864LCD智能

总程序如下:

------杨晖晖(09042315)

1、主程序

#include

#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;

EA=1;

}

/*****************************/

/****键处理函数定义****/

/*****************************/

voidkey_charge(unsignedcharkey)

{

switch(key)

{

case1:

if(++A>5)A=0;

break;

case2:

if(++f>10)f=1;

break;

case3:

if(++wave>2)wave=0;

break;

}

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;

break;

case1:

y=A*(x%32)/(32*5/48)+24-A*4.8;//sanjiao

y=((x%64/32)?

48-y:

y);

break;

case2:

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();

#endif

3、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

#include

bitDACconversion(unsignedcharsla,unsignedcharc,unsignedcharVal);

#endif

5、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.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

};

#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();

//应答子函数

#endif

8、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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1