出于爱好,喜欢单片机而进行的学习,将学习过程发出来进行交流。如有不妥的地方,也希望大家可以指正,多谢。软件版本:proteus8.9,keil uvision5
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
显示结果:
图片及字体取模
附件中含详细的代码及C源文件,及显示的控制芯片的手册及个人记录的相应芯片操作指令。
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include<stdlib.h>
- #define uchar unsigned char
- #define uint unsigned int
- //定义端口
- sbit A0=P2^0; //定义端口是传输命令还是数据,
- sbit RW=P2^1;//定义端口是读取还是写入,
- sbit LCDEN=P2^2;//芯片使能启动
- sbit RST=P2^3;//复位键
- uchar code dis1[]={/*-- 文字: 我 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,
- 0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00};
- uchar code dis2[]={
- /*-- 文字: 爱 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x80,0x64,0x2C,0x34,0x24,0x24,0xEC,0x32,0x22,0x22,0x32,0x2E,0x23,0xA2,0x60,0x00,
- 0x00,0x41,0x21,0x91,0x89,0x87,0x4D,0x55,0x25,0x25,0x55,0x4D,0x81,0x80,0x80,0x00};
- 中间省略 见附件
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00
- };
- /*******************************************************************************
- * 函 数 名 : delay_ms,
- * 函数功能 : 毫秒延时程序
- * 输 入 : 输入延时时间长度,单位为毫秒
- * 输 出 : 无
- *******************************************************************************/
- void delay_ms(uint x)
- {
- uint i,j;
- for (j=0;j<x;j++)
- for(i=0;i<110;i++);
- }
- /*******************************************************************************
- * 函 数 名 : write_com
- * 函数功能 : LCD写指令程序
- * 输 入 : 输入LCD对应的设置指令代码
- * 输 出 : 对LCD进行相应的设置
- *******************************************************************************/
- void write_com(uchar cmd)
- {
- A0=0;
- RW=0;
- LCDEN=1;
- P0=cmd;
- _nop_();
- LCDEN=0;
- RW=1;
- }
- /*******************************************************************************
- * 函 数 名 : write_dat
- * 函数功能 : LCD写数据程序
- * 输 入 : 向LCD写入对应的数据或代码
- * 输 出 : 对LCD数据输入显示
- *******************************************************************************/
- void write_dat(uchar dat)
- {
- A0=1;
- RW=0;
- LCDEN=1;
- P0=dat;
- _nop_();
- LCDEN=0;
- RW=1;
- }
- /*******************************************************************************
- * 函 数 名 : LCD_Initial
- * 函数功能 : 对LCD进行初始化
- * 输 入 : 对LCD的初始状态进行配置
- * 输 出 : 无
- *******************************************************************************/
- /*LCD初始化*/
- void LCD_Initial()
- {
- RST=0;
- delay_ms(10);
- RST=1;
- delay_ms(10);
- write_com(0xa2); //1/9 bias set
- write_com(0xa1); //adc=0,正常从左到右显示
- write_com(0xc8); //COM颠倒输出,,Startline0在上侧,Com0 在上侧
- write_com(0xae); //Display_Hanzi 0ff
- write_com(0xaf); //Display_Hanzi on
-
- }
- /*******************************************************************************
- * 函 数 名 : Display_Hanzi
- * 函数功能 : 在指定的行与列写入对应的汉字
- * 输 入 : a对应的是写入位置的页,b对应写入字符的列,c为写入的汉字代码数组,汉字的宽度为16,
- 则在对高四位来进行设定的时候,直接用0x10与其列数进行与操作,高四位的变化范围只能
- 为0-7,满足128列的范围。
- * 输 出 : 在屏幕上显示要输出的内容
- *******************************************************************************/
- void Display_Hanzi(int a,int b,uchar *c)
- {
- int n;
- for(n=0;n<=15;n++)
- {
- write_com(a); //选择a页
- _nop_();
- write_com(0x10|b); //由于字符特征,直接选取对应的高位进行设置。
- _nop_();
- write_com(0x00|n);
- _nop_();
- write_dat(c[n]);
- _nop_();
-
- write_com(1+a); //选择a+1页
- _nop_();
- write_com(0x10|b);//列的高四位
- _nop_();
- write_com(0x00|n);//列的低四位
- _nop_();
- write_dat(c[n+16]);
- _nop_();
- }
-
- }
-
- /*******************************************************************************
- * 函 数 名 : Display_SC
- * 函数功能 : 在指定的行与列写入对应的单字节字符
- * 输 入 : a对应的是写入位置的页,b对应写入字符的列,c为写入的汉字代码数组
- * 输 出 : 在屏幕上显示要输出的内容
- *******************************************************************************/
- void Display_SC(int a,int b,uchar *c)
- {
- int n;
- int C_high,C_low;
- C_high = (b&0xF0)>>4;//选择列的高四位
- C_low = (b&0x0F); //列的低四位
- for(n=0;n<=7;n++)
- {
- write_com(a); //选择a页
-
- write_com(0x10|C_high);//列的高四位
- write_com((0x00|C_low)+n);//列的低四位
- write_dat(c[n]);
-
- write_com(1+a); //选择a+1页
- write_com(0x10|C_high);//列的高四位
- write_com((0x00|C_low)+n);//列的低四位
- write_dat(c[n+8]);
- }
-
- }
- /*******************************************************************************
- * 函 数 名 : Display_BMP
- * 函数功能 : 显示图片的内容,图片大小为128*64
- * 输 入 : 输入对应的代码数组
- * 输 出 : 在屏幕上显示要输出的图片内容
- *******************************************************************************/
- void Display_BMP(uchar *bmp)
- {
- int i=0; //页码,0-7页
- int j=0; //列数,0-127列,对应一行的像素数
- int C_high,C_low,C_COLUMN;
- {
- for(i=0;i<8;i++)
- {
- write_com(0xb0+i);//写入页数
-
- C_COLUMN=0x00;
-
- for (j=0;j<128;j++)
- {
- if(j<128)
- {
-
- C_high = ((C_COLUMN+j)&0xF0)>>4;//选择列的高四位
- C_low = ((C_COLUMN+j)&0x0F); //列的低四位
- write_com(0x10|C_high);//列的高四位
- write_com(0x00|C_low);//列的低四位
-
- write_dat(bmp[i*128+j]);}
- else
- {
- C_COLUMN=0X00;
-
- }
-
- }
- }
-
- }
- }
-
-
- main()
- {
- LCD_Initial();
-
-
- while(1)
-
- {
-
- Display_Hanzi(0xb0,0x00,dis1);
- Display_Hanzi(0xb0,0x01,dis2);
- Display_Hanzi(0xb0,0x02,dis3);
- Display_Hanzi(0xb0,0x03,dis4);
- Display_Hanzi(0xb0,0x04,dis5);
- Display_Hanzi(0xb0,0x05,dis6);
- Display_Hanzi(0xb0,0x06,dis7);
-
- Display_Hanzi(0xb2,0x00,dis21);
- Display_Hanzi(0xb2,0x01,dis22);
- Display_Hanzi(0xb2,0x02,dis23);
-
- Display_SC(0xb4,0x00,dis30);
- Display_SC(0xb4,0x08,dis31);
- Display_SC(0xb4,16,dis32);
- Display_SC(0xb4,24,dis33);
- Display_SC(0xb6,0,dis40);
- Display_SC(0xb6,8,dis41);
- Display_SC(0xb6,16,dis42);
- Display_SC(0xb6,24,dis43);
-
- delay_ms(2000);
-
- Display_BMP(img);
-
-
- delay_ms(2000);
- Display_BMP(C_Clear);
-
- }
-
-
- }
复制代码
所有资料51hei提供下载:
12864 Display.zip
(1.82 MB, 下载次数: 66)
|