基于51单片机的LCD12864程序设计
- 格式:pdf
- 大小:163.32 KB
- 文档页数:2
#include <reg51.h>#define unchar unsigned char #define unint unsigned intsbit RS=P2^7;sbit RW=P2^6;sbit E=P2^5;void delay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}void busy(){RS=0;RW=1;E=1;P0=0xff;while((P0&0X80)==0x80); }void write_com(unchar com) {busy();RS=0;RW=0;E=1;P0=com;delay(5);E=0;delay(5);}void write_date(unchar date) {busy();RS=1;RW=0;E=1;P0=date;// delay(5);E=0;// delay(5);}void init(){delay(2000);write_com(0x30); //选择基本指令,选择8位数据流delay(5);write_com(0x0c); //开显示(无游标,不反白)delay(10);write_com(0x01); //清除显示,并且设定地址指针为00H delay(500);write_com(0x06);// 设定游标移动方向}void sendaddr(unchar n,unchar m){switch(n){case 1:write_com(0x80+m);break;case 2:write_com(0x90+m);break;case 3:write_com(0x88+m);break;case 4:write_com(0x98+m);break;}}void display(unchar n,unchar m,unchar *s){sendaddr(n,m);while(*s>0){write_date(*s);s++;delay(100);}}void main(){unchar *s;init();s="甲:“我来了”";display(1,0,s);s="乙:“热烈欢迎。
目录设计总说明 (I)INTRODUCTION (II)1 绪论 (1)1.1课题背景及研究意义 (1)1.2课题研究的主要内容 (1)1.3国内外发展状况与存在问题 (1)2 总体方案设计与论述 (2)2.1 系统需求分析 (2)2.2 系统总体方案设计 (2)2.2.1 设计方案论证 (2)2.2.2总体结构框图 (3)3系统单元模块设计 (3)3.1系统硬件示意图 (3)3.2主控芯片(STC89C52模块)[5] (4)3.3 时钟控制模块[13] (6)3.3.1 DS1302简介 (6)3.3.2引脚及功能表 (7)3.3.3工作原理 (7)3.3.4 DS1302电路设计图[9] (8)3.4 温度控制模块 (8)3.5 12864接口电路模块 (9)3.6 按键电路模块 (9)3.7 电源电路模块 (10)3.8 印制电路板[9] (10)4系统整体调试与结果分析 (11)4.1 系统总体程序流程介绍 (11)4.2 按键程序设计 (13)4.3 12864驱动程序设计[15] (14)4.3.1 ST7920芯片介绍[14] (14)4.3.2 ST7920驱动程序设计 (17)4.4 12864应用程序设计 (20)4.4.1 文字显示程序设计 (20)4.4.2 点、线显示程序设计 (22)4.4.3 图形、图片显示程序设计 (23)4.5 菜单程序设计 (26)5设计调试及进一步研究 (28)5.1 系统测试 (28)5.1.1 软件调试 (28)5.1.2 硬件调试 (29)5.2 进一步研究的工作 (30)6总结 (30)鸣谢................................................................................................................................ 错误!未定义书签。
#include <reg52.h>#ifndef __LCD12864_H__#define __LCD12864_H__#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*端口定义*/#define LCD_data P0 //数据口sbit LCD_RS = P2^7; //寄存器选择输入sbit LCD_RW = P2^6; //液晶读/写控制sbit LCD_EN = P2^5; //液晶使能控制sbit LCD_PSB = P1^4; //串/并方式控制#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};/* 延时函数*/void delay1(int ms){while(ms--){uchar i;for(i=0;i<250;i++){_nop_();_nop_();_nop_();_nop_();}}}/*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/ bit lcd_busy(){bit result;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=指令码。
*/ void lcd_wcmd(uchar cmd){//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=数据。
#include<reg52.h>#include"zifuku.h"#define uchar unsigned char#define uint unsigned intsbit di =P2^0; //指令sbit rw =P2^1; // Write or Read,Hread,Lwrite sbit e =P2^2; // 读写使能sbit cs1=P2^3 // cs1=L,选择左边屏sbit rst=P2^6;// Lcm reset,低有效sbit cs2=P2^4; //cs2=L,选择中间屏sbit cs3=P2^5; // cs3=L,选择右边屏sbit bf =P1^7;sbit res=P1^4;void delay(uint us){while(us--);}void delay1(uint ms){uint i,j;for(i=0;i<ms;i++)for(j=0;j<1000;j++);}void write_com(uchar comm){rw=0;di=0;e=1;P1=comm;e=0;}void write_date(uchar dat){rw=0;di=1;e=1;P1=dat;e=0;}void lat_disp(uchar date1,uchar date2){uchar i,j;cs1=1;cs2=1;write_com(0x3f);for(j=0;j<8;j++){write_com(0xb8+j);write_com(0xc0);write_com(0x40);for(i=0;i<32;i++){write_date(date1);write_date(date2);}}}void vshowcustomrow(uchar ucpage,uchar ucline,uchar width,uchar *uca) {uchar count;if(ucline<64){cs1=1;cs2=0;write_com(0x3f);write_com(0xb8+ucpage);write_com(0xc0);write_com(0x40+ucline);{for(count=0;count<width;count++) write_date(*(uca+count));}}else{cs1=0;cs2=1;write_com(0x3f);write_com(0xb8+ucpage);write_com(0x40);write_com(0x40+ucline-64);for(count=0;count<width;count++) write_date(*(uca+count));}}void vshowonechin(uchar ucpage,uchar ucline,uchar *uca){vshowcustomrow(ucpage,ucline ,16,uca);vshowcustomrow(ucpage+1,ucline,16,uca+16);}void vshowonechar(uchar ucpage,uchar ucline,uchar *uca){vshowcustomrow(ucpage,ucline,8,uca);vshowcustomrow(ucpage+1,ucline,8,uca+8);}void vshowgraph(uchar ucpage,uchar ucline,uchar width,uchar high,uchar *uca) {uchar count;for(count=0;count<high;count++){vshowcustomrow(ucpage+count,ucline,width,uca+count*width);}}/*---------------显示1-----------------*/void disp1 (void){lat_disp(0x00,0x00);vshowonechin(0,0,uca_xiao);vshowonechin(0,16,uca_yun);vshowonechin(0,32,uca_ke);vshowonechin(0,48,uca_ji);vshowonechin(0,64,uca_you);vshowonechin(0,80,uca_xian);vshowonechin(0,96,uca_gong);vshowonechin(0,112,uca_si);vshowonechin(2,0,uca_xiao);vshowonechin(2,16,uca_yun);vshowonechin(2,32,uca_pai);vshowonechin(2,48,uca_ye); vshowonechin(2,64,uca_jing); vshowonechin(2,80,uca_xian1); vshowonechin(2,96,uca_shi); vshowonechin(2,112,uca_ping);vshowonechin(4,16,uca_huan); vshowonechin(4,32,uca_ying); vshowonechin(4,48,uca_ni); vshowonechin(4,64,uca_de); vshowonechin(4,80,uca_jia); vshowonechin(4,96,uca_meng);vshowonechar(6,0,uca_T); vshowonechar(6,8,uca_E); vshowonechar(6,16,uca_L); vshowonechar(6,24,uca_maohao);vshowonechar(6,32,uca_yi); vshowonechar(6,40,uca_san); vshowonechar(6,48,uca_qiu); vshowonechar(6,56,uca_er); vshowonechar(6,64,uca_zero); vshowonechar(6,72,uca_er); vshowonechar(6,80,uca_qiu); vshowonechar(6,88,uca_yi); vshowonechar(6,96,uca_ba); vshowonechar(6,104,uca_ba); vshowonechar(6,112,uca_er);}void disp2(void){ lat_disp(0x00,0x00); vshowgraph(2,32,32,4,uca_Pig); }void lcd_initilize(void){rst=0;delay(50);rst=1;write_com(0x3e);write_com(0x3f);}void main(){lcd_initilize();while(1){disp1();delay1(400);lat_disp(0xff,0x00);delay1(400);disp2();delay1(400);}}#include<reg52.h>unsigned char code uca_xiao[]={/*-- 文字: 小--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xC0,0x70,0x20,0x00,0xFF,0x00,0x10,0x20,0xC0,0x80,0x00,0x00,0x00, 0x04,0x02,0x01,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x01,0x07,0x02,0x00, };unsigned char code uca_yun[]={/*-- 文字: 芸--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x04,0x24,0x24,0x3F,0x24,0x24,0x24,0x24,0x3F,0x24,0x24,0x04,0x04,0x00, 0x01,0x01,0x41,0x61,0x51,0x49,0x47,0x65,0x21,0x21,0x25,0x29,0x71,0x21,0x01,0x00,};unsigned char code uca_ke[]={/*-- 文字: 科--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00, 0x04,0x02,0x01,0x00,0xFF,0x00,0x04,0x04,0x04,0x02,0x02,0x02,0xFF,0x01,0x01,0x00, };unsigned char code uca_ji[]={/*-- 文字: 技--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x00,0x01,0x41,0x80,0x7F,0x00,0x40,0x40,0x20,0x13,0x0C,0x0C,0x12,0x21,0x60,0x20,0x00, };unsigned char code uca_you[]={/*-- 文字: 有--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x84,0x44,0xE4,0x34,0x2C,0x27,0x24,0x24,0x24,0xE4,0x04,0x04,0x04,0x00,0x02,0x01,0x00,0x00,0xFF,0x09,0x09,0x09,0x29,0x49,0xC9,0x7F,0x00,0x00,0x00,0x00, };unsigned char code uca_xian[]={/*-- 文字: 限--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0xFE,0x02,0x32,0x4E,0x82,0x00,0xFE,0x4A,0xCA,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00, 0xFF,0x00,0x02,0x04,0x03,0x00,0xFF,0x40,0x20,0x03,0x0C,0x12,0x21,0x60,0x20,0x00, };unsigned char code uca_gong[]={/*-- 文字: 公--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x30,0x0E,0x84,0x00,0x00,0x0E,0x10,0x60,0xC0,0x80,0x80,0x00,0x00,0x01,0x20,0x70,0x28,0x24,0x23,0x31,0x10,0x10,0x14,0x78,0x30,0x01,0x00,0x00, };unsigned char code uca_si[]={/*-- 文字: 司--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x10,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x0F,0x00,0x20,0x40,0x3F,0x00,0x00, };unsigned char code uca_da[]={/*-- 文字: 大--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00, };unsigned char code uca_pai[]={/*-- 文字: 牌--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x90,0x90,0x9F,0x10,0x00,0xFE,0x92,0xD3,0xBE,0x92,0x92,0xFE,0x00,0x00, 0x40,0x3F,0x00,0x00,0x7F,0x04,0x04,0x06,0x05,0x04,0xFF,0x04,0x04,0x05,0x04,0x00, };unsigned char code uca_ye[]={/*-- 文字: 液--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00,0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00, };unsigned char code uca_jing[]={/*-- 文字: 晶--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00, 0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00, };unsigned char code uca_xian1[]={/*-- 文字: 显--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, 0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, };unsigned char code uca_shi[]={/*-- 文字: 示--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00,0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, };unsigned char code uca_ping[]={/*-- 文字: 屏--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFF,0x09,0x49,0x59,0xE9,0x49,0x49,0x49,0xE9,0x59,0x49,0x4F,0x00,0x00, 0x40,0x30,0x0F,0x82,0x42,0x32,0x0F,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x00, };unsigned char code uca_huan[]={/*-- 文字: 欢--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00, 0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00, };unsigned char code uca_ying[]={/*-- 文字: 迎--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00, 0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00, };unsigned char code uca_ni[]={/*-- 文字: 你--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0xF0,0x2C,0x43,0x20,0x98,0x0F,0x0A,0xE8,0x08,0x88,0x28,0x1C,0x08,0x00, 0x00,0x00,0x7F,0x00,0x10,0x0C,0x03,0x21,0x40,0x3F,0x00,0x00,0x03,0x1C,0x08,0x00, };unsigned char code uca_de[]={/*-- 文字: 的--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00, 0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00, };unsigned char code uca_jia[]={/*-- 文字: 加--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x08,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x20,0x40,0x3F,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00, };unsigned char code uca_meng[]={/*-- 文字: 盟--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x92,0x92,0x92,0xFE,0x00,0x80,0x7E,0x2A,0x2A,0x2A,0x2A,0xFE,0x00,0x00, 0x40,0x40,0x7C,0x44,0x44,0x7C,0x46,0x45,0x44,0x7C,0x44,0x45,0x7E,0x41,0x40,0x00, };unsigned char code uca_T[]={/*-- 文字: T --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00, };unsigned char code uca_E[]={/*-- 文字: E --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, };unsigned char code uca_L[]={/*-- 文字: L --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00, };unsigned char code uca_maohao[]={/*-- 文字: : --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, };unsigned char code uca_zero[]={/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,};unsigned char code uca_yi[]={/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, };unsigned char code uca_er[]={/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, };unsigned char code uca_san[]={/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, };unsigned char code uca_s[]={/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, };unsigned char code uca_wu[]={/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, };unsigned char code uca_liu[]={/*-- 文字: 6 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, };unsigned char code uca_qi[]={/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, };unsigned char code uca_ba[]={/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, };unsigned char code uca_qiu[]={/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, };unsigned char code uca_Pig[]={0x00,0x80,0x40,0x30,0x08,0x04,0x82,0x81,0x61,0x01,0x12,0x8A,0x89,0x11,0x01,0x05, 0x13,0x09,0x89,0x91,0x01,0x31,0xC2,0x0A,0x04,0x02,0x02,0x02,0x02,0x1C,0xE0,0x00, 0x06,0x05,0xC4,0x32,0x0A,0x05,0x82,0x41,0x20,0x26,0x49,0x50,0x5C,0xAD,0xA6,0xA0, 0x86,0x49,0x50,0x5C,0x8D,0x06,0x80,0x41,0x02,0x02,0x04,0x0C,0x34,0xC8,0x09,0x0E, 0x00,0x00,0x03,0x0C,0x10,0x20,0x43,0x54,0xA8,0xD0,0x90,0x26,0x26,0x40,0x40,0x4C, 0x4C,0x20,0x20,0x90,0x4C,0x03,0x83,0x84,0x40,0x40,0x20,0x30,0x0C,0x03,0x00,0x00,0xE0,0xF0,0xF8,0xDC,0x8E,0x03,0x1F,0x21,0x5C,0xB4,0x34,0x1D,0x0D,0x06,0x0E,0x0E, 0x06,0x0D,0x1D,0x35,0x35,0x1D,0x80,0x40,0x21,0x1F,0x03,0x8E,0xDC,0xF8,0xF0,0xE0} ;//图片。
LCD12864 液晶显示器模块化程序(51单片机)/**********************lcd12864.h 头文件**********************/#ifndef _LCD12864_H_#define _LCD12864_H_extern void lcd12864_busy(); //忙标志函数extern void led12864_clear();//清屏extern void lcd12864_init(); //初始化函数extern void lcd12864_pxy(unsigned char p,unsigned char x,unsigned char y);//数据的显示位置,p=0左半屏,p=1右半屏,p=2两半屏全选,xy为显示的坐标,第四象限,用正值表示。
extern void lcd12864_zifu(unsigned char p,unsigned char x,unsigned char,unsigned char m);//第m个字符的显示位置,与汉字的定义一样,只是xy的坐标的值应小于等于7.extern void lcd12864_hanzi(unsigned char p,unsigned char x,unsigned char y,unsigned char m);//第m个汉字的显示位置,p=0左半屏,p=1右半屏,p=2两半屏全选,xy为显示的坐标,第四象限,用正值表示,x或y的值都应小于等于3。
m为显示的第m个汉字。
#endif/**********************lcd12864.c 文件**********************/#include;#define uint unsigned int#define uchar unsigned charsbit cs2=P2^0;sbit cs1=P2^1;sbit e=P2^2;sbit rw=P2^3;sbit rs=P2^4;uchar code zifu[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,//,00x00,0x00,0x58,0x38,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,//。
基于51单片机的LCD12864程序设计作者:张玲玲来源:《中小企业管理与科技·上中下旬刊》 2015年第5期张玲玲(郴州职业技术学院电子信息工程专业)摘要液晶显示器分为段位式LCD、字符式LCD 和点阵式LCD,具有机身薄,节省空间,省电,不产生高温,低辐射,益健康,画面柔和不伤眼等诸多优点,已经广泛的应用于各个领域。
本文通过51 单片机控制系统控制点阵式LCD12864 显示来介绍LCD12864 的工作原理及LCD12864 的驱动程序设计编写方法。
关键词 51 单片机 LCD12864 程序设计0 引言液晶显示器根据显示方式可分为:段位式、字符式和点阵式LCD,其中段位式与字符式只能显示数字与字符。
而点阵式LCD 不仅能显示数字与字符,还能显示各种图形、曲线及汉字等。
本文研究的TG12864B是能显示曲线、图形及汉字的点阵式LCD。
1 TG12864 介绍TG12864 是一款无字库的图形点阵显示器,其屏幕由64 行×128 列点阵组成,可以显示16 点阵的4 行×8列(32 个)汉字、8 点阵的8 行×8 列(64 个)字母和128×64 全屏幕点阵图形。
1.1 TG12864B 内部功能器件介绍在使用TG12864B 前须了解其相关功能器件,如下所示:①指令寄存器(IR):用于寄存指令码。
②数据寄存器(DR):用于寄存数据的。
DR 和显示数据存储器DDRAM(见表1)之间的数据传输是模块内部自动执行的。
③显示数据RAM (DDRAM):DDRAM 是存储图形显示数据的。
数据为1 表示显示选择,数据为0 表示显示非选择。
DDRAM 与地址和显示位置的关系见DDRAM 地址表。
④XY 地址计数器。
XY 地址计数器是一个9 位计数器。
高3位是X 地址计数器,低6 位为Y 地址计数器,XY 地址计数器实际上是作为DDRAM 的地址指针,X 地址计数器为DDRAM 的页指针,Y 地址计数器为DDRAM 的Y 地址指针。
51单片机控制LCD12864液晶屏显示图形菜单想了很久,每次做菜单都受限于12864字符模式的各种限制,比如字体大小,不能显示图标等等,没有任何效果,这次就来个彻底的解脱,写一个单函数就能完成所有功能的函数,只需要2个图片就能完成任意菜单内容的菜单,可以有2的8次方=256个选择结果,应该能满足所有的要求了吧?菜单的内容就是图片的内容,因此可以显示任意大小的图形文字混合的菜单条目,比如使用字符模式,一屏只能显示4行菜单(64/16=4),且只能显示汉字和字符等,显示位置等等的都受限,而这个方法可以显示比如12*12(64/12=5行)的字符,8*8(64/8=8行)的字符,甚至不是字符,可以是图标+文字+任意其他的图像,只要是图片能显示的,都可以。
哈哈,比较复杂,现在只写了一少半,预期能够提供多种显示效果,希望我能完成。
void Lcd_Draw_BmpMenu(UINT8 *pMenu,UINT8*pTitleBmp,UINT8 *pMenuBmp){/*使用2张图片作为纯图形菜单来选择和操作,返回被选择的项,pMenu是一个指向菜单的各种参数的结构体的指针,pTitleBmp指向作为菜单标题的一张图片,pMenuBmp指向作为菜单内容的图片(液晶的控制芯片是ST7920)yx-->;>;|\|/*/xdata struct { //除非另有说明x坐标均为大列的坐标,一个大列是16个像素,一行共有8大列数据//========= 以下是入参基本参数,一旦确定,最好不要随意更改 ======UINT8 Title_x;//标题图片在屏幕上的显示起始位置X UINT8 Title_y;//标题图片在屏幕上的显示起始位置Y UINT8 Title_Len_x;//标题图片的宽UINT8 Title_Len_y;//标题图片的高UINT8 Menu_x;//菜单在屏幕上的显示起始位置XUINT8 Menu_y;//菜单在屏幕上的显示起始位置YUINT8 Menu_End_y;//菜单在屏幕上的显示结束位置Y UINT8 Menu_Bmp_x;//菜单图片的宽UINT8 Menu_Bmp_y;//菜单图片的高UINT8 Menu_Item_Height;//每一菜单项的高度(像素为单位)UINT8 Line_x;//最后下划线的起始坐标xUINT8 Line_y;//最后下划线的起始坐标YUINT8 Line_Len;//最后下划线的长度,如果为0,则表示不画出这条线(像素为单位)//====== 以下是菜单的风格设置 ========UINT8 Scroll_Speed;//菜单滚动的速度,0~9个级别,越低越快,越高越慢(液晶屏显示速度有快有慢,调整这个参数用于适用不同的液晶屏UINT8 Continue_Scroll;//指定菜单是否可以形成一个连续滚动选择的效果;0不连续,背景和反白位置都会根据实际情况滚动 1菜单连续滚动,反白位置不动UINT8 RePaint;//=0不重画菜单,=1重画整个菜单的图像,一般都是首次调用本函数的时候置1,用于画出整个菜单,以后调用置0就可以了UINT8 MenuEffect;//菜单运动的效果;0没有任何效果,只是最普通的菜单形态,1平滑滚动,2平滑滚动,具有惯性效果,3具有减速效果,没有惯性效果,4具有减速和惯性效果//====== 以下用于控制菜单的选择参数 =======UINT8 Last_Select_Item;//上次执行本函数后,所选择的菜单项UINT8 Select_Item;//本次执行本函数,要选择的菜单项}M;//============== 以下是变量定义 =============== UINT8 xdata Menu_Item_Count;//总共有几个菜单项UINT8 xdata Menu_Screen_Count;//当前一屏最多可以显示几个菜单项UINT8 xdataMenu_Box_x,Menu_Box_y,Menu_Box_End_x,Menu_Box_End _y;//需要刷新的区域的坐标UINT8 *pMenu_Box_Bmp;//需要显示的菜单项的指针StructCopy(&M.Title_x,pMenu,19);//把参数复制到本函数内,便于操作Menu_Item_Count=M.Menu_Bmp_y/M.Menu_Item_Height;/ /总共有几个菜单项Menu_Screen_Count=(M.Menu_End_y-M.Menu_y)/M.Menu_ Item_Height;//一屏最多可以显示多少项菜单//---------------------------------------------------------------------------if(M.RePaint==1)//如果需要重画整个菜单图像{Lcd_Draw_BMP(M.Title_x,M.Title_y,M.Title_x+M.Title_Len_x,M.Title_y+M.Title_Len_y,pTitleBmp);//画出标题的图片if(M.Line_Len!=0)Lcd_DrawRowLine(M.Line_x,M.Line_y,M.Line_Len,1);/ /画出最下面的线}//---------------------------------------------------------------------------//-----------需要刷新的图像的区域Menu_Box_x=M.Menu_x;Menu_Box_y=M.Menu_y;Menu_Box_End_x=M.Menu_x+M.Menu_Bmp_x;Menu_Box_End_y=M.Menu_End_y;。
#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char//--定时使用的IO口--//#define DATA_PORT P0sbit LCD12864_CS = P3^2;sbit LCD12864_RSET = P3^3;sbit LCD12864_RS = P2^6;sbit LCD12864_RW = P2^7;sbit LCD12864_RD = P2^5;//--定义全局函数--//void LcdSt7565_WriteCmd(cmd);void LcdSt7565_WriteData(dat);void Lcd12864_Init();void Lcd12864_ClearScreen(void);void Lcd12864_Write16CnCHAR(uchar x, uchar y,uchar k);void Delay10ms(unsigned int c);unsigned char code table[40][32]={/*-- 文字: 。
--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/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,0x18,0x24,0x24,0x18,0x00,0x00,/*-- 文字: 都--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x06,0xDA,0x22,0x02,0xFE,0x20,0x26,0x28,0x34,0x24,0x7F,0xA4,0x24,0x24,0x20, 0x00,0x07,0x08,0x10,0x08,0xFF,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x02,0x04,/*-- 文字: 皇--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x7C,0x54,0x54,0x54,0x54,0x55,0x56,0x54,0x7C,0x00,0x00,0x00, 0x00,0x40,0x41,0x49,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,/*-- 文字: 满--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x24,0x24,0x2F,0xE4,0x24,0x24,0xE4,0x2F,0x24,0x24,0x00,0x8C,0x02,0x60,0x10, 0x00,0x7F,0x91,0x49,0x07,0x09,0x19,0x07,0x09,0x11,0xFF,0x00,0x01,0x7E,0x04,0x04,/*-- 文字: 柳--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFC,0x04,0x04,0xFC,0x00,0xF8,0x02,0x04,0xFC,0x10,0x90,0xFF,0xD0,0x10,0x10, 0x00,0x07,0x08,0x04,0xFF,0x00,0x0F,0x32,0x44,0x8F,0x01,0x00,0xFF,0x00,0x03,0x04,/*-- 文字: 烟--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0xFE,0x08,0x10,0xFF,0x00,0x70,0x80, 0x00,0xFF,0x40,0x4C,0x42,0x41,0x46,0x48,0x50,0xFF,0x10,0x08,0x07,0x18,0x60,0x80,/*-- 文字: 胜--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x10,0x10,0x10,0xFF,0x10,0x10,0x3C,0x40,0x00,0xFE,0x22,0x22,0xFE,0x00, 0x00,0x40,0x42,0x42,0x42,0x7F,0x42,0x42,0x42,0x40,0x00,0xFF,0x82,0x02,0x7F,0x80,/*-- 文字: 绝--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xE0,0x2C,0x34,0xE4,0x24,0x27,0xE8,0x10,0x20,0x10,0x63,0xAC,0x30,0x20, 0x00,0x70,0x43,0x42,0x42,0x43,0x42,0x42,0x3F,0x00,0x00,0x12,0x12,0x22,0x67,0x22,/*-- 文字: ,--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/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,0x38,0x58,0x00,0x00,/*-- 文字: 处--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x20,0x10,0xFF,0x00,0x00,0xF8,0x08,0x08,0x9F,0x60,0x80,0x00, 0x00,0x40,0x41,0x40,0x40,0x40,0x5F,0x40,0x20,0x20,0x13,0x0C,0x13,0x20,0x40,0x81,/*-- 文字: 好--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x86,0x8A,0x92,0xE2,0x82,0x82,0x80,0x00,0xF0,0x10,0x1F,0xF0,0x10,0x10, 0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x00,0x61,0x16,0x08,0x15,0x22,0x40,/*-- 文字: 春--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x44,0x54,0x54,0xD4,0x54,0x54,0x5F,0x74,0x54,0xD4,0x54,0x54,0x44,0x40, 0x00,0x04,0x04,0x02,0x01,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x01,0x02,0x04,0x04,/*-- 文字: 年--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x04,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0xC7,0x18,0x20,0x00, 0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,/*-- 文字: 一--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 是--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00, 0x00,0x81,0x81,0x89,0x89,0x89,0x89,0x89,0xFF,0x81,0x41,0x21,0x1D,0x21,0x41,0x81,/*-- 文字: 最--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x55,0xD5,0x55,0x55,0x5F,0xC0,0x40,0x40, 0x00,0x80,0x80,0x43,0x2D,0x11,0x29,0x47,0x90,0xFF,0x15,0x15,0x25,0x3F,0x60,0x20,/*-- 文字: 。
LCD12864液晶显示电子钟设计
介绍:
设计目标:
设计一个能够实时显示时间和日期的电子钟,能够精确地获取当前的时间,并对用户的操作作出相应的响应。
设计原理:
该电子钟设计采用了单片机ATmega16作为核心,配合RTC(实时时钟)模块,通过控制液晶显示屏来显示时间和日期。
硬件设计:
1.电源电路:使用直流电源电压为5V,通过稳压芯片将输入电压稳定在5V。
2.单片机电路:将ATmega16与晶振、复位电路、电源电路等连接起来。
3.RTC电路:通过连接RTC芯片和单片机,实现对实时时钟的读取和控制功能。
4.液晶显示屏电路:将液晶显示屏与单片机进行连接,通过单片机控制液晶显示屏的显示。
软件设计:
1.初始化:对单片机和RTC进行初始化设置。
2.获取时间:从RTC读取当前时间和日期。
3.显示时间:将获取到的时间和日期分别显示在液晶显示屏的相应位置。
4.操作功能:通过按键控制,实现对时间和日期的调整和设置功能。
设计步骤:
1.确定电路设计需求和所需元器件。
2.搭建硬件电路,完成电路连接。
3.使用相关软件进行单片机和RTC的编程设置。
4.测试整个电路是否能够正确工作,如对时间进行调整并观察液晶显示屏的显示是否准确。
5.根据需求进行适当的优化和完善设计。
总结:。
51单片机+lcd12864液晶屏菜单程序这个是主界面这个是主菜单界面这个是设置时间的子界面这个是设置日期设置背景光这是设置了按键音和闹铃以后,主界面出现状态标志闹铃的界面,喇叭出现铃声。
生日倒计时提醒功能。
全部完整的源代码下载:51hei/bbs/dpj-20391-1.htmlprocess.h 文件:/*---------- --------------------------名称:菜单处理模块编写:YuMin_Dong 时间:2013.01.24------- -----------------------------*/#ifndef _PROCESS_H_#define _PROCESS_H_bit Menu_Flag;//设置画面显示标志bit FanHui1;//是否退出主菜单标签bit Refresh_SetTime;//设置了时间需要刷新显示置位改表现bitMenu1,Menu2,Menu3,Menu4,Menu5,Menu6,Enter_Menu;//Menu0 定义在LCD12864.H 中了,因为显示时间函数重复利用了.//UINT8 MenuKey_Count;//菜单键按下的次数//UINT8 fen,shi,miao;//秒表功能用bit Again;//为了静态显示定义该标志,在子菜单下,第一次进入显示一次界面然后在不修改前不会去刷新它//bit Speaker_Flag;//按键音标志bit Set_Bright,Set_Speaker;//亮灭背景光和按键音开关选项标志bit Bell_Flag;bit Menu1_Flag,Menu2_Flag;/*------------------------------------按键控制位定义------------------------------------*/sbit KEY_MENU=P3 ;//选择键,调用中断,及时性sbit KEY_UP=P0;//上调sbit。
1、打点部分/********************************************************名称:GUI_Point(打点)说明:X:横坐标(代表列的位置,0~127) Y:纵坐标(代表行的位置,0~63) 根据Datesheet需先把数据写到GDRAM,读取当前位置的数据,经过或和移位后再把数据重新写入GDRAM每行有16个位元,共64行,每个位元有两个8位(高低8位) 计算出在那个位元,在该位元的哪一位易出现的问题:1、打点位置的定位2、读取当前显示的数据3、或和移位,即重新写人的新数据********************************************************/void GUI_Point(uchar x,uchar y,uchar flag){uchar x_Dyte,x_byte; //定义列地址的字节位,及在字节中的哪1位uchar y_Dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)Write_command(0x36); //绘图模式命令/***X,Y坐标互换,即普通的X,Y坐标***/x_Dyte=x/16; //计算在16个字节中的哪一个x_byte=x&0x0f; //计算在该字节中的哪一位y_Dyte=y/32; //0为上半屏,1为下半屏y_byte=y&0x1f; //计算在0~31当中的哪一行Write_command(0x80+y_byte); //设定行地址(y坐标)Write_command(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_D yte选定上下屏Read_data();GDRAM_hbit=Read_data(); //读取当前显示高8位数据GDRAM_lbit=Read_data(); //读取当前显示低8位数据delay_us(5);if(flag==1){Write_command(0x80+y_byte); //设定行地址(y坐标)Write_command(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y _Dyte选定上下屏delay_us(5);if(x_byte<8) //判断其在高8位,还是在低8位{Write_data(GDRAM_hbit|(0X01<<(7-x_byte))); //显示GDRAM区高8位数据 Write_data(GDRAM_lbit); //显示GDRAM区低8位数据}else{Write_data(GDRAM_hbit);Write_data(GDRAM_lbit|(0x01<<(15-x_byte)));}}else{Write_data(0x00); //清除GDRAM区高8位数据Write_data(0x00); //清除GDRAM区低8位数据}}2、画线部分先看程序/********************************************************* 名称:GUI_Line()采用布兰森汉姆(Bresenham)算法画线* 功能:任意两点间的直线。
成绩课程论文题目:基于C51的LCD12864液晶动画显示课程名称:Proteus学生姓名:王文奇学生学号:1114210132系别:电气信息工程学院专业:自动化年级:2011(3)任课教师:王丽电气信息工程学院制2015年1月基于C51的LCD12864液晶动画显示学生:王文奇指导教师:王丽电气信息工程学院自动化专业1.主要芯片简介1.1 AT89C51单片机简介AT89C51是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash只读程序存储器和128 bytes的随机存取数据存储器(RAM ),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C51单片机能应用许多高性价比的场合,可灵活应用于各种控制领域。
图1 AT89C51封装图主要性能参数(1)主要特性:·4K字节可编程闪烁存储器;·全静态工作:0Hz-24Hz·三级程序存储器锁定·128*8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路(2)部分管脚说明:VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收.P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
单片机L C D12864显示系统课程设计-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN目录一、概述 (2)二、系统总体方案及硬件设计 (2)系统框图 (3)单片机最小系统 (4)显示电路 (6)按键控制电路 (6)三、系统软件设计 (9)软件设计概述 (9)汉字显示 (10)上下移屏................................................................................. 错误!未定义书签。
左右移屏................................................................................ 错误!未定义书签。
四、课程设计体会....................................................................... 错误!未定义书签。
五、参考文献 (13)六、附录 (14)总电路图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .总程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .一、概述随着社会的发展,趣来趣多的地方需要应用显示功能,各种数字显示仪器中的显示、广告牌、数码产品等,传统的数码管显示已经远远不能满足各行各业的需求。
基于单片机的LCD显示是一种用单片机来控制的一种显示系统,它不仅能显示种各数字、字母、还能显示各种字体的汉字以及一些简单的图象,使用起来极为方便,只要通过对单片机写入一定的程序来控制LCD的显示即可完成,根据程序的不同而产生不同不效果以满足各种不同需求。