LCD12864 串行方式画sin直线显示图像.docx
《LCD12864 串行方式画sin直线显示图像.docx》由会员分享,可在线阅读,更多相关《LCD12864 串行方式画sin直线显示图像.docx(17页珍藏版)》请在冰豆网上搜索。
LCD12864串行方式画sin直线显示图像
#include
#include
#include
/**************************************/
#defineucharunsignedchar
#defineuintunsignedint
#defineclear0x01//清屏
#definereset_DDRAM0x02//DDRAM地址归位
#defineleft_move0x04//游标左移
#defineright_move0x06//游标右移
#defineall_left_move0x05//画面整体左移
#defineall_right_move0x07//画面整体右移
#definedisplay_left_move0x10//显示游标左移
#definedisplay_right_move0x14//显示游标右移
#defineset_function10x30//基本指令集动作
#defineset_CGRAM0x40//设定CGRAM地址
#defineset_DDRAM0x80//设定DDRAM地址
#defineset_function20x34//扩充指令集动作
#definefanbai0x04//反白第一行(扩充指令集)
#defineset_GDRAM0x80//设定GDRAM地址(扩充指令集)
#defineON_G0x36//开绘图显示(扩充指令集)
#defineset_function20x34//关绘图显示(扩充指令集)
//端口定义
sbitLCD_CS=P3^5;//片选信号
sbitLCD_SID=P3^6;//串行数据线
sbitLCD_SCLK=P3^4;//串上时钟输入
/**************************************/
//数组,字定义
/**************************************/
ucharcodea[]={"阿姆YOUNG"};//定义要显示的字符串
uintx=0;
/**************************************/
//图片取模
/**************************************/
codeuchartu[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x00,0x00,0x04,0x00,0x00,0x00,
0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xE0,0x00,0x07,0xFF,0x00,0x00,0x00,
0x05,0xC6,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xE0,0x01,0xFF,0xFF,0x80,0x00,0x00,
0x05,0x5E,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x3F,0xFF,0xFF,0x80,0x00,0x00,
0x07,0x7E,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,
0x05,0xFE,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xC7,0x80,0x00,
0x05,0xFE,0x00,0x00,0x00,0x00,0x00,0x01,0xF1,0xFF,0xFF,0xFF,0xFF,0xCF,0xC0,0x00,
0x05,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xDF,0xE0,0x00,
0x07,0xF6,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,
0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,
0x04,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x3F,0xFF,0xFF,0xF0,0x00,
0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xBF,0xFE,0x07,0xFF,0xFF,0xF0,0x00,
0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0xFC,0x03,0xFF,0xFF,0xE0,0x00,
0x02,0x00,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x03,0xFF,0xFF,0xC0,0x00,
0x03,0xFC,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x03,0xFF,0xF8,0x00,0x00,
0x02,0xC8,0x0D,0x80,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x03,0xFF,0xE0,0x00,0x00,
0x02,0xC8,0x1D,0xC0,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x07,0xFF,0xC0,0x00,0x00,
0x02,0x4E,0x30,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x07,0xFF,0xC0,0x00,0x00,
0x0F,0xFE,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x0F,0xFF,0xC0,0x00,0x00,
0x06,0xC8,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x3F,0xFF,0x80,0x00,0x00,
0x06,0x58,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00,
0x07,0xFE,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0x80,0x00,0x00,
0x06,0x18,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x78,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x00,
0x00,0x30,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFC,0x00,0x00,0x00,
0x00,0x00,0x1B,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xF0,0x00,0x00,0x00,
0x01,0x80,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xC0,0x00,0x00,0x00,
0x01,0x80,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x00,0x00,
0x01,0x80,0x13,0x60,0x00,0x00,0x00,0x00,0x00,0x7F,0xFD,0xE0,0x00,0x00,0x00,0x00,
0x01,0x80,0xFF,0xC0,0x00,0x00,0x00,0x00,0x03,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0xC3,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x03,0x00,0x00,0x60,0x00,0x00,0x03,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x0F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0xFF,0xF8,0x00,0x00,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0C,0x7F,0xC0,0xF8,0x00,0x00,0x3F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0xFC,0x03,0xFC,0x00,0x00,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0xC2,0x03,0xFE,0x00,0x01,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0xC2,0x03,0xF7,0x00,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x05,0xC2,0x03,0xFB,0x00,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0F,0xC2,0x01,0xFB,0x80,0x07,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x05,0xC0,0x01,0xFD,0xC0,0x0F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x80,0x01,0xFC,0xE0,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x82,0x00,0xFC,0xE0,0x1F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x82,0x00,0xFE,0x70,0x0F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x82,0x00,0xFE,0x78,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x80,0x00,0x7E,0x38,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x00,0x00,0x7F,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x02,0x00,0x7F,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x06,0x08,0x3F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x06,0x00,0x3F,0x8F,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x06,0x00,0x3F,0x87,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x00,0x00,0x03,0x97,0xBF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x9F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xFD,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/**************************************/
//延时函数
/**************************************/
voidDelay_nms(ucharn)
{
uchari;
ucharj;
for(i=0;ifor(j=0;j<125;j++)//大概1ms
_nop_();
}
/**************************************/
//串行发送一个字节
/**************************************/
voidLCD_sendbyte(ucharbyte)
{
uchari;
for(i=0;i<8;i++)
{
LCD_SCLK=0;//拉低时钟线
_nop_();
LCD_SID=(bit)(byte&0x80);//发送最高位数据
LCD_SCLK=1;//上升沿发送数据
byte=byte<<1;//左移一位
}
}
/****************************************/
//写指令
/****************************************/
voidLCD_write_com(ucharcom)
{
LCD_CS=1;
LCD_sendbyte(0xf8);//送入5个连续的“1“,启动一个周期,11111,RW(0),RS(0),0
LCD_sendbyte(0xf0&com);//取高四位,数据分两次传送,
//每个字节的内容被送入两个字节
//高四位放在第一个字节的高四位
LCD_sendbyte(0xf0&(com<<4));//低四位放在第二个字节的高四位
LCD_CS=0;
Delay_nms(10);//串行不支持读操作,不可检测忙操作,这里用延时替代
}
/******************************************/
//写数据
/******************************************/
voidLCD_write_dat(uchardat)
{
LCD_CS=1;
LCD_sendbyte(0xfa);//送入5个连续的“1“,启动一个周期,11111,RW(0),RS
(1),0
LCD_sendbyte(0xf0&dat);//取高四位,数据分两次传送,
//每个字节的内容被送入两个字节
//高四位放在第一个字节的高四位
LCD_sendbyte(0xf0&(dat<<4));//低四位放在第二个字节
LCD_CS=0;
Delay_nms(10);
}
/********************************************/
//LCD初始化
/********************************************/
voidLCD_init(void)
{
LCD_write_com(0x30);//选择基本指令集
LCD_write_com(0x0c);//开显示,无游标,不反白
LCD_write_com(0x01);//清除显示屏幕,把DDRAM位址计数器调整为00H
Delay_nms(5);//清屏操作时间较长1.6ms因此加此延时
LCD_write_com(0x02);//清DDRAM位址归位,此处貌似与清屏重复
LCD_write_com(0x06);//设定光标右移,整体显示不移动
}
/*************************************************/
//显示字符串
/*************************************************/
voidprint(uchar*s)
{
while(*s!
='\0')
{
LCD_write_dat(*s);
s++;
}
}
/***************************************************/
//设置显示地址
/***************************************************/
voidLCD_Setaddress(ucharx,uchary)
{//地址从第1行第1列开始不从0开始
ucharaddr;
switch(x)
{
case1:
addr=0x80+y-1;
break;
case2:
addr=0x90+y-1;
break;
case3:
addr=0x88+y-1;
break;
case4:
addr=0x98+y-1;
break;
default:
break;
}
LCD_write_com(addr);//字符显示开始地址
}
/*****************************************************/
//让字符串显示在固定位置,设置(x,y)的位置,调用上面的函数
/*****************************************************/
voidLCD_Putstring(ucharx,uchary,uchar*pData)
{
LCD_Setaddress(x,y);
while(*pData!
='\0')
{
LCD_write_dat(*pData++);
}
}
/*----------------------------------------------------------------------------------------------------------------------*/
//打点绘图,适用于在屏幕上打稀疏的几个点,不能用于横行连续打点
voidLCD_draw_point(ucharx,uchary)
{
ucharx_byte,x_bit;//在横坐标的哪一个字节,哪一个位
uchary_byte,y_bit;//在纵坐标的哪一个字节,哪一个位
x_byte=x/16;//算出它在哪一个字节(地址)
//注意一个地址是16位的
x_bit=x%16;//(取模)算出它在哪一个位
y_byte=y/32;//y是没在哪个字节这个说法
//这里只是确定它在上半屏(32行为一屏)还是下半屏
//0:
上半屏1:
下半屏
y_bit=y%32;//y_bit确定它是在第几行
LCD_write_com(0x34);//打开扩展指令集
LCD_write_com(0x80+y_bit);//垂直地址(上)貌似与说明书正好相反
LCD_write_com(0x80+x_byte+8*y_byte);//先写水平坐标(下)貌似与说明书正好相反
//具体参照数据手册
//下半屏的水平坐标起始地址为0x88
//(+8*y_byte)就是用来确定在上半屏还是下半屏
if(x_bit<8)//如果x_bit位数小于8
{
LCD_write_dat(0x01<<(7-x_bit));//写高字节。
因为坐标是从左向右的
//而GDRAM高位在左,低位在右
LCD_write_dat(0x00);//低字节全部填0
}
else
{
LCD_write_dat(0x00);//高字节全部填0
LCD_write_dat(0x01<<(15-x_bit));
}
LCD_write_com(0x36);//打开绘图显示
LCD_write_com(0x30);//回到基本指令集
}
/************************************/
//打点绘图一次打水平一行可以避免断点现象
//x表示数组的首