图10 电路设计图
3 程序设计
3.1 keil简介
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
3.2 程序流程图
基于单片机的12864液晶显示软件设计主要由显示子程序、读出并处理12864LCD显示程序等组成。为了充分发挥AT89C51优越的性能价格比,系统软件采用C语言编写以增强系统的实时性。在设计上尽量做到硬件“软化”,使系统硬件设计得到简化。程序流程图如图11所示。
15
开 始 LCD初始化 检测忙信号 左写指令子程序 左写数据子程序 右写指令子程序 右写数据子程序 LCD显示 清屏程序 延时程序 结 束
图11 程序流程图
3.3 12864LCD主程序
3.3.1 引脚定义 sbit RS=P1^0; sbit RW=P1^1; sbit EN=P1^2;
//RS为0---命令;1----数据 //RW为1---写;0---读 //使能端
sbit CS1=P2^1; //片选1低电平有效,控制左半屏 sbit CS2=P2^0; //片选1低电平有效,控制右半屏 sbit KEY1=P3^0; sbit KEY2=P3^1;
16
sbit KEY3=P3^2;
sbit KEY4=P3^3; //四个按键控制口 3.3.2读写操作 uchar Read_LCD(void) { }
void write_LCD_data(uchar dat)//写数据函数 {
Read_busy(); RS=1; RW=0;
17
//读数据函数
uchar value; Read_busy(); LCD_databus=0xFF; RS=1; RW=1; EN=1; _nop_(); _nop_(); EN=0;
LCD_databus=0xFF; RS=1; RW=1; EN=1;
value=LCD_databus; _nop_(); _nop_(); EN=0; return value;
//读取真正的数据
//先进行一次空读操作
//选择数据
LCD_databus=dat; EN=1; _nop_(); _nop_(); EN=0; }
3.3.3 设置指令
void Set_page(uchar page) 行点阵点 {
page=0xb8|page;
//页的首地址为0xB8
//设置“页”LCD12864共8页,一页是8
//EN由1----0锁存有效数据
write_LCD_command(page); }
void Set_line(uchar startline) //设置显示的起始行 {
startline=0xC0|startline; //起始行地址为0xC0
write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示 }
void Set_column(uchar column) //设置显示的列 {
column=column &0x3f; column= 0x40|column;
//列的最大值为64 //列的首地址为0x40 //规定显示的列的位置
write_LCD_command(column); }
void SetOnOff(uchar onoff) 开显示
//显示开关函数:0x3E是关显示,0x3F是
18
{
onoff=0x3e|onoff;
//onoff:1---开显示;0---关显示
write_LCD_command(onoff);
3.3.4 图形及汉字显示函数
void Display_HZ(uchar screen,uchar page,uchar column,uchar *p) {
uchar i;
SelectScreen(screen); Set_page(page);
//写上半页:16*8 //控制列
//控制16列的数据输出
Set_column(column*16); for(i=0;i<16;i++) { }
Set_page(page+1);
write_LCD_data(p[i]); //汉字的上半部分
//写下半页:16*8
//控制列
//控制16列的数据输出
Set_column(column*16);
for(i=0;i<16;i++) }
{ }
write_LCD_data(p[i+16]); //汉字的下半部分
void Display_picture(uchar a[][64])//显示图形—128*64大小 {
uchar i,j;
for(j=0;j<8;j++) {
SelectScreen(1); Set_page(j);
19