LCD12864绘图之KS01085Word文档格式.docx
- 文档编号:17037351
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:34
- 大小:76.32KB
LCD12864绘图之KS01085Word文档格式.docx
《LCD12864绘图之KS01085Word文档格式.docx》由会员分享,可在线阅读,更多相关《LCD12864绘图之KS01085Word文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
M=DT[1];
//指向下一次的时间
CLKpointer_show(31,31,M,20,1);
if(DT[2]<
12)
DT[2]=DT[2]*5+DT[1]/12;
//用于计算时针的终点坐标
else
{DT[2]=DT[2]-12;
DT[2]=DT[2]*5+DT[1]/12;
}
if(H!
=DT[2])//时间是否跳变
CLKpointer_show(31,31,H,15,0);
//时针线擦除
H=DT[2];
CLKpointer_show(31,31,H,15,1);
}
voidfixed_display()//固定显示(按页,列,字码,字数定位)
sz_Disp1(2,0,16,num[11],1);
//右屏0页第16列显示'
-'
sz_Disp1(2,0,40,num[11],1);
//右屏0页第40列显示'
hz_Disp16(2,2,0,HZ[8],2);
//右屏2页第0列显示"
星期"
sz_Disp1(2,2,32,num[10],2);
//右屏2页第32列填充黑块"
■"
2个
sz_Disp1(2,4,16,num[12],1);
//右屏4页第16列显示'
:
'
sz_Disp1(2,4,40,num[12],1);
//右屏4页第40列显示'
hz_Disp16(2,6,0,HZ[10],2);
//右屏6页第0列显示"
气温"
hz_Disp16(2,6,48,HZ[0],1);
//右屏6页第48列显示"
℃"
picture_disp12(1,0,0,&
clock);
//左屏显示表盘与刻度
voiddynamic_display()//动态显示(随时更新的数值)
sz_Disp1(2,0,0,num[DT[6]/10],1);
//右屏0页第0列显示'
年十位'
sz_Disp1(2,0,8,num[DT[6]%10],1);
//右屏0页第8列显示'
年个位'
sz_Disp1(2,0,24,num[DT[4]/10],1);
//右屏0页第24列显示'
月十位'
sz_Disp1(2,0,32,num[DT[4]%10],1);
//右屏0页第32列显示'
月个位'
sz_Disp1(2,0,48,num[DT[3]/10],1);
//右屏0页第48列显示'
日十位'
sz_Disp1(2,0,56,num[DT[3]%10],1);
//右屏0页第56列显示'
日个位'
hz_Disp16(2,2,48,HZ[DT[5]],1);
//右屏2页第48列显示"
星期值"
sz_Disp1(2,4,0,num[DT[2]/10],1);
//右屏4页第0列显示'
时十位'
sz_Disp1(2,4,8,num[DT[2]%10],1);
//右屏4页第8列显示'
时个位'
sz_Disp1(2,4,24,num[DT[1]/10],1);
//右屏4页第24列显示'
分十位'
sz_Disp1(2,4,32,num[DT[1]%10],1);
//右屏4页第32列显示'
分个位'
sz_Disp1(2,4,48,num[DT[0]/10],1);
//右屏4页第48列显示'
秒十位'
sz_Disp1(2,4,56,num[DT[0]%10],1);
//右屏4页第56列显示'
秒个位'
if(key1n==0)//如果K1键计次值为0
{//注:
此位置兼作调整提示显示
sz_Disp1(2,6,32,num[Temp/10],1);
//右屏6页第32列显示'
温度十位'
sz_Disp1(2,6,40,num[Temp%10],1);
//右屏6页第40列显示'
温度个位'
}
pointer_Update();
//左右屏指针显示与擦除
voidmain(void)
init_lcd(0);
//LCD初始化
//Set_1302(DT);
//设置DS1302初始时间
fixed_display();
//固定显示(无须改变的内容)
while
(1)//无限循环
{
Get_1302(DT);
//读取DS1302实时数据值
Temp=ReadTemperature();
//获取DS18B20实时温度
dynamic_display();
//动态显示(随时更新的数值)
keyscan();
//键盘扫描程序调用
//////////////////////////////////////////////////////////////2/////////////////////////////////////////////////////////////////////////////
//LCD-KS0108.h
#include<
reg52.h>
//52系列单片机头文件
#include"
math.h"
#defineuintunsignedint//无符号整型变量宏定义
#defineucharunsignedchar//无符号字符变量宏定义
#definePI3.1415926//圆周率
//LCD端口定义
#defineDATAP0//数据线为P0口
sbitlcd_RS=P2^0;
//数据/命令选择(RS)
sbitlcd_RW=P2^1;
//读/写选择
sbitlcd_EN=P2^2;
//读写使能
sbitlcd_CS1=P2^3;
//当lcd_CS1=0左半屏可操作
sbitlcd_CS2=P2^4;
//当lcd_CS2=0右半屏可操作
sbitlcd_RST=P2^5;
//复位脚
//基本操作:
//程序延时,用于LCD读写数据,以及初始化
voiddelay_us(uintt)//us级延时程序
for(;
t>
0;
t--);
//状态检查,LCD是否忙
voidcheck_busy()
uchardat;
//状态信息(判断是否忙)
lcd_RS=0;
//选择指令寄存器
lcd_RW=1;
//选择读取方式
do//按以下操作
DATA=0x00;
//数据总线置0
lcd_EN=1;
//使能读出,状态值送总线
delay_us
(2);
//延时,等待数据稳定
dat=DATA;
//读取总线并赋予变量
lcd_EN=0;
//停止读取
dat=0x80&
dat;
//仅当第7位为0时才可操作(判别busy信号)
while(!
(dat==0x00));
//若busy不为0,则循环;
为0则结束
//写命令cmdcode到LCD程序
voidwrite_com(ucharcmdcode)
check_busy();
//检测LCD是否忙
//选择指令寄存器
lcd_RW=0;
//选择写入方式
P0=cmdcode;
//指令送总线
delay_us
(2);
//延时,待指令数据稳定
lcd_EN=1;
//使能写入
//延时以确保写入完整
lcd_EN=0;
//停止写入
//写数据到LCD程序
voidwrite_data(ucharlcddata)
lcd_RS=1;
//选择数据寄存器
P0=lcddata;
//数据送总线
//延时,待数据稳定
//延时,确保写入完整
//从LCD读数据
ucharread_data()
ucharlcdat;
//定义读数变量
//选择读取方式
//准备读
//使能输出
lcdat=DATA;
//读取端口值
//延时,确保读完整
//停止Y读取
returnlcdat;
//返回数据值
//左右屏选择,
voidselect_scr(ucharss)
switch(ss)//依据选屏参数判断
case0:
lcd_CS1=0;
lcd_CS2=0;
break;
//选中全屏操作
case1:
lcd_CS2=1;
//选中左屏操作
case2:
lcd_CS1=1;
//选中右屏操作
case3:
//左右屏无操作
//清除LCD内存程序,
voidClr_Scr(ucharss)//清理屏幕显示
ucharj,k;
//定义页,列变量
select_scr(ss);
//选择屏幕
for(k=0;
k<
8;
k++)//控制页数0-7,共8页
{
write_com(0xb8+k);
//写入页地址
for(j=0;
j<
64;
j++)//控制列数0-63,列地址自动加1
write_com(0x40+j);
//写入列地址
write_data(0x00);
//写入空白内容,
}
//初始化LCD(不同的应用,初始化方法不同)
voidinit_lcd(ucharss)//LCD初始化程序
Clr_Scr(ss);
//LCD清屏幕显示
write_com(0x3e);
//关显示
write_com(0xb8+0);
//设置:
起始页地址
write_com(0xc0+0);
起始行地址
write_com(0x40+0);
起始列地址
write_com(0x3f);
//开显示
//显示操作:
//指定地址按行显示编码数组hzk[][32]中连续的1~4个汉字(16*16)
//参数:
ss=0~2;
page=0~7;
col=0~63;
hzk——hzk[][32];
n=1~4
voidhz_Disp16(ucharss,ucharpage,ucharcolumn,ucharhzk[][32],ucharn)
uchark,p,c;
//变量:
汉字数,页,列
for(k=0;
n;
k++)//按汉字个数循环写入
for(p=0;
p<
2;
p++)//每个字符占2页,所以写2次
write_com(0xb8+page+p);
//写入显示页地址(page,page+1)
write_com(0x40+column+16*k);
//写入显示列地址(起始列,0~16~32~48)
for(c=0;
c<
16;
c++)//连续16次(上,下半字各16个编码)
write_data(hzk[k][16*p+c]);
//每页写入16个字节的汉字编码数据
//重复显示二维数组szk[][16]中相同字符1~8次
voidsz_Disp1(ucharss,ucharpage,ucharcolumn,ucharszk[][16],ucharn)
{//参数:
屏,页、列、码、字符数
uchari=0,j=0,k=0;
//变量:
页,列,字符数
k++)
for(i=0;
i<
i++)//每个字符占2页,所以写2次
write_com(0xb8+page+i);
//写入显示页地址(pag,pag+1)
write_com(0x40+column+8*k);
//写入显示列地址(起始列)
j++)//连续8次
write_data(szk[0][8*i+j]);
//写入8个字节数据
//半屏图像显示函数(带参数:
屏,页,列,数据)
voidpicture_disp12(ucharss,ucharpage,ucharcolumn,uchartable[8][64])
uchari,j;
//页,列变量
//选择屏
if(column>
=64)//如果列地址大于等于64
column=column-64;
//列首地址仍从0x40开始显示
for(i=0;
i++)//分8页写入
write_com(0xb8+page+i);
//写页地址
write_com(0x40+column);
//写列地址
for(j=0;
j++)//依次写入0~63列
write_data(table[i][j]);
//写图像数据
//绘图操作:
//反白功能打点函数,任意指定坐标画点color=1,黑;
color=0,白
voidLCD_DrawDot(ucharx,uchary,ucharcolor)//x水平坐标,y垂直坐标,color显示颜色
{
chardat[8],Byte[8];
//定义列字节数组
ucharj;
//循环变量
j++)dat[j]=0x00;
//数组元素赋初值0x00
if(x<
64)//列坐标小于64
select_scr
(1);
//选择左半屏
else//列坐标大于等于64
{select_scr
(2);
x-=64;
}//选择右半屏,列坐标调整为0~63
for(j=1;
7;
j++)//每屏8页(0~7),8个字节
write_com(0xb8+j);
//写页地址
write_com(0x40+x);
//写列地址
read_data();
//空读一次
Byte[j]=read_data();
//读出一字节数据
if(color)//如果要显示点
dat[y>
>
3]|=0x01<
<
(y&
0x07);
//y值所在页对应字节位置1
Byte[j]|=dat[j];
//修正原读数("
或"
运算)
}
else//如果要擦除点
3]&
=~(0x01<
0x07));
//y值所在页对应字节位置0
Byte[j]&
=dat[j];
与"
//重写列地址(因读数而改变)
write_data(Byte[j]);
//写入修正后的字节数据
//在指定位置上画线(x0,y0)——(x1,y1);
color——0白,1黑
voidLCD_DrawLine_R(ucharx0,uchary0,ucharx1,uchary1,ucharcolor)
//在bresenham算法当中,全部以整数来运算,提升运算速度
inttemp;
intdx,dy;
//定义起点到终点的横、纵坐标增加值
ints1,s2,status,i;
//x轴步长,y轴步长,偏移状态,循环变量
intDx,Dy,sub;
//sub用于判断下一个点的位置
dx=x1-x0;
//计算横坐标差值
if(dx>
=0)s1=1;
//如果dx>
=0,从x0到x1是增加的,步长值取+1
elses1=-1;
//如果dx<
0,从x0到x1是减小的,步长值取-1
dy=y1-y0;
//计算纵坐标差值
if(dy>
=0)s2=1;
//如果dy>
=0,从y0到y1是增加的,步长值取+1
elses2=-1;
0,从y0到y1是减小的,步长值取-1
//纵坐标增加的多,直线偏向Y轴,横坐标增加的多则偏向X轴
//以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0
Dx=abs(x1-x0);
//计算横坐标增加值的绝对值
Dy=abs(y1-y0);
//计算纵坐标增加值的绝对值
if(Dy>
Dx)//如果dy>
dx
temp=Dx;
Dx=Dy;
Dy=temp;
//交换DX,DY的值
status=1;
//靠近Y轴,偏移状态置1
elsestatus=0;
//如果dx>
dy,靠近X轴,偏移状态置0
//Bresenham算法画任意两点间的直线
sub=Dy+Dy-Dx;
//计算sub,首次判断下个点的位置
Dx;
i++)//循环dx次
if(sub>
=0)//如果下个点在起点下方
if(status==1)x0+=s1;
//在靠近Y轴区,x值加1
elsey0+=s2;
//在靠近X轴区,y值加1
sub-=(Dx+Dx);
//再判断下一个点的位置
if(status==1)y0+=s2;
//在靠近Y轴区,y值加1
elsex0+=s1;
//在靠近X轴区,x值加1
LCD_DrawDot(x0,y0,color);
//根据x0,y0的变化逐个画点
sub+=Dy+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD12864 绘图 KS01085
![提示](https://static.bdocx.com/images/bang_tan.gif)