仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /***********************************************************************
- 内容:无字库12864测试程序(纵向取模。字节倒序)
- ***********************************************************************/
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define Disp_On 0x3f //显示命令
- #define Disp_Off 0x3e //关闭命令
- #define Col_Add 0x40 //起始列地址
- #define Page_Add 0xb8 //起始页地址
- #define Start_Line 0xc0 //起始行地址
- #define Lcd_Bus P0 //MCU P0<---> LCM
- sbit RS = P2^0; //RS=1时为数据操作,RS=0时为命令操作
- sbit RW = P2^1; //RW=1时为读选通,RW=0时为写选通
- sbit E = P2^2; //E下降沿时,数据写入驱动器,E为高电平时,数据被读出
- sbit Mcs = P2^3; //Master chip E,右半屏-CS2
- sbit Scs = P2^4; //Slave chip E,左半屏-CS1
- sbit RST = P2^5; //液晶模块复位控制管脚
- char code ce[] = {
- /*-- 文字: 测 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08, 0x31, 0x86, 0x60, 0x00, 0xFE, 0x02, 0xF2, 0x02, 0xFE, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00,
- 0x04, 0xFC, 0x03, 0x00, 0x80, 0x47, 0x30, 0x0F, 0x10, 0x67, 0x00, 0x07, 0x40, 0x80, 0x7F, 0x00
- };
- char code shi[] = {
- /*-- 文字: 试 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- …………限于本文篇幅 余下代码请从51黑下载附件…………
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- /*---------------------延时子程序----------------------------*/
- void delay(unsigned int t)
- {
- unsigned int i, j;
- for (i = 0;i < t;i++)
- for (j = 0;j < 10;j++)
- {
- ;
- }
- }
- /*--------------------读忙碌子程序---------------------------*/
- void Read_busy()
- {
- P0 = 0x00;
- RS = 0;
- RW = 1;
- E = 1;
- while(P0&0x80);
- E = 0;
- }
- /*--------------------写命令到LCD----------------------------*/
- void write_com(unsigned char cmdcode)
- {
- Read_busy(); //每次读写都要判断是否忙碌
- RS = 0;
- RW = 0;
- Lcd_Bus = cmdcode;
- delay(0);
- E = 1;
- delay(0);
- E = 0;
- }
- /*-------------------写数据到LCD----------------------------*/
- void write_data(unsigned char Dispdata)
- {
- Read_busy(); //每次读写都要判断是否忙碌
- RS = 1;
- RW = 0;
- Lcd_Bus = Dispdata;
- delay(0);
- E = 1;
- delay(0);
- E = 0;
- }
- /*------------------显示边框-------------------------------*/
- void frame()
- {
- unsigned char i;
- Mcs = 0; //两个屏幕
- Scs = 0;
- /*********************************************************************/
- write_com(Page_Add + 0); //上面横线
- write_com(Col_Add + 0);
- for (i = 0;i < 64;i++) write_data(0x01);
- /*********************************************************************/
- write_com(Page_Add + 7); //下面横线
- write_com(Col_Add + 0);
- for (i = 0;i < 64;i++) write_data(0x80);
- /*********************************************************************/
- for (i = 0;i < 8;i++)
- {
- Mcs = 0; //右半屏
- Scs = 1;
- write_com(Page_Add + i); //共8页
- write_com(Col_Add + 63); //最后一列
- write_data(0xff); //ff表示每页的8行全亮
-
- Mcs = 1; //左半屏与右半屏类似
- Scs = 0;
- write_com(Page_Add + i);
- write_com(Col_Add + 0);
- write_data(0xff);
- }
- }
- /*---------------------------清除内存--------------------------------*/
- void Clr_Scr()
- {
- unsigned char j, k;
- for (k=0;k<8;k++)
- {
- Mcs = 1;Scs = 0;delay(10); //左半屏清屏
- write_com(Page_Add + k);
- write_com(Col_Add + 0);
- for (j = 0;j < 64;j++) write_data(0x00);
- Mcs = 0;Scs = 1; delay(10); //右半屏清屏
- write_com(Page_Add + k);
- write_com(Col_Add + 0);
- for (j = 64;j < 128;j++) write_data(0x00);
- }
- }
- /*------------------显示12864图片---------------------------*/
- void Disp_Img(unsigned char code *img)
- {
- unsigned char j, k;
- for (k = 0;k < 8;k++) //共8页
- {
- Mcs = 1;Scs = 0;delay(10); //左半屏数据
- write_com(Page_Add + k);
- write_com(Col_Add + 0);
- for (j = 0;j < 64;j++) write_data(img[k*128 + j]); //每半块屏共64列
-
- Mcs = 0;Scs = 1; delay(10); //右半屏数据
- write_com(Page_Add + k);
- write_com(Col_Add + 0);
- for (j = 64;j < 128;j++) write_data(img[k*128 + j]);
- }
- }
- /*-------------------------显示横---------------------------*/
- void Disp_H_Line()
- {
- unsigned char i, j;
- Mcs = 0;
- Scs = 0;
- write_com(Disp_On); //显示开
- write_com(Page_Add); //页地址
- write_com(Start_Line); //开始行
- write_com(Col_Add); //列地址
- for (j = 0;j < 8;j++) //共8页,所以循环8次
- {
- write_com(Page_Add + j);
- write_com(Col_Add + 0); //第一列开始
- write_com(Start_Line+0); //第一行开始
- for (i = 0;i < 64;i++)write_data(0x55); //每半屏幕共64列
- }
- }
- /*------------------------显示列-----------------------------*/
- void Disp_V_Line()
- {
- unsigned char i, j;
- write_com(Disp_On); //显示开
- write_com(Page_Add); //页地址
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
LCD12864测试程序.rar
(75.98 KB, 下载次数: 36)
|