//ICC-AVR application builder : 2010-9-5 16:54:57
// Target : M16
//12864驱动
// Crystal: 4.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
#define com 0
#define dat 1
#define lcdbus PORTA
#define rs 1
#define rw 2
#define e 3
#define psb 4
#define rst 5
//PortB为控制位线端
#define setb(x) (PORTB|=(1<<x))
#define clr(x) (PORTB&=~(1<<x))
uchar ac; //为字符位置,80H~9fH
uchar ramH,ramL; //为绘图16位全局变量
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/******************************************************************************************
* 函数名称 :微妙延时
******************************************************************************************/
void delayus(uint us)
{
while(us--);
}
/******************************************************************************************
* 函数名称 :毫秒延时
******************************************************************************************/
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<30;j++)
delayus(1);
}
/******************************************************************************************
* 函数名称 :chk_busy
******************************************************************************************/
void chk_busy(void)
{
delayus(30);//看情况,可以在这里榨取时间
}
/******************************************************************************************
* 函数名称 :wr_lcd
******************************************************************************************/
void wr_lcd(uchar data,uchar content)
{
chk_busy();
if(data)
{
setb(rs); //data
clr(rw); //write
}
else
{
clr(rs); //command
clr(rw); //write
}
lcdbus=content;
setb(e);
; //output data or comm
clr(e);
}
/******************************************************************************************
* 函数名称 :clrchar
* 功能描述 : 清文字
******************************************************************************************/
void clrchar(void)
{
wr_lcd(com,0x30);
wr_lcd(com,0x01);
}
/******************************************************************************************
* 函数名称 :init_lcd
* 功能描述 : LCD初始化
******************************************************************************************/
void init_lcd(void)
{
delay(40);
clr(rst);
delayus(40);
setb(rst); //复位完成
setb(psb); //并口
wr_lcd(com,0b00110000); //八位,基本指令动作
delay(10);
wr_lcd(com,0b00001100); //开显示
delay(10);
wr_lcd(com,0b00000001); //清屏
delay(100);
wr_lcd(com,0b00000110); //光标右移
delay(10);
clrchar();
}
/******************************************************************************************
* 函数名称 :readram
* 功能描述 :读LCD内RAM数据,保存在 全局变量 ramH and ramL.
******************************************************************************************/
void readram(uchar x,uchar y)
{
//delay(5);
wr_lcd(com,0x34); //选择扩充指令
if(y>31)//行的调整
{
x += 8;
y -= 32;
}
wr_lcd(com,0x80+y);//写入行(0~63)
wr_lcd(com,0x80+x);//写入列(0~8)
wr_lcd(com,0x30);//换回基本指令
DDRA = 0x00;//设置为输入
//不知道读第一遍的数据是什么,可能是地址
chk_busy();
setb(rs);
setb(rw);
setb(e);
//No delay
clr(e);
//开始读高位
chk_busy();
setb(rs);
setb(rw);
setb(e);
//No delay
clr(e);
ramH = PINA;
//开始读低地位
chk_busy();
setb(rs);
setb(rw);
setb(e);
//No delay
clr(e);
ramL = PINA;
DDRA = 0xFF;//设置回输出
}
/******************************************************************************************
* 函数名称 :lcd16
* 功能描述 :显示16位数据
******************************************************************************************/
void lcd16(uchar H,uchar L,uchar row,uchar y)
{
//delay(5); //有错误时加上延时
wr_lcd(com,0x34); //选择扩充指令
if(y>31)//行的调整
{
row += 8;
y -= 32;
}
wr_lcd(com,0x80+y);//写入行(0~63)
wr_lcd(com,0x80+row);//写入列(0~8)
wr_lcd(com,0x30);//换回基本指令
//开始写数据
wr_lcd(dat,H);
wr_lcd(dat,L);
wr_lcd(com,0x36);//显示
}
/******************************************************************************************
* 函数名称 :lcdimg
* 功能描述 : 显示整屏图片
******************************************************************************************/
void lcdimg(const uchar *img)
{
uchar i,j;
uint x=0;
for(j=0;j<64;j++)
{
delay(5);
wr_lcd(com,0x34);//选择扩充指令
if(j<32)//在第一或第二行时
{
wr_lcd(com,0x80+j);//写入行
wr_lcd(com,0x80);//列是零
}
else//在第三或第四行时
{
wr_lcd(com,0x60+j);
wr_lcd(com,0x88);
}
wr_lcd(com,0x30);//换回基本指令
for(i=0;i<8;i++)
{
wr_lcd(dat,img[x++]);//连续写入一个16位数据
wr_lcd(dat,img[x++]);
}
}
wr_lcd(com,0x36);//显示
}
/******************************************************************************************
* 函数名称 :fillcd
* 功能描述 :填充LCD
******************************************************************************************/
void fillcd(uchar bit)
{
uchar i,j;
for(j=0;j<32;j++)
{
delay(5);
wr_lcd(com,0x34);
wr_lcd(com,0x80+j);
wr_lcd(com,0x80);
wr_lcd(com,0x30);
for(i=0;i<16;i++)
{
wr_lcd(dat,bit);
wr_lcd(dat,bit);
}
}
wr_lcd(com,0x36);
}
/******************************************************************************************
* 函数名称 :lcdout
* 功能描述 : 显示文字
******************************************************************************************/
void lcdout(uchar *chn)
{
uchar x=0;
wr_lcd(com,0x30); //功能设定
//delay(5); //非得延时一下才能正常显示
while(chn[x])
{
if(ac == 0x08)//行调整
ac += 0x08;
else if(ac == 0x18)
ac -= 0x10;
else if(ac == 0x10)
ac += 0x08;
wr_lcd(com,0x80+ac);
wr_lcd(dat,chn[x]); //写数据到LCD,每次写两组
wr_lcd(dat,chn[++x]);
x++;
ac++;
if(ac == 0x20) ac=0;
}
}
/******************************************************************************************
* 函数名称 :lcddot
* 功能描述 :描定点
******************************************************************************************/
void lcddot(uchar x,uchar y)
{
uchar row = 0;
uchar dotH = 0,dotL = 0;
while(x>15)//列调整
{
x -= 16;
row++;
}
if(x < 8)//位调整
dotH = 0x80 >> x;
else
dotL = 0x80 >> x-8;
readram(row,y);
ramH |= dotH;//和全局16位的数据相或
ramL |= dotL;
lcd16(ramH,ramL,row,y);
}
/*
const uchar image[]= {
0x00,0x10,0x00,0x00,0x02,0x00,0x02,0x09,0x00,0x00,0x00,0x00,0x00,0x01,0x7F,0xBD,0x55,0xA5,0x40,0x00,0xB5,0x55,0x59,0x60,0xA8,0x91,0x40,0x00,0x00,0x08,0xA8,0xC5,
0x28,0x02,0x80,0x0A,0x48,0xA2,0x2A,0x96,0x42,0x44,0x14,0x00,0x01,0x04,0x57,0x5A,0x8B,0xFD,0x60,0x82,0x56,0x52,0x8A,0xA9,0x29,0x10,0x82,0x88,0x00,0x42,0x91,0x6D,
0xE9,0x2A,0x80,0x12,0x55,0x52,0xAB,0x55,0xA8,0x8C,0x50,0x01,0x20,0x00,0xDD,0x57,0x5E,0xD5,0x50,0x49,0x2A,0xAC,0xD5,0x5E,0xAD,0x62,0x00,0x00,0x00,0x02,0x7F,0xFF,
0x6B,0xBF,0x40,0x24,0xCA,0xB3,0x5D,0x71,0x52,0x88,0xAA
M16+12864驱动程序
需积分: 12 19 浏览量
2010-09-16
16:05:05
上传
评论
收藏 4KB RAR 举报
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
chinashanlang
- 粉丝: 0
- 资源: 2
最新资源
- 串口调试工具,用于模拟虚拟串口之间传输
- DotNetBar布局
- 智能垃圾分类系统案例介绍:结合Java和图像识别技术,设计智能垃圾分类系统,实现自动识别和分类垃圾
- 智能客服机器人案例介绍:开发基于Java的智能客服机器人,实现自动回答用户问题和提供服务
- tinymce 多图片批量上传插件
- Virtualized Hadoop Performance with VMware vSphere 6 on Servers
- 智能电商推荐系统案例介绍:开发基于Java的智能电商推荐系统,根据用户购买行为和偏好进行个性化推荐
- 基于java开发的驾校学员信息管理系统
- 智能语音助手案例介绍:开发基于Java的智能语音助手,实现语音识别、语音合成等功能
- 儿童节庆祝代码.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)