|
发表于 2008-9-11 09:08:05
|
显示全部楼层
楼主,我的程序如下,应该没有问题吧,可以正确编译的
#include <mega16.h>
#include <delay.h>
//以下为连接方式 其中PORTC与数据口连接
#define LCD_RS PORTA.3 //即 A0
#define LCD_RW PORTA.4 //WR
#define LCD_CS PORTA.5 //CS1
#define LCD_RES PORTA.6 //RST
#define LCD_E PORTA.7 //RD
//忙检测
void check_busy(void)
{
unsigned char read_data=0xff;
DDRC=0x00;
PORTC=0x00;
LCD_RS=0;
LCD_RW=1; //读命令
LCD_CS=0; //片使能
while(read_data&0x80)
{
LCD_E=1;
#asm("nop");
#asm("nop");
read_data=PORTC;
LCD_E=0;
#asm("nop");
#asm("nop");
}
LCD_E=0;
LCD_CS=1; //片禁能
DDRC=0xFF;
}
//写命令到寄存器
void send_cmd(unsigned char cmd)
{
check_busy();
LCD_RS=0;
LCD_RW=0; //写命令
LCD_CS=0; //片使能
PORTC=cmd;
LCD_E=1;
#asm("nop");
#asm("nop");
LCD_E=0;
#asm("nop");
#asm("nop");
LCD_CS=1; //片禁能
}
//写数据到DDRAM
void send_dat(unsigned char dat)
{
check_busy();
LCD_RS=1;
LCD_RW=0; //写数据
LCD_CS=0; //片使能
PORTC=dat;
LCD_E=1;
#asm("nop");
#asm("nop");
LCD_E=0;
#asm("nop");
#asm("nop");
LCD_CS=1; //片禁能
}
//初始化 设置LCD的控制电压, 行 列 页的初始化
void lcd_initial(void)
{
LCD_RES=1; //复位,延时50ms
delay_ms(50);
send_cmd(0xE2); //internal reset
send_cmd(0xA3); //LCD bias set 1/7 bias
send_cmd(0xA0); //ADC select normal
send_cmd(0xC8); //Common output mode select reverse direction
send_cmd(0x24); //V0 voltage regulator internal resistor ratio set V0 调压器内部电阻率设定(控制对比度,后三位)
send_cmd(0x81); //electronic voltage mode set 亮度调整,下一命令是它的具体值
send_cmd(0x14); // 后6位
send_cmd(0x2C); //power control set
send_cmd(0x2E); //from 0x28 to 0x2F
send_cmd(0x2F); //
send_cmd(0x40); //Display start line set
send_cmd(0xB0); //page address set
send_cmd(0x10); //column address set upper bit
send_cmd(0x00); //column address set lower bit
send_cmd(0xAF); //Display ON
}
void clearLCD(void)
{
unsigned char page,seg;
for(page=0xb0;page<0xb8;page++)
{
send_cmd(page);
send_cmd(0x10); /*列地址高位,D4位为1表示高位地址*/
send_cmd(0x00); /*列地址低位,D4位为0表示低位地址*/
for(seg=0;seg<128;seg++)
{
send_dat(0xFF);
}
}
}
// 16*16电阵函数//
unsigned char a1[32]={0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00}; //汉字 “我” 的点阵数据 ,使用 纵向取模 字节倒序
unsigned char a2[32]={0x10,0x80,0x10,0x80,0x20,0x80,0x7C,0xFC,0x45,0x04,0x45,0x04,0x46,0x04,0x7C,0x84,0x44,0x44,0x44,0x64,0x44,0x24,0x44,0x04,0x7C,0x04,0x44,0x28,0x40,0x10,0x00,0x00}; //汉字 的
unsigned char a3[32]={0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x04,0x80,0x08,0x3F,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0xF8,0x01,0x40,0x01,0x20,0x01,0x30,0x01,0x20,0x7F,0xFE,0x00,0x00};
unsigned char a4[32]={0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x02,0x80,0x04,0x60,0x18,0x18,0x60,0x08,0x00,0x00};
unsigned char a5[32]={0x23,0xF8,0x10,0x48,0x80,0x48,0x4A,0x8C,0x12,0x8A,0xE1,0x0A,0x22,0x28,0x2D,0x10,0x01,0x00,0xFF,0xFE,0x03,0x80,0x05,0x40,0x09,0x30,0x31,0x0E,0xC1,0x04,0x01,0x00};
unsigned char a6[32]={0x00,0x00,0x3F,0xF0,0x08,0x10,0x0B,0xA0,0x08,0xB8,0x12,0x88,0x11,0x08,0x22,0x88,0x44,0x50,0x80,0x20,0x3F,0xF8,0x24,0x48,0x24,0x48,0x24,0x48,0xFF,0xFE,0x00,0x00};
void disphz(unsigned char pages,unsigned char line,unsigned char * zfdz)
{ // pages页参数可取(0-7),line 列参数可取(0-111),zfdz 点阵指针
unsigned char page,seg,zi,j;
bit ix=0;
for(page=0;page<2;page++)
{
send_cmd(page+0xb0+pages);
j = line & 0xf0;
j = j/16;
send_cmd(0x10|j); /*列地址高位,D4位为1表示高位地址*/
send_cmd(0x0f&line); /*列地址低位,D4位为0表示低位地址*/
zi=0;
for(seg=0;seg<16;seg++)
{
if(ix)
zi=16;
send_dat(zfdz[seg+zi]);
}
ix=!ix;
}
}
void main(void)
{
PORTA=0x00;
DDRA=0x8F;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
lcd_initial(); //LCD初始化
clearLCD(); //清屏
while (1)
{
disphz (3,20,a1);
disphz (3,40,a2);
disphz (3,60,a3);
disphz (3,80,a4);
disphz (3,100,a5);
disphz (3,120,a6);
};
} |
|