📄 ca12864_dsp.c
字号:
#include "regs2407.h"
//#include "register.h"
#include "HZTABLE.h"
//#include "intrins.h"
#include "stdio.h"
//#include "absacc.h"
#include "math.h"
#define uint unsigned int
#define delay100ns() {int i;for(i=4;i>0;i--) i=i;}
#define kick_dog() {WDKEY= 0x055;WDKEY= 0x0AA;}
#define writeCom_start() {PADATDIR |= 0x40;PADATDIR &= 0xffd7;PADATDIR |= 0x50;PCDATDIR |= 0x01;delay100ns();}//IOPA3,5=0;IOPA4=1;IOPA6=1;IOPC0=1;
#define writeDat_start() {PADATDIR &= 0xff97;PADATDIR |= 0x10;PCDATDIR |= 0x01;delay100ns();}//IOPA3,5=0;IOPA4=1;IOPA6=0;IOPC0=1;
#define write_end() {delay100ns();PADATDIR |=0x08;delay100ns();PADATDIR |= 0x38;delay100ns();PADATDIR^=0x40;PCDATDIR &= 0xfffe;}//IOPA3,4,5=1
#define readCom_start() {PADATDIR |= 0x40;PADATDIR &= 0xFfcf;PADATDIR |= 0x48;PCDATDIR &= 0xfffe;PBDATDIR &=0xff;delay100ns();}//IOPA4,5=0;IOPA3=1;IO
#define readDat_start() {PADATDIR &= 0xFf8f;PADATDIR |= 0x08;PCDATDIR &= 0xfffe;PBDATDIR &=0xff;delay100ns();}//IOPA4,5=0;IOPA3=1;I
#define read_end() {delay100ns();PADATDIR |= 0x38;PADATDIR^=0x40;}//IOPA3,4,5=1
//以8*8字符计算,显示屏横向、纵向可以显示的字符个数
//以128*64为例:
#define LineChar 30 //一行16个字符(8*8)
#define ColumnChar 16 //总共16列
extern int bbb[320];
//指令,数据 读写状态检查
RWCheck()
{ uint sta,sta1;
do{
readCom_start();
sta=PBDATDIR & 0x03;
read_end();kick_dog(); }while(sta!=0x03);
}
//数据自动读 状态检查
#define AutoRCheck() { uint sta; do{readCom_start();sta=PBDATDIR & 0x04;read_end();} while(sta!=0x04); }
//数据自动写
#define AutoWCheck() { uint sta; do{readCom_start();sta=PBDATDIR & 0x08;read_end(); } while(sta!=0x08); }
/*------输入/出函数,与T6963通讯------------------------------------------------*/
/*------------------------------------------------------------------------*/
// 向数据口发Data
OutPortData(dat )
{
uint i;
RWCheck();
writeDat_start();
PBDATDIR=(dat|0xff00);
write_end(); PBDATDIR&=0xff;
}
//写有 1 个参数命令
OutPortCom1(command)
{
uint i;
RWCheck();
writeCom_start();
PBDATDIR=(command|0xff00);
write_end();PBDATDIR&=0xff; }
//写有 2 个参数命令
#define OutPortCom2(dat, command) { OutPortData(dat);OutPortCom1(command); }
//写有 3 个参数命令
#define OutPortCom3(data1, data2, command) { OutPortData(data1); OutPortData(data2); OutPortCom1(command);}
uint InPortData()
{
uint i,j;
RWCheck();
readDat_start();
i= PBDATDIR&0x00fF;
read_end();
return(i);
}
/*----------------------------------------------------------------------------------------------*/
//显示一个汉字(16*16点阵)
//x:行, y: 列,number:汉字在字库中的位置;p:字库数组首地址指针
void ShowHZ1616(uint x,uint y,uint number)
{
int i,j;
uint StartAddr;
StartAddr=y*LineChar + x; //定位起始行
j = number*32;
for(i=0;i<16;i++)
{
OutPortCom3(StartAddr, StartAddr>>8, 0x24);
OutPortCom2( hzk1616[j+i*2], 0xc0); //左半部 地址加一
OutPortCom2( hzk1616[j+i*2+1], 0xc0); //右半部 字模地址加一
StartAddr=StartAddr + LineChar;
}
}
/*----------------------------------------------------------------------------------------------*/
//显示一个汉字(16*8点阵)
//x:行, y: 列,number:汉字在字库中的位置;p:字库数组首地址指针
void ShowHZ168(uint x,uint y,uint number)
{
uint i,j;
uint StartAddr;
StartAddr=y*LineChar + x; //定位起始行
j = number * 16;
for(i=0;i<16;i++)
{
OutPortCom3( StartAddr, StartAddr>>8, 0x24);
OutPortCom2( hzk168[j+i], 0xc0);
StartAddr=StartAddr + LineChar;
}
}
void boxing_show(int x,int y,int number)
{
int i,j,command=0xf8;
int StartAddr;
StartAddr=y*30 + x; //定位起始行
command=0xf8|number;
OutPortCom3( StartAddr, StartAddr>>8, 0x24);
OutPortCom1(command);
}
void Clear_boxing(int x,int y,int number)
{
int i,j,command=0xf0;
int StartAddr;
StartAddr=y*30 + x; //定位起始行
command=0xf0|number;
OutPortCom3( StartAddr, StartAddr>>8, 0x24);
OutPortCom1(command);
}
/*----------------------------------------------------------------------------------------------*/
//反显一个字符
//x:行(0-7), y: 列(0-15)
void ReverseShowChar(uint xx,uint yy,uint x)
{
uint i,dat,StartAddr;
StartAddr=yy*LineChar +xx; //定位起始行
for(i=0;i<x;i++)
{
OutPortCom3( (uint)(StartAddr), (uint)(StartAddr>>8), 0x24);
OutPortCom1( 0xc5 ); //数据一次读,地址不变
dat=InPortData(); //读入数据
dat=(~dat)&0x00ff; //取反
OutPortCom2( dat, 0xc4); //送回
StartAddr=StartAddr+ LineChar;
}
}
/*----------------------------------------------------------------------------------------------------*/
//反显一个汉字
//x:行(0-7), y: 列(0-15)字体:x*y
void ReverseShowHZ(uint xx,uint yy,uint x,uint y)
{ uint i;
for (i=0;i<y/8;i++)
{
ReverseShowChar(xx+i,yy,x);
}
}
void ClearScreen()
{
unsigned int i;
///////// 清显示 RAM 区 0000h--2000h (8k)
OutPortCom3(0x00,0x00,0x24); //设置指针地址0000H
OutPortCom1(0xb0); //设置自动写状态
for(i=0x0000;i<8192;i++)
{OutPortData(0x0); // data=0;
i=i;
}
OutPortCom1(0xb2); // 自动写结束
}
//初始化LCD
//需要手动设置
void InitLCD()
{
OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr
OutPortCom3( 30,0x00,0x43 ); //设置图形显示区域宽度 : LineChar
//OutPortCom3( 0,0x00,0x22 ); //设置图形显示区域宽度 : LineChar
//OutPortCom3( 0,0x00,0x24 ); //设置图形显示区域宽度 : LineChar
OutPortCom3( 0x00,0x10,0x40 ); //设置文本显示区域首地址GraphAddr
OutPortCom3( 30,0x00,0x41); //设置文本显示区域宽度:10H
OutPortCom1(0xa7); //设置光标形状 cursor size 8x8
OutPortCom1(0x80); //设置显示方式: CGROM方式 文本\图形 "或"
OutPortCom1(0x98); //设置显示开关: 1001 1100 图形
OutPortCom3( 0x00,0x00,0x21);
ClearScreen();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -