LCD12864 串行方式画sin直线显示图像Word格式文档下载.docx
《LCD12864 串行方式画sin直线显示图像Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《LCD12864 串行方式画sin直线显示图像Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
//端口定义
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,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;
i<
n;
i++)
for(j=0;
j<
125;
j++)//大概1ms
_nop_();
}
//串行发送一个字节
voidLCD_sendbyte(ucharbyte)
8;
{
LCD_SCLK=0;
//拉低时钟线
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);
//取高四位,数据分两次传送,
//每个字节的内容被送入两个字节
//高四位放在第一个字节的高四位
(com<
4));
//低四位放在第二个字节的高四位
LCD_CS=0;
Delay_nms(10);
//串行不支持读操作,不可检测忙操作,这里用延时替代
/******************************************/
//写数据
voidLCD_write_dat(uchardat)
LCD_sendbyte(0xfa);
//送入5个连续的“1“,启动一个周期,11111,RW(0),RS
(1),0
dat);
(dat<
//低四位放在第二个字节
/********************************************/
//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;
case3:
addr=0x88+y-1;
case4:
addr=0x98+y-1;
default:
break;
LCD_write_com(addr);
//字符显示开始地址
/*****************************************************/
//让字符串显示在固定位置,设置(x,y)的位置,调用上面的函数
voidLCD_Putstring(ucharx,uchary,uchar*pData)
LCD_Setaddress(x,y);
while(*pData!
='
)
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
//高字节全部填0
(15-x_bit));
}
LCD_write_com(0x36);
//打开绘图显示
//回到基本指令集
/************************************/
//打点绘图一次打水平一行可以避免断点现象
//x表示数组的首