at90s8515 单片机 驱动t6963c LCD 24064 程序
;************************************************************************
;连线图: 液晶屏分为8行*15列汉字,使用模拟接口方式。 *
;*DB0-----PA0* *DB4-----PA4* *Rd ------PC2* *Cd ------PC0* *
;*DB1-----PA1* *DB5-----PA5* *Wr ------PC1* *CE ------GND* *
;*DB2-----PA2* *DB6-----PA6* *RST------PC3* *FS ------GND* *
;*DB3-----PA3* *DB7-----PA7* *
;注:S8515的晶振频率为4MHz *
;************************************************************************/
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
/* 定义24064端口 */
//cd=PORTC.0,通道选择,=1为指令通道,=0为数据通道
#define set_cd asm("sbi 0x15,0")
#define clr_cd asm("cbi 0x15,0")
//ce=PORTc.6低电平有效,T6963C片选信号
#define set_ce asm("sbi 0x15,6")
#define clr_ce asm("cbi 0x15,6")
//rd=PORTc.2,读操作,低电平有效
#define set_rd asm("sbi 0x15,2")
#define clr_rd asm("cbi 0x15,2")
//wr=PORTc.1,写操作,低电平有效
#define set_wr asm("sbi 0x15,1")
#define clr_wr asm("cbi 0x15,1")
//rst=PORTc.3,写操作,低电平有效
#define set_rst asm("sbi 0x15,3")
#define clr_rst asm("cbi 0x15,3")
const uchar hz_001[]=
{
/*------------------------------------------------------------------------------
; 源文件 / 文字 : 肱
; 宽×高(像素): 16×16
------------------------------------------------------------------------------*/
0x00,0x40,0x3C,0x40,0x24,0x40,0x27,0xFE,
0x3C,0x40,0x24,0x40,0x24,0x90,0x24,0x90,
0x3C,0x90,0x25,0x20,0x25,0x28,0x26,0x44,
0x44,0xBE,0x55,0xE6,0x88,0x84,0x00,0x00
};
/* 初始化 */
void initcomm(void)
{
DDRA=0xff; DDRC=0xff;
PORTA=0xff; PORTC=0xff;
}
/* 初始化 lcd240128 */
void initlcd(void)
{
dmod(0x00,0x00,0x42); /*图形显示区域首地址*/
dmod(0x1e,0x00,0x43); /*图形显示宽度,一行显示所占字节*/
dmod(0x03,0x00,0x22); /*cgram首地址 00011 100000000 000 = 1c00h*/
nmod(0x88); /*显示方式:逻辑"或"合成*/
nmod(0x98); /*显示开关设置,开文本和图形显示*/
}
/* lcd 清0*/
void clear(void)
{uint i;
dmod(0x00,0x00,0x24); /*显示存储器首地址*/
nmod(0xb0); /*自动写方式*/
for (i = 0;i < 0x2000;i++)
{
r_st(3); /*等待自动写状态*/
wdata(0,0);
}
nmod(0xb2); /*自动写结束*/
}
/****************************************************
读状态字
cd_flag = 1 读命令通到。 = 0 读数据通到。
w = 0 指令读,写状态, 返回1 准备好 返回0 忙。
w = 1 数据读,写状态, 返回1 准备好 返回0 忙。
w = 2 数据自动读状态, 返回1 准备好 返回0 忙。
w = 3 数据自动写状态, 返回1 准备好 返回0 忙。
w = 5 控制运行检测可能性,返回1 准备好 返回0 忙。
w = 6 屏读/栲贝出错状态, 返回1 正确 返回0 出错。
w = 7 闪烁状态检测, 返回1 正常显示 返回0 关显示。
******************************************************/
void r_st (uchar w)
{
uchar i = 0;
uchar c;
DDRA=0x00;PORTA=0xff;
while (--i)
{ set_cd;
clr_rd ; set_wr;
c =PINA;
set_rd;
NOP();
if ((w == 1) && ((c & 3) == 3)) return;
if ((w == 3) && ((c & 8) == 8)) return;
}
}
void wdata(uchar cd_flag,uchar d) /*数据写操作*/
{ DDRA=0xff;
if (cd_flag == 0) clr_cd;
else set_cd;
PORTA = d;
clr_wr; set_rd;
set_wr;
NOP();
}
/*双参数指令*/
void dmod(uchar x0,uchar x1,uchar c)
{
r_st(1); wdata(0,x0);
r_st(1); wdata(0,x1);
r_st(1); wdata(1,c);
}
/*单参数指令*/
void smod(uchar x1,uchar c)
{
r_st(1); wdata(0,x1);
r_st(1); wdata(1,c);
}
/*无参数指令*/
void nmod(uchar c)
{
r_st(1); wdata(1,c);
}
/*************************************************************
汉字写入函数(图形方式)16*16
o_y Y 坐标 0-29
o_x X 坐标 0-63
*p 写入字符代码
*************************************************************/
void wri_hz(uchar add_x ,uchar add_y,const uchar *p)
{
uint c,i,j;
c = add_y*(0x1e)+add_x;
for (i=0;i<16;i++)
{ dmod(c,c>> 8,0x24);
nmod(0xb0); /*自动写方式*/
for (j = 0;j < 4;j++)
{ r_st(3); /*等待自动写状态*/
wdata(0,*p++);
}
nmod(0xb2); /*自动写结束*/
c += 0x1e;
}
}
/**** 主函数 ****/
void main(void)
{
initcomm(); /*初始化*/
clr_rst;
NOP();NOP();
set_rst ; /*复位*/
initlcd(); /*初始化 lcd240128 */
clear(); /* lcd 清0*/
while(1)
{wri_hz(2,0,hz_001);
}
}
上一篇:AVR 单片机数码管显示时钟程序
下一篇:12864(ST7902)串口C51程序
推荐阅读最新更新时间:2024-03-16 15:49