NOKIA 5110液晶资料及程序
- 格式:doc
- 大小:667.50 KB
- 文档页数:11
#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */#define uchar unsigned char#define uint unsigned int#define lcd12864_date PORTB //数据口#define lcd12864_rs PTT_PTT5// PTT_PTT5; //寄存器选择输入#define lcd12864_rw PTT_PTT3 //液晶读/写控制#define lcd12864_e PTT_PTT2 //液晶使能控制#define DQ PORTA_PA0 // 定义DQ引脚为P3.3 #define DQ_HIGH() DDRA=0 //设置数据口为输入#define DQ_LOW() DDRA=1;DQ=0; //设置数据口为输出//uint temp; //温度值variable of temperature uchar A1,A2,A3;void delay2(uint i);void Init_Ds18b20(void);uchar Read_One_Byte();void Write_One_Byte(uchar dat);uint Get_Tmp();void DisplayTemp(uint temp) ;void delay(unsigned int t){uint i,j;for(i=t;i>0;i--)for(j=1000;j>0;j--);}void lcd12864_write_cmd(unsigned char command) //写指令{lcd12864_rs=0;lcd12864_rw=0;lcd12864_e=0;lcd12864_date=command;delay(5);lcd12864_e=1;lcd12864_e=0;delay(5);}void lcd12864_write_data(unsigned char data) // 写数据写入一个字符{lcd12864_rs=1;lcd12864_rw=0;lcd12864_e=0;lcd12864_date=data;delay(5);lcd12864_e=1;lcd12864_e=0;delay(5);}void lcd12864_pos(unsigned char x,unsigned char y) //确定位置{unsigned char pos;if (x==1){x=0x80;}else if (x==2){x=0x90;}else if (x==3){x=0x88;}else{x=0x98;}pos=x+y-1;lcd12864_write_cmd(pos); //显示地址}void io_init(){lcd12864_write_cmd(0x30); //基本指令操作lcd12864_write_cmd(0x0C); //显示开,关光标lcd12864_write_cmd(0x01); //清除LCD的显示内容位置计数器调整为0x00 }void lcd12864_wrtie_string( char *str) //写字符串{while(*str!='\0') //未结束{lcd12864_write_data(*str++);}}void init_LCD(){delay(20);lcd12864_write_cmd(0x30);delay(20);lcd12864_write_cmd(0x30);delay(20);lcd12864_write_cmd(0x0c);//开显示,不显示光标,且不闪烁delay(20);lcd12864_write_cmd(0x01); //清屏delay(20);lcd12864_write_cmd(0x06); //每次写入数据后地址指针加1delay(20);}/**/void Display1(){lcd12864_pos(1,2);lcd12864_wrtie_string("温度调节系统");lcd12864_pos(2,1);lcd12864_wrtie_string("菜单1:当前温度");lcd12864_pos(3,1);lcd12864_wrtie_string("菜单2:目标温度");lcd12864_pos(4,1);lcd12864_wrtie_string("菜单3:温度曲线");}void Display2(){lcd12864_pos(1,2);lcd12864_wrtie_string("温度调节系统");lcd12864_pos(2,1);lcd12864_wrtie_string("当前温度:**度");lcd12864_pos(3,1);lcd12864_wrtie_string("目标温度:**度");lcd12864_pos(4,2);lcd12864_wrtie_string(" Welcome ! ");}void main(void){delay(5);DDRB=0xff;DDRT=0xff;// io_init();init_LCD();lcd12864_pos(2,2);lcd12864_wrtie_string(" Welcome To ! ");lcd12864_pos(3,2);lcd12864_wrtie_string("温度调节系统");delay(2000);lcd12864_write_cmd(0x01); //清屏delay(20);while(1){DisplayTemp(Get_Tmp());lcd12864_pos(2,3);lcd12864_write_data(0x30+A1);lcd12864_pos(2,4);lcd12864_write_data(0x30+A2);lcd12864_pos(2,5);lcd12864_write_data(0x2e);lcd12864_pos(2,6);lcd12864_write_data(0x30+A3);/*Display1() ; */}}/*************精确延时函数*****************/ void delay2(unsigned int i){i=10*i;while(--i);}/****************************************** 此延时函数针对的是12Mhz的晶振delay(0):延时518us 误差:518-2*256=6delay(1):延时7us (原帖写"5us"是错的)delay(10):延时25us 误差:25-20=5delay(20):延时45us 误差:45-40=5delay(100):延时205us 误差:205-200=5delay(200):延时405us 误差:405-400=5*******************************************//*****************DS18B20******************/void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command{char presence=1;while(presence){//DQ = 1; //DQ复位,不要也可行。
nokia5110课程设计一、课程目标知识目标:1. 让学生掌握Nokia 5110液晶显示屏的基本原理和操作方法;2. 了解Nokia 5110在图形显示和文字显示方面的应用;3. 学会运用编程语言(如:MicroPython)对Nokia 5110进行控制和编程。
技能目标:1. 能够独立完成Nokia 5110的硬件连接和初始化;2. 掌握使用编程语言对Nokia 5110显示内容进行设计和编写;3. 能够运用所学的知识解决实际问题,如制作简单的电子时钟、小游戏等。
情感态度价值观目标:1. 培养学生对电子产品的兴趣,激发他们探索未知领域的热情;2. 培养学生的团队合作精神,学会与他人共同解决问题;3. 增强学生的环保意识,让他们了解电子废弃物的回收和处理方法。
课程性质:本课程为实践性较强的课程,结合理论讲解和实际操作,让学生在动手实践中掌握知识。
学生特点:六年级学生具有一定的编程基础和电子知识,好奇心强,喜欢动手实践。
教学要求:教师需关注学生的个体差异,因材施教,鼓励学生积极参与,注重培养学生的实践能力和创新精神。
通过本课程的学习,使学生能够将所学知识运用到实际生活中,提高他们的综合素质。
二、教学内容1. Nokia 5110液晶显示屏原理介绍:包括显示屏的硬件结构、工作原理和显示原理。
- 理解显示屏的像素点阵和色彩显示方式。
- 掌握显示屏的初始化和基本操作。
2. 硬件连接与编程环境搭建:- 学习如何将Nokia 5110与微控制器(如Arduino或MicroPython板)连接。
- 搭建编程环境,熟悉相关开发工具的使用。
3. 图形和文字显示编程:- 学习使用编程语言进行图形绘制和文字显示。
- 掌握如何清屏、绘制点、线、矩形和圆形等基本图形。
- 实现文字的滚动显示和特效。
4. 实际应用案例分析与制作:- 分析并制作简单的电子时钟,学习时间管理和中断处理。
- 设计并实现一个简易小游戏,如贪吃蛇或俄罗斯方块,提高逻辑思维能力。
主程序main.c//重庆三峡学院电子与信息工程学院创新实验室唐老鸭//原创----川流不息#include "nongli.h"#include "nokia5110.h"#include "ds18b02.h"#include "ds1302.h"#include "delay.h"#include "rset_time.h"unsigned int temperature=0; //温度值void display(){//第三行显示,调整的时候显示”正在设置:“if(flag==0){LCD_write_hanzi(0,4,hanzi,23); //农LCD_write_hanzi(2,4,hanzi,24); //历shownl();}else{LCD_write_hanzi(0,4,hanzi,17); //正LCD_write_hanzi(2,4,hanzi,18); //在LCD_write_hanzi(4,4,hanzi,19);//设LCD_write_hanzi(6,4,hanzi,20);// 置LCD_write_shu(8,4,10); //冒号:switch(num){case 1: LCD_write_hanzi(11,4,hanzi,14); break;//设置年case 2: LCD_write_hanzi(11,4,hanzi,15); break;//设置月case 3: LCD_write_hanzi(11,4,hanzi,7); break;//设置日case 4: LCD_write_hanzi(10,4,hanzi,5); LCD_write_hanzi(12,4,hanzi,6); break;//设置星期case 5: LCD_write_hanzi(11,4,hanzi,21); break;//设置年case 6: LCD_write_hanzi(11,4,hanzi,22); break;//设置年default : break;}}//显示第一行LCD_write_shu(0,0,2);//2LCD_write_shu(1,0,0);//0LCD_write_shu(2,0,nian/10);LCD_write_shu(3,0,nian%10);LCD_write_shu(4,0,12);//-LCD_write_shu(5,0,yue/10);LCD_write_shu(6,0,yue%10);LCD_write_shu(7,0,12);//-LCD_write_shu(8,0,ri/10);LCD_write_shu(9,0,ri%10);//星期LCD_write_hanzi(10,0,hanzi,25); //周LCD_write_hanzi(12,0,hanzi,xingqi+6);//第二行显示//温度LCD_write_shu(0,2,temperature/1000);LCD_write_shu(1,2,temperature%1000/100);LCD_write_hanzi(2,2,hanzi,0); //符号℃LCD_write_shu(6,2,shi/10);LCD_write_shu(7,2,shi%10);LCD_write_shu(8,2,10); //冒号:LCD_write_shu(9,2,fen/10);LCD_write_shu(10,2,fen%10);LCD_write_shu(11,2,10);//冒号:LCD_write_shu(12,2,miao/10);LCD_write_shu(13,2,miao%10);}void main(){LCD_init(); //初始化LCD模块LCD_clear(); //清屏幕//init_time();flag=0;while(1){temperature=readtemperature();//读温度if(flag==0)get_time();//读出时间rset_time();display();if(shi<7)PCON|=0x02;//进入掉电模式,低功耗}}液晶驱动程序nokia5110.c#include <reg52.h>sbit res = P2^3; //复位,0复位sbitsce = P2^4; //片选sbit dc = P2^5; //1写数据 0写指令sbitsdin = P2^6; //数据sbitsclk = P2^7; //时钟unsigned char code shuzi[]={/*-- 文字: 0 --*/0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 1 --*/0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*-- 文字: 2 --*/0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,/*-- 文字: 3 --*/0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 4 --*/0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00,/*-- 文字: 5 --*/0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 6 --*/0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 7 --*/0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*-- 文字: 8 --*/0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 9 --*/0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00,/*-- 文字: : --*/0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, //10/*--空格--*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//11/*--- - --*/0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //12/*--小数点.--*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,//13};//12*12字符unsigned char code hanzi[]={0x0E,0x0A,0x0E,0xF8,0x04,0x02,0x02,0x02,0x04,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0 2,0x02,0x02,0x02,0x01,0x00,0x00,//;"℃",00x10,0x92,0x94,0x90,0x90,0x9F,0x90,0x98,0x94,0xF2,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x07,0x00,0x00,//;"当",10x04,0xF4,0x54,0x55,0xF6,0x04,0x06,0xF5,0x04,0xF6,0x04,0x00,0x00,0x07,0x01,0x05,0x07,0x00, 0x00,0x05,0x04,0x07,0x00,0x00,//;"前",20x89,0x72,0x00,0xC0,0x5F,0xD5,0x55,0xD5,0x55,0xDF,0x00,0x00,0x07,0x00,0x04,0x07,0x04,0x07 ,0x04,0x07,0x04,0x07,0x04,0x00,//;"温",30x00,0xFE,0x0A,0x8A,0xBE,0xAA,0xAB,0xAA,0xBE,0x0A,0x0A,0x00,0x06,0x01,0x04,0x04,0x04,0x 03,0x02,0x03,0x04,0x04,0x04,0x00,//;"度",40x00,0x80,0x7F,0x55,0x55,0xF5,0x55,0x55,0x55,0x5F,0x00,0x00,0x05,0x04,0x05,0x05,0x05,0x07, 0x05,0x05,0x05,0x05,0x04,0x00,//;"星",50x82,0xFF,0xAA,0xAA,0xFF,0x82,0x00,0xFF,0x49,0x49,0xFF,0x00,0x04,0x02,0x01,0x00,0x01,0x02, 0x04,0x03,0x00,0x04,0x07,0x00,//;"期",60x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02, 0x02,0x02,0x02,0x07,0x00,0x00,//;"日",70x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,//;"一",80x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02 ,0x02,0x02,0x02,0x02,0x02,0x00,//;"二",90x00,0x02,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04 ,0x04,0x04,0x04,0x06,0x04,0x00,//;"三",100x00,0xFF,0x81,0x41,0x3F,0x01,0x01,0xFF,0x81,0x81,0xFF,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0 x02,0x02,0x02,0x02,0x07,0x00,//;"四",10+10x00,0x11,0x11,0x91,0x7F,0x11,0x11,0x11,0xF1,0x01,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04, 0x04,0x04,0x07,0x04,0x04,0x00,//;"五",11+10x08,0x08,0x88,0x68,0x09,0x0E,0x28,0x48,0x88,0x08,0x08,0x00,0x04,0x02,0x01,0x00,0x00,0x00 ,0x00,0x00,0x01,0x06,0x00,0x00,//;"六",12 +10x88,0x84,0xF3,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0x00,0x00,//;"年",13 +10x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,0x04,0x02,0x01,0x00,0x00, 0x04,0x04,0x07,0x00,0x00,0x00,//;"月",140x20,0x20,0x2F,0xE9,0xA9,0xA9,0xA9,0xA9,0xAF,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x04 ,0x04,0x04,0x03,0x00,0x00,0x00,//;"号",150x02,0x02,0xF2,0x02,0x02,0xFE,0x22,0x22,0x22,0x23,0x02,0x00,0x04,0x04,0x07,0x04,0x04,0x07, 0x04,0x04,0x04,0x04,0x04,0x00,//;"正",160x82,0x42,0xF2,0x0A,0x47,0x42,0xFA,0x42,0x42,0x42,0x02,0x00,0x00,0x00,0x07,0x04,0x04,0x04 ,0x07,0x04,0x04,0x04,0x04,0x00,//;"在",170x10,0x11,0xF2,0x20,0x10,0x6F,0xA1,0x21,0xAF,0x68,0x08,0x00,0x00,0x00,0x03,0x05,0x04,0x04, 0x02,0x01,0x02,0x04,0x04,0x00,//;"设",180x10,0x17,0xF5,0x55,0x57,0x5D,0x57,0x55,0xF5,0x17,0x10,0x00,0x04,0x04,0x07,0x05,0x05,0x05 ,0x05,0x05,0x07,0x04,0x04,0x00,//"置",190xFE,0x22,0x22,0xFE,0x04,0x14,0x64,0x04,0xFF,0x04,0x04,0x00,0x03,0x01,0x01,0x03,0x00,0x00, 0x04,0x04,0x07,0x00,0x00,0x00,//;"时",200x20,0x10,0x2C,0x23,0xE0,0x20,0x20,0x23,0xEC,0x10,0x20,0x00,0x04,0x04,0x02,0x01,0x00,0x04 ,0x04,0x04,0x03,0x00,0x00,0x00,//;"分",21+10x08,0x8C,0x44,0xE4,0x14,0x0F,0x34,0xC4,0x24,0x1C,0x00,0x00,0x01,0x00,0x00,0x07,0x04,0x02 ,0x02,0x00,0x01,0x02,0x02,0x00,//;"农",230x00,0xFF,0x01,0x11,0x11,0x91,0x7D,0x11,0x11,0x11,0xF1,0x00,0x06,0x01,0x00,0x04,0x02,0x01, 0x00,0x04,0x04,0x06,0x01,0x00,//"历",240x00,0x00,0xFF,0x11,0xD5,0x5F,0x55,0xD5,0x11,0x01,0xFF,0x00,0x04,0x03,0x00,0x00,0x01,0x01, 0x01,0x01,0x04,0x04,0x07,0x00,};//"周",25unsigned char code moon[]={0x44,0x24,0xF7,0x2C,0x50,0x02,0xC2,0x3E,0x02,0x02,0xFE,0x00,0x00,0x00,0x07,0x00,0x04,0x0 2,0x01,0x04,0x04,0x06,0x01,0x00,//;"初",00x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,//;"一",10x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02 ,0x02,0x02,0x02,0x02,0x02,0x00,//;"二",20x00,0x02,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04 ,0x04,0x04,0x04,0x06,0x04,0x00,//;"三",30x00,0xFF,0x81,0x41,0x3F,0x01,0x01,0xFF,0x81,0x81,0xFF,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0 x02,0x02,0x02,0x02,0x07,0x00,//;"四",40x00,0x11,0x11,0x91,0x7F,0x11,0x11,0x11,0xF1,0x01,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04, 0x04,0x04,0x07,0x04,0x04,0x00,//;"五",50x08,0x08,0x88,0x68,0x09,0x0E,0x28,0x48,0x88,0x08,0x08,0x00,0x04,0x02,0x01,0x00,0x00,0x00 ,0x00,0x00,0x01,0x06,0x00,0x00,//;"六",60x20,0x20,0x20,0x20,0xFF,0x10,0x10,0x10,0x08,0x08,0x88,0x00,0x00,0x00,0x00,0x00,0x07,0x04, 0x04,0x04,0x04,0x04,0x07,0x00,//;"七",70x00,0x00,0x80,0x7E,0x00,0x00,0x1F,0x60,0x80,0x00,0x00,0x00,0x04,0x02,0x01,0x00,0x00,0x00, 0x00,0x00,0x01,0x02,0x04,0x00,//;"八",80x08,0x08,0x08,0x88,0x7F,0x08,0x08,0xFC,0x08,0x00,0x00,0x00,0x04,0x04,0x02,0x01,0x00,0x00, 0x00,0x07,0x04,0x04,0x07,0x00,//;"九",90x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,//;"十",100x80,0x90,0x48,0x46,0x2B,0x92,0xAA,0x46,0x42,0x80,0x80,0x00,0x00,0x00,0x00,0x02,0x02,0x0 2,0x04,0x04,0x00,0x00,0x00,0x00,//;"冬",110x00,0xFF,0x49,0xFF,0x14,0xD4,0x5F,0x54,0x5F,0xD4,0x14,0x00,0x06,0x01,0x04,0x07,0x00,0x07, 0x05,0x05,0x05,0x07,0x00,0x00};//"腊",12void delayms(unsigned int ii)//1ms延时函数{unsignedinti,x;for (x=0;x<ii;x++){for (i=0;i<120;i++);}}/*--------------------------------------------LCD_write_byte: 使用SPI接口写数据到LCD输入参数 dt 写入的数据command 写数据/命令选择编写日期 2012-8-13----------------------------------------------*/voidLCD_write_byte(unsigned char dt, unsigned char command){unsigned char i;sce=0;dc=command;for(i=0;i<8;i++){if(dt&0x80)sdin=1;elsesdin=0;dt=dt<<1;sclk=0;sclk=1;}dc=1;sce=1;sdin=1;}/*---------------------------------------LCD_init: 5110LCD初始化编写日期 2012-8-13----------------------------------------- */voidLCD_init(void){res=0;delayms(10);res=1;LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令LCD_write_byte(0xC8,0);//设定液晶偏置电压LCD_write_byte(0x06,0);//温度校正LCD_write_byte(0x13,0);//1:48LCD_write_byte(0x20,0);//使用基本指令LCD_write_byte(0x0C,0);//设定显示模式 正常显示}/*-------------------------------------------LCD_set_XY: 设置LCD坐标函数输入参数 X 0 83 Y 0 5编写日期 2012-8-13---------------------------------------------*/voidLCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x80 | X, 0);// rowLCD_write_byte(0x40 | Y, 0);// column}/*------------------------------------------LCD_clear: LCD清屏函数编写日期 2012-8-13--------------------------------------------*/voidLCD_clear(void){unsigned char t;unsigned char k;LCD_set_XY(0,0);for(t=0;t<6;t++){for(k=0;k<84;k++){LCD_write_byte(0x00,1);}}}/*-----------------------------------------------------------------------LCD_draw_map : 位图绘制函数输入参数 X、Y 位图绘制的起始X、Y坐标*map 位图点阵数据Pix_x 位图像素 长Pix_y 位图像素 宽编写日期 2012-8-13-----------------------------------------------------------------------*///void LCD_draw_bmp(unsigned char X,unsigned char Y,unsigned char *map, unsigned char Pix_x,unsigned char Pix_y)// {// unsigned inti,n;// unsigned char row;// if(Pix_y%8==0) row=Pix_y/8; //计算位图所占行数// else row=Pix_y/8+1;// for (n=0;n<row;n++)// {// LCD_set_XY(X,Y);// for(i=0; i<Pix_x; i++)// {// LCD_write_byte(map[i+n*Pix_x], 1);// }// Y++; //换行// }// }/*---------------------------------------------LCD_write_shu: 显示6 宽 *12 高 点阵列数字字母符号等半角类输入参数 c 显示的字符编写日期 2012-8-13-----------------------------------------------*/void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列page:页dd:字符{unsigned char i;LCD_set_XY(row*6, page);// 列 页for(i=0; i<6;i++)LCD_write_byte(shuzi[c*12+i],1);LCD_set_XY(row*6, page+1);// 列 页for(i=6; i<12;i++)LCD_write_byte(shuzi[c*12+i],1);}/*---------------------------------------------LCD_write_hanzi: 显示12 宽 *12 高 点阵列汉字等半角类输入参数 c 显示的字符编写日期 2012-8-13-----------------------------------------------*/void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char *hanzi,unsigned char c) //row:列page:页dd:字符{unsigned char i;LCD_set_XY(row*6, page);// 行列for(i=0; i<12;i++)LCD_write_byte(hanzi[c*24+i],1); //写汉字上半部分LCD_set_XY(row*6, page+1);//行列for(i=12; i<24;i++)LCD_write_byte(hanzi[c*24+i],1); //写汉字下半部分/*unsigned char i;LCD_set_XY(row*8, page);// 列 页for(i=0; i<16;i++)LCD_write_byte(hanzi[c*32+i],1); //写汉字上半部分LCD_set_XY(row*8, page+1);// 列 页for(i=16; i<32;i++)LCD_write_byte(hanzi[c*32+i],1); //写汉字下半部分*/时钟1302驱动ds1302.c#include<reg52.h>#include "delay.h"#define uchar unsigned charsbitsck=P1^3;sbitdio=P1^4;sbitce=P1^5;charshi,fen,miao,nian,yue,ri,xingqi;char shi1,fen1,miao1,nian1,yue1,ri1,xingqi1;//写命令以及地址void write(ucharadd,uchar date){uchartemp,t;ce=0;sck=0;ce=1;temp=add;for(t=0;t<8;t++)//写地址命令{if((temp&0x01)==1)dio=1;elsedio=0;sck=1;delay(1);sck=0;temp=temp>>1;}temp=date;for(t=8;t>0;t--) //写数据{if((temp&0x01)==1)dio=1;elsedio=0;sck=1;delay(1);sck=0;temp=temp>>1;}}uchar read(ucharadd,uchar choice) //choice为1时得到16进制的形式,用于阴阳历转换为其他数时得到10进制uchartemp,t;ce=0;sck=0;ce=1;temp=add;for(t=0;t<8;t++){if((temp&0x01)==1)dio=1;elsedio=0;sck=1;sck=0;temp>>=1;}temp=0;for(t=0;t<7;t++){if(dio==1)temp=temp|0x80;elsetemp=temp&0x7f;sck=1;sck=0;temp>>=1;}//传送一个字节需要16个时钟if(choice==1)//返回16进制return temp;//16*10+temp%16;//将BCD码转换成10进制码elsereturn temp/16*10+temp%16;//将BCD码转换成10进制码}/*ucharreadd(uchar add) //得到10进制形式{uchartemp,t;ce=0;sck=0;ce=1;temp=add;for(t=0;t<8;t++){if((temp&0x01)==1)dio=1;elsedio=0;sck=1;sck=0;temp>>=1;}temp=0;for(t=0;t<7;t++){if(dio==1)temp=temp|0x80;elsetemp=temp&0x7f;sck=1;sck=0;temp>>=1;}//传送一个字节需要16个时钟return temp/16*10+temp%16;//将BCD码转换成10进制码} */voidinit_time(){write(0x8e,0x00);//写保护,相当于初始化或者缓冲write(0x80,(miao/10<<4)|(miao%10)); //写秒write(0x82,(fen/10<<4)|(fen%10));//写分write(0x84,(shi/10<<4)|(shi%10)); //写时write(0x86,(ri/10<<4)|(ri%10)); //写日write(0x88,(yue/10<<4)|(yue%10));//写月write(0x8a,(xingqi/10<<4)|(xingqi%10)); //写星期write(0x8c,(nian/10<<4)|(nian%10));//写年}//显示时间voidget_time(){//读出10进制数shi=read(0x85,0);//读出时间时fen=read(0x83,0);//读出时间分miao=read(0x81,0);//读出时间秒nian=read(0x8d,0);//读出时间年yue=read(0x89,0);//读出时间月ri=read(0x87,0);//读出时间日xingqi=read(0x8b,0);//读出时间星期//读出16进制数shi1=read(0x85,1);//读出时间时fen1=read(0x83,1);//读出时间分miao1=read(0x81,1);//读出时间秒nian1=read(0x8d,1);//读出时间年yue1=read(0x89,1);//读出时间月ri1=read(0x87,1);//读出时间日xingqi1=read(0x8b,1);//读出时间星期}温度传感器ds18b20.c#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ =P3^5; //定义通信端口voiddelayus(uinti){while(i--);}//初始化函数void init_ds18b20(){uchar x=0;DQ = 1; //DQ复位delayus(8); //稍做延时DQ = 0; //单片机将DQ拉低delayus(80); //精确延时大于480usDQ = 1; //拉高总线delayus(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delayus(20);}//读一个字节readonechar(void){uchari=0;uchardat=0;for(i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delayus(4);}return(dat);}//写一个字节voidwriteonechar(uchardat){uchari=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delayus(5);DQ = 1;dat>>=1;}}//读取温度readtemperature(void){uchar a=0;uchar b=0;uint t=0;floattt=0;init_ds18b20();writeonechar(0xCC); // 跳过读序号列号的操作writeonechar(0x44); // 启动温度转换init_ds18b20();writeonechar(0xCC); //跳过读序号列号的操作writeonechar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=readonechar();//低四位b=readonechar();//高四位t=b;t<<=8;t=t|a;tt=t*0.0625;t= (tt-2)*100; //放大10倍输出return(t);}延时函数delay.cvoid delay(unsigned int z){unsignedintx,y;for(y=z;y>0;y--)for(x=110;x>0;x--);}调时间函数rset_time.c#include "ds1302.h"#include "nokia5110.h"#include "rset_time.h"#include "delay.h"unsigned char num,flag;voidrset_time(){if(key_mod==0){delay(1);while(!key_mod);flag=1;num++;LCD_clear(); //清屏幕if(num==7){num=0;flag=0;init_time();}}if(flag){if(key_up==0){delay(1);while(!key_up);switch(num){case 1: nian=(nian+1)%100;break;case 2: yue=(yue+1)%13;if(yue==0) yue=1; break;case 3: ri=ri+1;if((yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)&&ri==32) ri=1;if((yue==4||yue==6||yue==9||yue==11)&&ri==31) ri=1;if(yue==2&&ri==29) ri=1; break;case 4: xingqi++; if(xingqi==8) xingqi=1; break;case 5: shi=(shi+1)%24; break;case 6: fen=(fen+1)%60; break;default : break;}}if(key_down==0){delay(1);while(!key_down);switch(num){case 1: nian--; if(nian==-1) nian=99;break;case 2: yue--;if(yue==0) yue=12; break;case 3: ri--;if((yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)&&ri==0)ri=31;if((yue==4||yue==6||yue==9||yue==11)&&ri==0)ri=30;if(yue==2&&ri==0)ri=29; b reak;case 4: xingqi--;if(xingqi==0) xingqi=7; break;case 5: shi--; if(shi==-1) shi=23; break;case 6: fen--;if(fen==-1)fen=59;break;default : break;}}}}。
单片机原理及应用课程设计电气工程学院一、课程设计任务书1.课程设计项目诺基亚5110液晶显示器应用。
2.设计内容1)设计诺基亚5110液晶显示器应用的总体设计方案;2)以MCS-51系列单片机为核心器件和诺基亚5110液晶显示器组成液晶显示硬件系统;3)系统程序编制与调试;4)电路系统的综合调试;5)撰写课程设计论文;6)完成课程设计论文答辩。
3.设计要求1)以STC89C51单片机为控制核心,对诺基亚5110液晶显示器进行控制。
编程使得在LCD显示器上显示字符,如多行滚动显示:“吉林工程技术师范学院”“电气工程学院”。
等字符,还可以显示别的文字;2)单片机课程设计题目的硬件电路、程序由学生自行设计完成。
3)液晶显示器上要显示出设计人的班级,组长的学号等信息。
4.设计进度(2011年6月13日至2011年6月24日)时间设计内容第1-2天查阅资料,方案比较、设计与论证,理论分析与计算第3-5天硬件电路调试第6-8天系统调试第9-10天书写报告、答辩5.设计地点新实验楼323微机实验室二.参考资料[1]李广弟,朱月秀,王秀山编著.单片机基础. 北京:北京航空航天大学出版社,2001[2] 何立民编著.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:北京航空航天大学出版社,1999[3] 蔡美琴等编著.MCS-51 单片机系统及应用.北京:高等教育出版社.1992二、评语及成绩成绩:指导教师:单片机原理及应用课程设计班级:自动化0845 姓名:刘旭阳学号: 11 号指导教师:方健撰写日期: 2011年6月23日Nokia LCD多功能显示摘要液晶显示器件[1](LCD)是一种高新技术的基础元器件。
它利用液晶的各种电光效应,把液晶对电场、磁场、光线和温度等外界条件的变化在一定条件下转换为可视信号而制成的显示器。
液晶显示器具有低电压、低功耗的特点,与CMOS集成电路相匹配.电池作为电源,适合于便携式显示。
/******************************************************************** NOKIA5110(3310)液晶屏驱动程序** 晶振频率:11.0592M** 线路->单片机实验开发板A******************************************************************/#include/*-- -------定义Nokia5110 引角---- -----*/sbit sclk = P3^3;sbit sdin = P3^4;sbit dc = P3^5;sbit sce = P3^7;sbit res = P3^6;void initNokia5110(void); /* NOkia 5110 初始化*/void clearNokia5110(void); /* 清除屏幕整屏清空*/void Display_char(unsigned char x,unsigned char y,char *s); /* 写字符x 设置显示字符的X位置; y 设置显示字符的Y 位置*s 显示字符的首地址*/void Display_num(unsigned char x,unsigned char y,char s); /* 写数字x 设置显示字符的X位置; y 设置显示字符的Y 位置s 显示数字*/void write_byte(unsigned char data1); /* 发送1字节到NOkia 5110 */void setxy(unsigned char x,unsigned char y); /* 设置显示坐标x 行坐标(0-83) unsigned char y 列坐标(0-5) */void delay(unsigned int time);void main(void){initNokia5110(); /* NOkia 5110 初始化*/clearNokia5110(); /* 清除屏幕整屏清空*/Display_char(1,2,""); /* 写字符x 设置显示字符的X位置; y 设置显示字符的Y位置*s 显示字符的首地址*/Display_char(10,4,"NOKIA5510"); /* 写字符x 设置显示字符的X位置; y 设置显示字符的Y位置*s 显示字符的首地址*///Display_num(0,0,9); // 写数字while(1);}/****************************5110 0-9字模**************************//*函数原型:无/*函数功能:0-9字模/*输入参数:无/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/ unsigned char code asc2tab[][6] ={{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },// sp{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },// !{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },// "{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },// #{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },// ${ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },// %{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },// &{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },// '{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },// ({ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },// ){ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },// *{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },// +{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },// ,{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },// -{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },// .{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },// /{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },// 0{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },// 1{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },// 2{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },// 3 { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },// 4 { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },// 5 { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },// 6 { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },// 7 { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },// 8 { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },// 9 { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },// : { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },// ; { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },// < { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },// = { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },// > { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },// ? { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },// @ { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },// A { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },// B { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },// C { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },// D { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },// E { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },// F { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },// G { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },// H{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },// I { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },// J { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },// K { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },// L { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },// M { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },// N { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },// O { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },// P { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },// Q { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },// R { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },// S { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },// T { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },// U { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },// V { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },// W { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },// X { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },// Y { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },// Z { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },// [ { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },// 55 { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },// ] { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },// ^{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },// _ { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },// ' { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },// a { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },// b { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },// c { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },// d { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },// e { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },// f { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },// g { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },// h { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },// i { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },// j { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },// k { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },// l { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },// m { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },// n { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },// o { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },// p { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },// q { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },// r { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },// s { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },// t{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },// u{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },// v{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },// w{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },// x{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },// y{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },// z{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }};/****************************Nokia5110初始化函数**************************//*函数原型:initNokia5110(void)/*函数功能:Nokia5110初始化/*输入参数:无/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/void initNokia5110(void){delay(10); //系统复位res = 0;delay(2);res = 1;dc = 0;write_byte(0x21); //;芯片是活动的(PD=0) 使用扩展指令集write_byte(0xd5);write_byte(0x20); //;芯片是活动的(PD=0) 使用水平寻址(V=0) 使用基本指令集(H=0) write_byte(0x0c); //;设置显示配置(D=1 E=0)}/****************************Nokia5110清屏函数*********************//*函数原型:void clearNokia5110(void)/*函数功能:Nokia5110清屏/*输入参数:无/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/void clearNokia5110(void){unsigned int i,j;for(i=0;i<6;i++){setxy(j,i);dc = 1;while (j<84){write_byte(0x00);j++;}j = 0;}}/*--------------------------------------;模块名称:Display_char(unsigned char x,unsigned char y,char *s);;功能:写字符;占用资源:;参数说明:x 设置显示字符的X位置; y 设置显示字符的Y位置*s 显示字符的首地址;创建日期:2001.01.19;版本:VER 2.0 ★STALI☆;-------------------------------------*/void Display_char(unsigned char x,unsigned char y,char *s){unsigned char line;setxy(x,y);while(*s){for(line=0;line<6;line++){dc = 1;write_byte(asc2tab[*s - 32][line]);}}sce = 1;}/****************************Nokia5110写数字函数*********************/ /*函数原型:void Display_num(unsigned char x,unsigned char y,char s)/*函数功能:Nokia5110写数字/*输入参数:x 设置显示字符的X位置; y 设置显示字符的Y位置s 显示数字/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/ void Display_num(unsigned char x,unsigned char y,char s){unsigned char line;setxy(x,y);dc = 1;for(line=0;line<6;line++){write_byte(asc2tab[s+16][line]);}sce = 1;}/*************************Nokia5110发送1字节函数*********************/ /*函数原型:void Display_num(unsigned char x,unsigned char y,char s)/*函数功能:发送1字节到NOkia 5110/*输入参数:x 设置显示字符的X位置; y 设置显示字符的Y位置s 显示数字/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/ void write_byte(unsigned char data1){unsigned char i;res = 1;sce = 0;for(i=0;i<8;i++){sdin = (bit) (data1&0x80);;sclk = 1;data1 <<=1;}}/*************************Nokia5110设置显示坐标函数*********************/ /*函数原型:void setxy(unsigned char x,unsigned char y)/*函数功能:设置显示坐标/*输入参数:unsigned char x 行坐标(0-83) unsigned char y 列坐标(0-5)/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/ void setxy(unsigned char x,unsigned char y){dc = 0;write_byte(y|0x40); //设置y轴。
诺基亚5110液晶显示汉字程序默认分类 2009-11-03 21:19 阅读31 评论0字号:大中小包含三个文件,主函数,液晶驱动函数和字符串头文件,用STC单片机在5110液晶上显示“好好学习吧”五个汉字。
提取字模用"Pctolcd2002完美版"软件,字模选项中的设置为列行式+逆向+每行显示16*8+C51格式,可随意更改文字内容。
液晶文件lcd.csbit RST_5110=P1^4; //low activesbit CE_5110=P1^3; //low activesbit DC_5110=P1^2; //0=command,1=datasbit SDI_5110=P1^1; //rise edge enablesbit SCK_5110=P1^0; //clock#define DATA 1#define CMD 0unsigned char code asc2[][6] ={{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // ${ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ({ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ){ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // : { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // < { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // = { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // > { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines};unsigned char code hanzi[][16]={{0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82,0x80,0x00},{0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},/*"好",0*/ {0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82,0x80,0x00},{0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},/*"好",1*/ {0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00}, {0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00},/*"学",2*/ {0x00,0x00,0x02,0x02,0x0A,0x12,0x22,0x62,0x02,0x82,0x82,0x42,0x02,0xFE,0x00,0x00},{0x00,0x00,0x04,0x0C,0x04,0x02,0x02,0x01,0x01,0x00,0x20,0x40,0x80,0x7F,0x00,0x00},/*"习",3*/{0xFE,0x02,0x02,0x02,0xFE,0x00,0xFE,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0xFE,0x00}, {0x07,0x01,0x01,0x01,0x03,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00},/*"吧",0*/};void Delay_us(uchar t)//延时{while(--t);}void Write_Byte_5110(uchar Data ,bit CMD_DATA){uchar i;CE_5110=0; //Enable LCDDC_5110=CMD_DATA;//写命令还是写数据for(i=0;i<8;i++){SCK_5110=0;if(Data & 0x80) //MSB first高位优先SDI_5110=1;//传输1elseSDI_5110=0;//传输0SCK_5110=1;//始终为1时锁存Data<<=1;}SCK_5110=0;//时钟清零CE_5110=1; //disable LCD关液晶使能}void Clear_5110(void){uint i;Write_Byte_5110(0x80,CMD);//写地址for(i=0;i<504;i++){Write_Byte_5110(0x00,DATA);//set the addr as 0x00}}void Set_R_C_5110(uchar R,uchar C) //R=0~5;C=0~83{if(R<=5 && C<=83){Write_Byte_5110(0x40|R,CMD);//写行地址Write_Byte_5110(0x80|C,CMD);//写列地址}}void Init_5110(void){Delay_us(1); //reset LCDRST_5110=0;//复位清零Delay_us(1);RST_5110=1;Write_Byte_5110(0x21,CMD); //扩展指令Write_Byte_5110(0xc8,CMD); //设置偏压Write_Byte_5110(0x20,CMD); //标准指令Clear_5110();Write_Byte_5110(0x0c,CMD); //标准显示模式}void Write_Char_5110(uchar Char){uchar i,j;i=Char-0x20;for(j=0;j<6;j++){Write_Byte_5110(asc2[i][j],DATA);}}void Write_String_5110(uchar *P){uchar i;for(i=0;i<strlen(P);i++){Write_Char_5110(P[i]);}}void Write_hanzis_5110(){uchar i,j;for(i=0;i<10;i=i+2){for(j=0;j<16;j++){Write_Byte_5110(hanzi[i][j],DATA);}}}void Write_hanzix_5110(){uchar i,j;for(i=1;i<10;i=i+2)for(j=0;j<16;j++){Write_Byte_5110(hanzi[i][j],DATA);}}}主函数main.c#include <reg51.h>#include <string.h>#define uchar unsigned char#define uint unsigned int#include"lcd.c"uchar flag,flag1;unsigned char buff[14]="0123456789abcd";unsigned char buff1[14]="---------";void delay(unsigned int z){unsigned int x;unsigned char y;for(x=z;x>0;x--)for(y=20;y>0;y--);}void main(void){delay(500);Init_5110(); //初始化LCD// Write_Byte_5110(0x0c,CMD); //标准显示模式 Set_R_C_5110(1,4);Write_String_5110(buff1);Set_R_C_5110(0,0);Write_String_5110(buff);Set_R_C_5110(2,0);Write_String_5110(buff);// Write_Byte_5110(0x0d,CMD); //反显Set_R_C_5110(3,0);Write_hanzis_5110();Set_R_C_5110(4,0);Write_hanzix_5110();while(1);。
C8051F学习笔记:Nokia 5110驱动Nokia5110是一款经典机型,可能由于经典的缘故,旧机器很多,所以很多电子工程师就把旧机器的屏幕拆下来,自己驱动Nokia5110,用于开发的设备显示,取代LCD1602。
使用Nokia5110液晶的四大理由1)性价比高,LCD1602可以显示32个字符,而Nokia5110可以显示15个汉字,30个字符。
Nokia5110裸屏仅8.8元,LCD1602一般15元左右,LCD12864一般50~70元。
2)接口简单,仅四根I/O线即可驱动,LCD1602需11根I/O线,LCD12864需12根。
3)速度快,是LCD12864的20倍,是LCD1602的40倍。
4)Nokia5110工作电压3.3V,正常显示时工作电流200uA以下,具有掉电模式,适合电池供电的便携式移动设备。
可以在市场上买到Nokia5110的裸屏和带PCB的Nokia5110屏幕,因为Nokia5110是不带背光的,所以通常商家会在PCB上按了几个背光LED,上电就能亮,建议大家还是买那种连上PCB的5110。
Nokia5110原理图:商家把该引出的管脚都引出了,下面就可以连接C8051F的相应管脚,写程序驱动5110了。
Nokia5110和Nokia3110是兼容的,用的都是同一款驱动芯片PHILIPS PCD8544。
(1)SPI接口时序写数据/命令Nokia5110(PCD8544)的通信协议是一个没有MISO只有MOSI的SPI协议,如果单片机有富裕的SPI接口,也可以利用硬件SPI,但通常没有必要,只需要软件程序模拟即可。
/***********************************************************函数名称:LCD_write_byte函数功能:模拟SPI接口时序写数据/命令LCD入口参数:data :写入的数据;command :写数据/命令选择;出口参数:无备注:***********************************************************/void LCD_write_byte(unsigned char dat, unsigned char command){unsigned char i;LCD_CE = 0; //5110片选有效,允许输入数据if (command == 0) //写命令LCD_DC = 0;else LCD_DC = 1; //写数据for(i=0;i<8;i++) //传送8bit数据{if(dat&0x80)SDIN = 1;elseSDIN = 0;SCLK = 0;dat = dat << 1;SCLK = 1;}LCD_CE = 1; //禁止5110}管脚D/C(LCD_DC)用于选择写的是命令(D/C=0)还是数据(D/C=1)。
(2)Nokia5110的初始化接通电源后,内部寄存器和RAM的内容是不确定的,这需要一个RES低电平脉冲复位一下。
当VDD变为高电平,达到VDDmin(或更高)之后,最多100ms,RST输入低电平(电平幅度<0.3VDD)。
5110复位时序/***********************************************************函数名称:LCD_init函数功能:5110初始化入口参数:无出口参数:无备注:***********************************************************/void LCD_init(void){LCD_RST = 0; // 产生一个让LCD复位的低电平脉冲delay_1us();LCD_RST = 1;LCD_CE = 0; // 关闭LCDdelay_1us();LCD_CE = 1; // 使能LCDdelay_1us();LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式LCD_write_byte(0xc8, 0); // 设置液晶偏置电压LCD_write_byte(0x06, 0); // 温度校正LCD_write_byte(0x13, 0); // 1:48LCD_write_byte(0x20, 0); // 使用基本命令,V=0,水平寻址LCD_clear(); // 清屏LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示LCD_CE = 0; // 关闭LCD}(3)设置Nokia5110液晶的坐标Nokia5110(PCD8544)的命令集:命令字符解释:要注意的是“功能设置”命令的“H”和“V”。
H=0使用基本指令集命令,H=1使用扩展指令集命令。
V=0水平寻址,V=1垂直寻址。
48*84点阵的格式如上图,数据以字节8bit为单位下载到PCD8544的48*84bit显示数据RAM矩阵。
列通过地址指针寻址,地址范围为X0~83(1010011),Y 0~5(101)。
地址不允许超过这个范围。
在垂直寻址(V=1),Y地址在每个字节之后递增,经最后的Y地址(Y=5)之后,Y绕回0,X递增到下一列的地址。
在水平寻址模式(V=0),X地址在每个字节之后递增,经最后的X地址(X=83)之后,X绕回0,Y递增到下一行的地址。
经每一个最后地址之后(X=83,Y=5),地址指针绕回地址(X=0,Y=0)。
/***********************************************************函数名称:LCD_set_XY函数功能:设置LCD坐标函数入口参数:X :0-83Y :0-5出口参数:无备注:***********************************************************/void LCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x40 | Y, 0); // columnLCD_write_byte(0x80 | X, 0); // row}(4)显示英文字符英文字符占用6*8个点阵,通过建立一个ASCII的数组font6x8[][6]来寻址。
而这个数字的行号对应(字符ASCII码-32)。
ASCII码表如下:/***********************************************************函数名称:LCD_write_char函数功能:显示英文字符入口参数:c : 显示的字符出口参数:无备注:***********************************************************/void LCD_write_char(unsigned char c){unsigned char line;c -= 32; //数组的行号for (line=0; line<6; line++)LCD_write_byte(font6x8[c][line], 1);}如要在NOKIA5110输出大写“A”,对应数组的行号为33,对应的元素为{ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },水平寻址(V=0)NOKIA5110 一行可以显示14个字符,可以显示六行。
(5)显示汉字显示汉字可以采用两种点阵方式,一种是12*12点阵,一种是16*16点阵,网上也有一个自动提取字模的小软件“3310液晶显示屏汉字提取程序”,这个小程序只适用于水平寻址(V=0)。
3310液晶显示屏汉字提取程序采用12*12点阵汉字时,由于不是8的整数倍数,因此行与行之间只能隔开,这样才能完整显示一个汉字。
//欢{0x0A,0x92,0x62,0x9E,0x02,0x18,0x87,0x74,0x84,0x14,0x0C,0x00,0x02,0x0 1,0x00,0x04,0x05,0x02,0x01,0x00,0x01,0x02,0x04,0x00},12*12点阵(6)显示图形显示的图形像素大小不能超过84*48。
也有一个字模提取小软件Zimo21可以帮助我们得到图像的像素数组。
但要注意Zimo21软件的设置,不然的话就显示不了想要的图片。
Zimo21设置要注意选中“纵向取模”“字节倒序”这样才能在5110上显示正确的图像。
/***********************************************************函数名称:LCD_draw_bmp_pixel函数功能:位图绘制函数入口参数:X、Y :位图绘制的起始X、Y坐标;*map :位图点阵数据;Pix_x :位图像素(长)Pix_y :位图像素(宽)出口参数:无备注:***********************************************************/void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char*map, unsigned char Pix_x,unsigned char Pix_y) {unsigned int i,n;unsigned char row;//计算位图所占行数if (Pix_y%8==0) //如果为位图所占行数为整数row=Pix_y/8;elserow=Pix_y/8+1; //如果为位图所占行数不是整数LCD_set_XY(X,Y);for (n=0;n<row;n++) //换行{for(i=0;i<Pix_x;i++){LCD_set_XY(X+i,Y+n);LCD_write_byte(map[i+n*Pix_x], 1);}}}要显示的图像NOKIA5110显示出来的效果。