hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 400|回复: 0

自学AVR单片机二十七(Nokia33105110液晶显示)

[复制链接]

494

主题

494

帖子

1506

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1506
发表于 2024-2-28 10:55:00 | 显示全部楼层 |阅读模式
一、电路实现
本实例的电路图如下:

二、Nokia3310/5110液晶介绍
        Nokia3310/5110液晶的驱动控制器为PCD8544,它可以驱动48行*84列的图形显示,3310液晶的工作电压为2.7-3.3V,所以在上面的电路图中我们使用了3.3V的稳压管。另外由于单片机系统采用的是5V工作电压,并且LCD与单片机之间的连线都串接了电阻,整个系统上电后,测量电阻两端电压,会发现电阻两端有压降,这是因为单片机I/O口出来的是5V电压信号,而LCD上只能接受3.3V电压,所以电阻上产生压降。
        3310液晶模块有8个引脚,由于购买厂家不同,引脚的排列也有差别,8个引脚等别是:
电源正;电源地;背景灯正;背景灯负;复位脚;时钟线;数据线;使能线;数据/命令选择线。
      3310液晶支持SPI功能,可以直接使用AVR单片机的SPI来驱动3310液晶显示。本实例中我们采用模拟SPI功能实现。

三、程序代码
  1. #include <avr/io.h> #include <util/delay.h>#include "LCD5110.h" //函数声明void Delayus(unsigned int lus); //us延时函数void Delayms(unsigned int lms); //ms延时函数int main(void) { PORTB &= ~(RESET | DC | SCLK | SDIN); DDRB |= RESET | DC | SCLK | SDIN; //设置单片机的4个LCD引脚输出0 while(1) { lcd_init(); //lcd初始化 lcd_cls(); //清屏,光标回位 lcd_gotoxy(16,2); //光标定位到第16列,第1行(最上面是0行) lcd_putsf("NOKIA5110",9); //显示Flash里面的字符串,共9个 lcd_gotoxy(38,4); lcd_putchar('O'); //显示英文字母大写O lcd_putchar(75); //数字75的的ASCII字符是英文字母大写K Delayms(1000); } }//us级别的延时函数void Delayus(unsigned int lus){while(lus--){_delay_loop_2(3); //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12//个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us}}//ms级别的延时函数void Delayms(unsigned int lms){while(lms--){Delayus(1000); //延时1ms}}5110.h程序文件/*******************************************lcd5110.h*******************************************//************************************************************* 5110LCD与单片机的连接如下 RESET PB4 D/C PB2 SDIN PB1 SCLK PB0 SCE GND 英文字库,5*8点阵,每一个字符占用5个字节,共94个可显示字符数据**/ #define RESET (1 << PB4) //RESET=0时,LCD复位 #define DC (1 << PB2) //DC=0_指令,DC=1_数据 #define SDIN (1 << PB1) #define SCLK (1 << PB0) #define SET_RESET (PORTB |= RESET) #define CLR_RESET (PORTB &= ~RESET)#define SET_DC (PORTB |= DC) #define CLR_DC (PORTB &= ~DC)#define SET_SDIN (PORTB |= SDIN)#define CLR_SDIN (PORTB &= ~SDIN)#define SET_SCLK (PORTB |= SCLK)#define CLR_SCLK (PORTB &= ~SCLK)unsigned char data[]={ 0x00, 0x00, 0x00, 0x00, 0x00, // sp 0x00, 0x00, 0x2f, 0x00, 0x00, // ! 0x00, 0x07, 0x00, 0x07, 0x00, // " 0x14, 0x7f, 0x14, 0x7f, 0x14, // # 0x24, 0x2a, 0x7f, 0x2a, 0x12, // $ 0x62, 0x64, 0x08, 0x13, 0x23, // % 0x36, 0x49, 0x55, 0x22, 0x50, // & 0x00, 0x05, 0x03, 0x00, 0x00, // ’ 0x00, 0x1c, 0x22, 0x41, 0x00, // ( 0x00, 0x41, 0x22, 0x1c, 0x00, // ) 0x14, 0x08, 0x3E, 0x08, 0x14, // * 0x08, 0x08, 0x3E, 0x08, 0x08, // + 0x00, 0x00, 0xA0, 0x60, 0x00, // , 0x08, 0x08, 0x08, 0x08, 0x08, // - 0x00, 0x60, 0x60, 0x00, 0x00, // . 0x20, 0x10, 0x08, 0x04, 0x02, // / 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 0x00, 0x42, 0x7F, 0x40, 0x00, // 1 0x42, 0x61, 0x51, 0x49, 0x46, // 2 0x21, 0x41, 0x45, 0x4B, 0x31, // 3 0x18, 0x14, 0x12, 0x7F, 0x10, // 4 0x27, 0x45, 0x45, 0x45, 0x39, // 5 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6 0x01, 0x71, 0x09, 0x05, 0x03, // 7 0x36, 0x49, 0x49, 0x49, 0x36, // 8 0x06, 0x49, 0x49, 0x29, 0x1E, // 9 0x00, 0x36, 0x36, 0x00, 0x00, // : 0x00, 0x56, 0x36, 0x00, 0x00, // ; 0x08, 0x14, 0x22, 0x41, 0x00, // < 0x14, 0x14, 0x14, 0x14, 0x14, // = 0x00, 0x41, 0x22, 0x14, 0x08, // > 0x02, 0x01, 0x51, 0x09, 0x06, // ? 0x32, 0x49, 0x59, 0x51, 0x3E, // @ 0x7C, 0x12, 0x11, 0x12, 0x7C, // A 0x7F, 0x49, 0x49, 0x49, 0x36, // B 0x3E, 0x41, 0x41, 0x41, 0x22, // C 0x7F, 0x41, 0x41, 0x22, 0x1C, // D 0x7F, 0x49, 0x49, 0x49, 0x41, // E 0x7F, 0x09, 0x09, 0x09, 0x01, // F 0x3E, 0x41, 0x49, 0x49, 0x7A, // G 0x7F, 0x08, 0x08, 0x08, 0x7F, // H 0x00, 0x41, 0x7F, 0x41, 0x00, // I 0x20, 0x40, 0x41, 0x3F, 0x01, // J 0x7F, 0x08, 0x14, 0x22, 0x41, // K 0x7F, 0x40, 0x40, 0x40, 0x40, // L 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M 0x7F, 0x04, 0x08, 0x10, 0x7F, // N 0x3E, 0x41, 0x41, 0x41, 0x3E, // O 0x7F, 0x09, 0x09, 0x09, 0x06, // P 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q 0x7F, 0x09, 0x19, 0x29, 0x46, // R 0x46, 0x49, 0x49, 0x49, 0x31, // S 0x01, 0x01, 0x7F, 0x01, 0x01, // T 0x3F, 0x40, 0x40, 0x40, 0x3F, // U 0x1F, 0x20, 0x40, 0x20, 0x1F, // V 0x3F, 0x40, 0x38, 0x40, 0x3F, // W 0x63, 0x14, 0x08, 0x14, 0x63, // X 0x07, 0x08, 0x70, 0x08, 0x07, // Y 0x61, 0x51, 0x49, 0x45, 0x43, // Z 0x00, 0x7F, 0x41, 0x41, 0x00, // [ 0x55, 0x2A, 0x55, 0x2A, 0x55, // 55 0x00, 0x41, 0x41, 0x7F, 0x00, // ] 0x04, 0x02, 0x01, 0x02, 0x04, // ^ 0x40, 0x40, 0x40, 0x40, 0x40, // _ 0x00, 0x01, 0x02, 0x04, 0x00, // ’ 0x20, 0x54, 0x54, 0x54, 0x78, // a 0x7F, 0x48, 0x44, 0x44, 0x38, // b 0x38, 0x44, 0x44, 0x44, 0x20, // c 0x38, 0x44, 0x44, 0x48, 0x7F, // d 0x38, 0x54, 0x54, 0x54, 0x18, // e 0x08, 0x7E, 0x09, 0x01, 0x02, // f 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // g 0x7F, 0x08, 0x04, 0x04, 0x78, // h 0x00, 0x44, 0x7D, 0x40, 0x00, // i 0x40, 0x80, 0x84, 0x7D, 0x00, // j 0x7F, 0x10, 0x28, 0x44, 0x00, // k 0x00, 0x41, 0x7F, 0x40, 0x00, // l 0x7C, 0x04, 0x18, 0x04, 0x78, // m 0x7C, 0x08, 0x04, 0x04, 0x78, // n 0x38, 0x44, 0x44, 0x44, 0x38, // o 0xFC, 0x24, 0x24, 0x24, 0x18, // p 0x18, 0x24, 0x24, 0x18, 0xFC, // q 0x7C, 0x08, 0x04, 0x04, 0x08, // r 0x48, 0x54, 0x54, 0x54, 0x20, // s 0x04, 0x3F, 0x44, 0x40, 0x20, // t 0x3C, 0x40, 0x40, 0x20, 0x7C, // u 0x1C, 0x20, 0x40, 0x20, 0x1C, // v 0x3C, 0x40, 0x30, 0x40, 0x3C, // w 0x44, 0x28, 0x10, 0x28, 0x44, // x 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // y 0x44, 0x64, 0x54, 0x4C, 0x44, // z 0x00, 0x08, 0x36, 0x41, 0x00, // { 0x00, 0x00, 0x7F, 0x00, 0x00, // | 0x00, 0x41, 0x36, 0x08, 0x00, // } 0x08, 0x10, 0x08, 0x04, 0x08 // ~ }; //======================================================================================= void lcd_write(unsigned char byte) //写LCD函数,模拟SPI通信 { unsigned char i;for(i = 128;i > 0;i >>=1){if(byte & i){SET_SDIN;}else{CLR_SDIN;}CLR_SCLK;SET_SCLK;}/*unsigned char i; //先写数据的高位,后写低位 for(i=128;i>0;i>>=1) { if( byte & i ) SDIN=1; else SDIN=0; SCLK=0; SCLK=1; } */ } /*上面的是模拟SPI发送数据函数,下面的是硬件SPI发送数据函数 void lcd_write(unsigned char data) { SPCR=80; SPDR=data; //开始发送数据 while((SPSR>>7)==0); //等待发送接收结束 } */ //======================================================================================= void lcd_cls(void) //nokia3310清屏,光标复位 { unsigned int i=0; CLR_DC;//DC=0; lcd_write(128); //光标回到0列 lcd_write(64); //光标回到0行 SET_DC;//DC=1; //准备写数据 for(i=0;i<504;i++) //写504个0数据,就是清屏 lcd_write(0); } //======================================================================================= void lcd_init(void) //nokia3310初始化函数 { CLR_RESET;SET_RESET;CLR_DC;//RESET=0; //RESET=1; //复位结束 // DC=0; //准备写指令 lcd_write(32+1); //进入扩展指令 lcd_write(128+38); //设置Vop,相当于亮度 lcd_write(4+3); //设置温度系数,相当于对比度 lcd_write(16+3); //设置偏置,这句要与不要的实际效果好像一样 lcd_write(32+0); //进入基本指令 lcd_write(12); //使能芯片活动/垂直寻址 } //======================================================================================= //光标定位,x(0-83)是列地址,y(0-5)是行地址 void lcd_gotoxy(unsigned char x,unsigned char y) { CLR_DC;//DC=0; lcd_write(x+128); lcd_write(y+64); } //======================================================================================= void lcd_putchar(unsigned char character) //显示ASCII值的字符 { unsigned char i=0; unsigned int No; No=character-32; //字模数据是由空格开始,空格字符的ASCII的值就是32 No=No*5; //每个字符的字模是5个字节 SET_DC;//DC=1; while(i<5) //一个字符的字模是5个字节,就是5*8点阵 { lcd_write(data[No]); i++; No++; } lcd_write(0); //每个字符之间空一列 } //===================================================================================== void lcd_putsf(unsigned char *string , unsigned char n) //显示FLASH里面的字符串 { unsigned char i=0; while(i<n) { lcd_putchar(string); //顺序显示字符 i++; } }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-2 15:20 , Processed in 0.069030 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表