LCD12864绘图之KS01085.docx
- 文档编号:4121335
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:34
- 大小:76.32KB
LCD12864绘图之KS01085.docx
《LCD12864绘图之KS01085.docx》由会员分享,可在线阅读,更多相关《LCD12864绘图之KS01085.docx(34页珍藏版)》请在冰豆网上搜索。
LCD12864绘图之KS01085
LCD12864绘图之KS0108(5)
Ampire12864显示指针时钟
贵州省凯里市第一中等职业技术学校
机电部电子应用专业高级教师杨正富
仿真局部大图:
仿真全图:
/***************************************************************************************
说明:
1、程序共分六部分。
一个主C程序,五个头文件程序。
2、构成:
AT89C52+DS1302+DS18B20+Ampire128x64+Speaker
3、显示:
日期,星期,时间,气温
4、调整:
设置三个按键,用于调节日期,星期,时间。
5、程序不够完善,请有志者自行修改补充。
***************************************************************************************/
//////////////////////////////////////////////////////////////1////////////////////////////////////////////////////////////////////////////////
//C程序:
负责调用与整合其他程序模块功能
#include"Hzimo.h"//字模头文件
#include"DS1302.h"//时钟读写头文件
#include"DS18B20.h"//温度传感器操作头文件
#include"KS0108.h"//液晶显示操作头文件
#include"keyscan.h"//键盘调整操作头文件
voidpointer_Update()//指针的绘制与擦除(等比分点)
{
ucharS,M,H;//定义秒分时寄存变量,用于时间判断
if(S!
=DT[0])//秒时间跳变
{
CLKpointer_show(31,31,S,25,0);//秒针线擦除
S=DT[0];//指向下一次的时间
}
CLKpointer_show(31,31,S,25,1);
if(M!
=DT[1])//分时间跳变
{
CLKpointer_show(31,31,M,20,0);//分针线擦除
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
#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_RS=0;//选择指令寄存器
lcd_RW=0;//选择写入方式
P0=cmdcode;//指令送总线
delay_us
(2);//延时,待指令数据稳定
lcd_EN=1;//使能写入
delay_us
(2);//延时以确保写入完整
lcd_EN=0;//停止写入
}
//写数据到LCD程序
voidwrite_data(ucharlcddata)
{
check_busy();//检测LCD是否忙
lcd_RS=1;//选择数据寄存器
lcd_RW=0;//选择写入方式
P0=lcddata;//数据送总线
delay_us
(2);//延时,待数据稳定
lcd_EN=1;//使能写入
delay_us
(2);//延时,确保写入完整
lcd_EN=0;//停止写入
}
//从LCD读数据
ucharread_data()
{
ucharlcdat;//定义读数变量
check_busy();//检测LCD是否忙
lcd_RS=1;//选择数据寄存器
lcd_RW=1;//选择读取方式
lcd_EN=0;//准备读
lcd_EN=1;//使能输出
delay_us
(2);//延时,待数据稳定
lcdat=DATA;//读取端口值
delay_us
(2);//延时,确保读完整
lcd_EN=0;//停止Y读取
returnlcdat;//返回数据值
}
//左右屏选择,
voidselect_scr(ucharss)
{
switch(ss)//依据选屏参数判断
{
case0:
lcd_CS1=0;lcd_CS2=0;break;//选中全屏操作
case1:
lcd_CS1=0;lcd_CS2=1;break;//选中左屏操作
case2:
lcd_CS1=1;lcd_CS2=0;break;//选中右屏操作
case3:
lcd_CS1=1;lcd_CS2=1;break;//左右屏无操作
}
}
//清除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初始化程序
{
check_busy();//检测LCD是否忙
select_scr(ss);//选择屏幕
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;//变量:
汉字数,页,列
select_scr(ss);//选择屏幕
for(k=0;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;//变量: 页,列,字符数 select_scr(ss);//选择屏幕 for(k=0;k { for(i=0;i<2;i++)//每个字符占2页,所以写2次 { write_com(0xb8+page+i);//写入显示页地址(pag,pag+1) write_com(0x40+column+8*k);//写入显示列地址(起始列) for(j=0;j<8;j++)//连续8次 write_data(szk[0][8*i+j]);//写入8个字节数据 } } } //半屏图像显示函数(带参数: 屏,页,列,数据) voidpicture_disp12(ucharss,ucharpage,ucharcolumn,uchartable[8][64]) { uchari,j;//页,列变量 select_scr(ss);//选择屏 if(column>=64)//如果列地址大于等于64 column=column-64;//列首地址仍从0x40开始显示 for(i=0;i<8;i++)//分8页写入 { write_com(0xb8+page+i);//写页地址 write_com(0x40+column);//写列地址 for(j=0;j<64;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;//循环变量 for(j=0;j<8;j++)dat[j]=0x00;//数组元素赋初值0x00 if(x<64)//列坐标小于64 select_scr (1);//选择左半屏 else//列坐标大于等于64 {select_scr (2);x-=64;}//选择右半屏,列坐标调整为0~63 for(j=1;j<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//如果要擦除点 { dat[y>>3]&=~(0x01<<(y&0x07));//y值所在页对应字节位置0 Byte[j]&=dat[j];//修正原读数("与"运算) } write_com(0x40+x);//重写列地址(因读数而改变) 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;//如果dx<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,首次判断下个点的位置 for(i=0;i { 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