HCS08入门之——点阵液晶12232实验
0赞本实验用单片机的IO口控制12232点阵液晶的显示。做本实验时需将拨码开关“SW2”和“SW6”的所有位拨到“ON”位置,“SW4”的第1位(LIGHT位)拨到“ON”位置。现象是LCD12232液晶屏幕上轮流显示“飞锐泰克伴您成长 010-62669831”字样和一幅图象,背光每一轮亮灭变化。
程序代码如下:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "table.h"
#define DATA_PORT PTBD
#define a0 PTCD_PTCD7
#define rw PTCD_PTCD6
#define e2 PTCD_PTCD5
#define e1 PTCD_PTCD4
#define rst PTCD_PTCD3
#define LIGHT PTCD_PTCD2
#define frist_page 0xb8 //页地址设置(0~3)
#define frist_row 0xc0 //扫描行 (0~31)
#define frist_line 0x00 //列地址设置(0~61)
uchar R=1,W=0,C=0,D=1;
void delayus(uint us)
{
uint uscnt;
uscnt=us>>3;
while(--uscnt);
}
void delayms(uint ms) // ms数量级 是实际时间的0.83倍
{
while(--ms)
{
delayus(250);
__RESET_WATCHDOG(); /* feeds the dog */
delayus(250);
__RESET_WATCHDOG(); /* feeds the dog */
delayus(250);
__RESET_WATCHDOG(); /* feeds the dog */
delayus(250);
}
}
void do_12232(uchar RW,uchar DC,uchar chceE1,uchar chceE2,uchar date)
{
a0=DC;
rw=RW;
DATA_PORT=date;
if(chceE1){e1=1;e1=0;}
if(chceE2){e2=1;e2=0;}
}
void init_lcd (void)
{
rst=1;
do_12232(W,C,1,1,0xe2); //软件复位
do_12232(W,C,1,1,0xa4); //动态驱动
do_12232(W,C,1,1,0xae); //显示关闭
do_12232(W,C,1,1,0xa9); //刷新时钟设置1/32
do_12232(W,C,1,1,0xa0); //clockwise
do_12232(W,C,1,1,0xee); //写模式
do_12232(W,C,1,1,0xaf); //显示打开
}
/*///////清屏///////////////*/////////////////
void clear_screen()
{
uchar i,ii;
for(i=0;i<4;i++)
{
do_12232(W,C,1,1,frist_page+i);
do_12232(W,C,1,1,frist_row);
do_12232(W,C,1,1,frist_line);
for(ii=0;ii<61;ii++)
{
do_12232(W,D,1,1,0);
}
}
}
///////////任意位置写7*16的像素块////////////////////////
/*
每半屏的一页只能写8个字符空余5列
x 横向x=0第一行 x=2 第二行
y 列向y=0~16
*/
///////////////////////////////////////////////////////////
/*
加 do_12232(W,C,1,0,frist_row);是必要的的,每个像素都是在顶层
产生的,每写半屏的长度执行它可以通过滚屏达到指定的地点
*/
void write_one_char(uchar x,uchar y,uchar *cha)
{
uchar i,ii;
for(ii=0;ii<2;ii++) //上下半屏分写
{
if(y/8) //左右半屏分写
{
do_12232(W,C,0,1,frist_page+x+ii); //值页
do_12232(W,C,0,1,frist_row+8*x); //扫描
do_12232(W,C,0,1,frist_line+7*(y-8));//值列
for(i=0;i<7;i++)
{
do_12232(W,D,0,1,cha[7*ii+i]);
}
do_12232(W,C,0,1,frist_row); //执行滚屏
}
else
{
do_12232(W,C,1,0,frist_page+x+ii);
do_12232(W,C,1,0,frist_row+8*x);
do_12232(W,C,1,0,frist_line+7*y+5);
for(i=0;i<7;i++)
{
do_12232(W,D,1,0,cha[7*ii+i]);
}
do_12232(W,C,1,0,frist_row);
}
}
}
///////////////////////////////////////////////////////////////////
/*
写任意像素15*16到指定位置
*/
void write_one_chinese(uchar x,uchar y,uchar *cha)
{
uchar i,ii;
for(ii=0;ii<2;ii++) //上下半屏分写
{
if(y/4) //左右半屏分写
{
do_12232(W,C,0,1,frist_page+x+ii); //值页
do_12232(W,C,0,1,frist_row+8*x); //扫描
do_12232(W,C,0,1,frist_line+15*(y-4));//值列 ?
for(i=0;i<15;i++)
{
do_12232(W,D,0,1,cha[15*ii+i]);
}
do_12232(W,C,0,1,frist_row); //执行滚屏
}
else
{
do_12232(W,C,1,0,frist_page+x+ii);
do_12232(W,C,1,0,frist_row+8*x);
do_12232(W,C,1,0,frist_line+15*y);
for(i=0;i<15;i++)
{
do_12232(W,D,1,0,cha[15*ii+i]);
}
do_12232(W,C,1,0,frist_row);
}
}
}
//////////////////////////////////////////////////////////////////
/************任意位置写字符串************************************/
void write_chars(uchar x,uchar y,uchar *cha,uchar quantity)
{
uchar i;
for(i=0;i<quantity;i++)
{
write_one_char(x,y+i,cha+14*i);
}
}
/************任意位置写数字************************************/
void write_num(uchar x,uchar y,uchar number)
{
write_one_char(x,y,num[number]);
}
/************任意位置写一串数字************************************/
void write_nums(uchar x,uchar y,uchar *number,uchar quantity)
{
uchar i;
for(i=0 ; i<quantity ; i++) {
write_one_char(x,y+i,num[*number]);
number++;
}
}
/***********任意位置写汉字串************************************/
void write_characters(uchar x,uchar y,uchar *cha,uchar quantity)
{
uchar i;
for(i=0;i<quantity;i++)
{
write_one_chinese(x,y+i,cha+30*i);
}
}
/***********整屏122*32画一幅画************************************/
/*
如果数据是从上至下有序下沉则每次不必置
do_12232(W,C,0,1,frist_row);
*/
void display_piture(uchar *cha)
{
uchar i,ii;
for(i=0;i<4;i++)
{
do_12232(W,C,1,1,frist_page+i);
do_12232(W,C,1,1,frist_row);
do_12232(W,C,1,1,frist_line);
for(ii=0;ii<122;ii++)
{
if(ii<61){do_12232(W,D,1,0,cha[122*i+ii]);}
else{do_12232(W,D,0,1,cha[122*i+ii]);}
}
}
}
//============================
//函数名:Init_io初始化I/O
//作用:初始化I/O
//输入参数:无
//返回参数:无
//=============================
void Init_io(void)
{
//io初始值都为0
PTBD = 0xFF;
PTCD_PTCD2=1;
PTCD_PTCD3=1;
PTCD_PTCD4=1;
PTCD_PTCD5=1;
PTCD_PTCD6=1;
PTCD_PTCD7=1;
//io为输出
PTBDD = 0xFF;
PTCDD_PTCDD2=1;
PTCDD_PTCDD3=1;
PTCDD_PTCDD4=1;
PTCDD_PTCDD5=1;
//PTCDD_PTCDD6=1;
PTCDD_PTCDD7=1;
//高驱动强度
/*
PTBDS = 0xFF;
PTCDS_PTCDS2=1;
PTCDS_PTCDS3=1;
PTCDS_PTCDS4=1;
PTCDS_PTCDS5=1;
PTCDS_PTCDS6=1;
PTCDS_PTCDS7=1;
*/
}
////////////////////////////////////////////////////////////////////
void main()
{
Init_io();
init_lcd();
clear_screen();
write_chars(0,3,num,8);
write_chars(2,3,num,8);
while(1)
{
LIGHT = !LIGHT; //背光每一轮亮灭变化
clear_screen();
(0,0,num,10);
delayms(5000);
clear_screen();
write_characters(0,0,free_tech,8);
write_nums(2,2,tel,12);
delayms(5000);
clear_screen();
display_piture(logo);
delayms(5000);
}
}

