⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ra8803.c

📁 点阵液晶驱动器RA8803驱动程序,该驱动器是仪表显示部件常用的液晶驱动部件,内含中文字库,本程序为演示程序,其核心部分已经在产品中大量应用.
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************/
/*                                                                     */
/*  FILE        :RA8803.c                                              */
/*  DATE        :Sat, Dec 03, 2005                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8/36014F                                             */
/*                                                                     */
/*  This file is generated by Hitachi Project Generator (Ver.2.1).     */
/*                                                                     */
/***********************************************************************/
                  

#include "iodefine.h"
#include <machine.h>
#include "RA8803.h"

#include "tupian.h"
//#include "zimochar.h"		//字符 符号等字库 8*8  8*16  12*12  16*16 点阵
//#include "hanzi12x12.h"	//12*12点阵汉字字库
//#include "hanzi16x16.h"	//16*16点阵汉字字库

#ifdef __cplusplus
extern "C" {
#endif
void abort(void);
#ifdef __cplusplus
}
#endif

void main(void)
{
	nop();
	nop();
main_1:
	ini_ram();	//RAM初始化,主要写入0外的数据
	ini_pp();	//端口及外围功能初始化
	buzzeron();
		lcm_CE=0;
		lcm_RW=1;
		lcm_E=0;
		lcm_RST=1;
		lcm_CD=0;
		ini_lcm();
	for(;;) 
	{
//		emi_p();
		RESET_WATCHDOG(); /* kicks the dog */
		//不对LCM操作时,主流程定时置这些口的状态,以免出错
		//显示处理
		display();
	}
}

void abort(void)
{
	
}



//-----------------------------------------------------
//清RAM
//-----------------------------------------------------
void ini_ram(void)
{
	gflg1=0;
}

//-----------------------------------------------------
//外围功能初始化
//端口   0---input    1:output
//		7	6	5	4	3	2	1	0
//P1	1	1	1	1	/	1	1	1
//P2	/	/	/	/	/	1	1	1
//P5	1	1	1	1	1	1	1	1
//P7	/	1	1	1	1	1	1	0
//P8	/	/	/	0	1	1	1	1
//PB	/	/	/	/	0	0	0	0
//TV: 暂不用
//TW: 定时
//外中断: 无
//-----------------------------------------------------
void ini_pp(void)
{
	portmr1 =0x00;	//0b00001010;	//TXD TXD2
	PORT1 =0x37;	//0b00110111;
	portcr1 =0xcf;	//0b11001111;	//方向
	portur1=0x20;	//0b00000000;

	PORT2 =0x06;	//0b00000110;
	portcr2 =0xff;	//0b11111111;	//方向

	portmr5 =0x00;	//0b00000000;	//为普通IO
	PORT5 =0x00;	//0b00000000;
	portcr5 =0xff;	//0b11111111;	//方向
	portur5=0x00;	//0b00000000;

	PORT7 =0x57;	//0b01010111;
	portcr7 =0xfe;	//0b11111110;	//方向

	PORT8 =0x1b;	//0b00011011;
	portcr8 =0x0f;	//0b00001111;	//方向

/*
//TIMERV初始化
//输出2.5K频率 驱动蜂鸣器
	TV.TCNTV=0;
	TV.TCRV0.BYTE=0x0b;	//0b00001011;	//与A匹配 计数器清0  输入脉冲为1/64振荡频率
	TV.TCORA=50;			//2.5K比较常数
	TV.TCORB=25;			//在50%时与B比较匹配, 则获得了50%占空比
*/
//TIMERW初始化
//定时20毫秒,定时计时
	TW.GRA=0xffff;
	TW.GRB=0xffff;
	TW.GRC=0xffff;
	TW.GRD=0xffff;
	TW.TCNT=25536;	//20毫秒						//25536;		//20毫秒
	TW.TIOR0.BYTE=0x88;	//0b10001000;
	TW.TIOR1.BYTE=0x88;	//0b10001000;
	TW.TMRW.BYTE=0xc8;	//0b11001000;
	TW.TCRW.BYTE=0xa0;	//0b10100000; 4倍分频
	TW.TSRW.BYTE=0x70;	//0b01110000
	TW.TIERW.BYTE=0xf0;	//0b11110000;
	TW.TMRW.BIT.CTS=1;	//START
/*
//ADC初始化
	AD.ADCSR.BYTE=0x12;	//00010010   SCAN模式 AN0~AN2通道
	AD.ADCR.BYTE =0x00;		//00000000
	AD.ADCSR.BIT.ADST=1;	//启动ADC
//SCI--1 初始化
//9600BPS 1个起始  1个停止 无校验
	SCI3.SCR3.BYTE=0x00;
	SCI3.SMR.BYTE=0x00;	//00000000  1 开始  1结束  8数据 内部1:1 无校验
	SCI3.BRR=51;		//9600BPS
	delayus(120);
	SCI3.SSR.BYTE=(SCI3.SSR.BYTE|0x80)&0x80;
	SCI3.SCR3.BYTE=0x50;	//接收允许  发送禁止 接收中断允许  发送中断禁止

//SCI--2 初始化
//9600BPS 1个起始  1个停止 无校验
	SCI3_2.SCR3.BYTE=0x00;
	SCI3_2.SMR.BYTE=0x00;	//00000000  1 开始  1结束  8数据 内部1:1 无校验
	SCI3_2.BRR=51;		//9600BPS
	delayus(120);
	SCI3_2.SSR.BYTE=(SCI3_2.SSR.BYTE|0x80)&0x80;
	SCI3_2.SCR3.BYTE=0x50;	//接收允许  发送禁止 接收中断允许  发送中断禁止

//WDT初始化
//WDT时间为120毫秒
	WDT.TMWD.BYTE  =0x0e;	//0b00001110;	//时间常数 
	WDT.TCSRWD.BIT.B4WI=0;
	WDT.TCSRWD.BIT.TCSRWE=1;
	WDT.TCSRWD.BIT.WDON=1;		//WDT开启
	WDT.TCSRWD.BIT.TCSRWE=0;
	WDT.TCSRWD.BIT.B4WI=0;
*/
//中断初始化
	set_imask_ccr(0);
}



//--------------------------------------------------------
//画园函数--LCM用
//画法:按照行进行处理, 从行数=(坐标原点纵坐标-半径) 时开始计算, 在坐标原点横坐标点画出第1点
//	此后需要每行计算两个点的坐标,纵坐标相同,就是行数,横坐标以原点对称
//	横坐标计算方法:  设原点坐标为(x0,y0) 新点坐标为(x,y), y就是当前正在计算的行数  r为半径
//	x=x0-sqrt(r*r-(y0-y)*(y0-y))   sqrt:开平方
//	计算持续到(原点纵坐标+半径)为止

//输入:圆心(X,Y)是以左上角为原点(0,0)的坐标  半径  都是以显示点为单位
//输出:无
//--------------------------------------------------------
#define LCD_SEG 320	//点列数
#define LCD_COM	240	//点行数
#define START_RAM	0x0000	//LCM上显示RAM起始地址

union 
{
	unsigned int W;
	struct
	{
		unsigned char H;
		unsigned char L;
	}HL;
}LCM_ADDU;
	#define lcd_ram_add LCM_ADDU.W
	#define lcd_ram_add_l LCM_ADDU.HL.L
	#define lcd_ram_add_h LCM_ADDU.HL.H

void draw_circle(uint x0,uint y0,uint r)
{
	uint x,y,ls1,ls3;
	ulong ls2;
	uchar ls4;
	if(r<=1)
	{	//半径<=1, 则在原点处画一个点
		//下面读出屏幕上对应数据, 处理后写回
		lcd_ram_add=x0/8;
		lcd_ram_add+=START_RAM+y0*(LCD_SEG/8);	//获取对应点RAM地址
		ls4=crd_lcm_ram(lcd_ram_add_h,lcd_ram_add_l);
		ls4|=(0x80>>(x0%8));
		cwr_lcm_ram(lcd_ram_add_h,lcd_ram_add_l,ls4);
		return;
	}
	if (y0<r) ls1=0;
	else ls1=y0-r;			//确定起始行
	for (y=ls1;y<LCD_COM;y++)	//y:处理的开始行, 也是园上各点的纵坐标
	{
		if (y<y0)		ls2=(ulong)r*(ulong)r-(ulong)(y0-y)*(ulong)(y0-y);
		else 	ls2=(ulong)r*(ulong)r-(ulong)(y-y0)*(ulong)(y-y0);
		ls2=sqrtl(ls2);
		ls3=(uint)ls2;		//计算出园上点离坐标原点的横向距离
		if (x0<ls3)		//下面获取第1点的横坐标(圆心左边的点)
		{//点在显示区域外,不做处理
		}
		else
		{//点在显示区域内
			x=x0-ls3;	//获得x坐标,y坐标就是当前的y
			//下面读出屏幕上对应数据, 处理后写回
			lcd_ram_add=x/8;
			lcd_ram_add+=START_RAM+y*(LCD_SEG/8);	//获取对应点RAM地址
			ls4=crd_lcm_ram(lcd_ram_add_h,lcd_ram_add_l);
			ls4|=(0x80>>(x%8));
			cwr_lcm_ram(lcd_ram_add_h,lcd_ram_add_l,ls4);
		}
		if ((x0+ls3)>LCD_SEG)		//下面获取第2点的横坐标(圆心右边的点)
		{//点在显示区域外,不做处理
		}
		else
		{//点在显示区域内
			x=x0+ls3;	//获得x坐标,y坐标就是当前的y
			//下面读出屏幕上对应数据, 处理后写回
			lcd_ram_add=x/8;
			lcd_ram_add+=START_RAM+y*(LCD_SEG/8);	//获取对应点RAM地址
			ls4=crd_lcm_ram(lcd_ram_add_h,lcd_ram_add_l);
			ls4|=(0x80>>(x%8));
			cwr_lcm_ram(lcd_ram_add_h,lcd_ram_add_l,ls4);
		}
		if (y>=(y0+r))	return;		//当前行已经超过园所及的地方, 画园完成, 返回
	}
}


//--------------------------------------------------------
//向LCM RAM写入一字节数据函数
//输入:RAM地址高字节 RAM地址低字节 数据
//输出:无
//--------------------------------------------------------
void cwr_lcm_ram(unsigned char h,unsigned char l,unsigned char ls4)
{
	main_lsl=l;
	main_lsh=h;
	main_ls/=40;
	LCD_CmdWrite(0x70,main_lsl); // 設定游標垂直位址(Common)----------光标地址--Y--

	main_lsl=l;
	main_lsh=h;
	main_ls%=40;
	LCD_CmdWrite(0x60,main_lsl); // 設定游標水平位址(Segment)----------光标地址--X--
	wr_lcm_data(ls4);
}

//--------------------------------------------------------
//从LCM RAM读出一字节数据函数
//输入:RAM地址高字节 RAM地址低字节
//输出:无
//--------------------------------------------------------
unsigned char crd_lcm_ram(unsigned char h,unsigned char l)
{
	uchar ls1;
	main_lsl=l;
	main_lsh=h;
	main_ls/=40;
	LCD_CmdWrite(0x70,main_lsl); // 設定游標垂直位址(Common)----------光标地址--Y--

	main_lsl=l;
	main_lsh=h;
	main_ls%=40;
	LCD_CmdWrite(0x60,main_lsl); // 設定游標水平位址(Segment)----------光标地址--X--

	ls1=rd_lcm_data();
	return ls1;
}


//--------------------------------------------------------
//长整型定点数开平方函数,结果为整型
//输入:长整型被开平方数
//输出:整型平方根
//说明:本函数最大在某些大于32767*32676即1073676289的开平方的时候会不正确
//--------------------------------------------------------
unsigned int sqrtl(unsigned long M)
{
	unsigned int N, i;
	unsigned long tmp, ttp;   // 结果、循环计数
	if (M == 0)      // 被开方数,开方结果也为0
		return 0;
	N = 0;
	tmp = (M >> 30); // 获取最高位:B[m-1]
	M <<= 2;
	if (tmp > 1)     // 最高位为1
	{
		N ++;        // 结果当前位为1,否则为默认的0
		tmp -= N;
	}
	for (i=15; i>0; i--)      // 求剩余的15位
	{
		N <<= 1;     // 左移一位
		tmp <<= 2;
		tmp += (M >> 30);     // 假设
		ttp = N;
		ttp = (ttp<<1)+1;
		M <<= 2;
		if (tmp >= ttp)       // 假设成立
		{
			tmp -= ttp;
			N ++;
		}
	}
	return N;
}



//------------------------------------------------------------------
//简单显示程序,显示图片
//按照现在的初始化, 第1区240行, 地址从0x0000开始, 第2区240行, 地址从0x3000开始, 
//	则图形应从0x3000开始,为什么?还没明白,以后研究
#define DIS_DLT	5
#define DIS_DLT1	2
//------------------------------------------------------------------
void display(void)
{
	uchar i,j;
	uint m;
	switch (disp_pro_flg)
	{
		case 1:	//送出竖条纹
			if (disp_dlt_ct>=DIS_DLT1)
			{
//				LCD_CmdWrite(0x12,0x92); // LCD 顯示圖層設定
				LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
				LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
				for (m=0;m<40*240;m++)
				{
					wr_lcm_data(0x0f);
				}
				disp_pro_flg++;
				disp_dlt_ct=0;
				buzzeron();
			}
			break;
		case 2:	//
				disp_pro_flg++;
				disp_dlt_ct=0;
			break;
		case 3:	//送出方块
			if (disp_dlt_ct>=DIS_DLT1)
			{
//				LCD_CmdWrite(0x12,0xa1); // LCD 顯示圖層設定
				LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
				LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
				for (i=0;i<30;i++)
				{
					for (j=0;j<40*4;j++)
					{
						wr_lcm_data(0x0f);
					}
					for (j=0;j<40*4;j++)
					{
						wr_lcm_data(0xf0);
					}
				}
				disp_pro_flg++;
				disp_dlt_ct=0;
//				buzzeron();
			}
			break;
		case 4:	//
			if (disp_dlt_ct>=DIS_DLT1)
			{
				//送出新图片
//				LCD_CmdWrite(0x12,0x92); // LCD 顯示圖層設定
				LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
				LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
				for (m=0;m<40*240;m++)
				{
					wr_lcm_data(tupian1[m]);
				}
				disp_pro_flg++;
				disp_dlt_ct=0;
//				buzzeron();
			}			
			break;
		case 5:	//送出图片5
			if (disp_dlt_ct>=DIS_DLT1)
			{
				//送出新图片
//				LCD_CmdWrite(0x12,0x92); // LCD 顯示圖層設定
				LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
				LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
				for (m=0;m<40*240;m++)
				{
					wr_lcm_data(tupian5[m]);
				}
				disp_pro_flg++;
				disp_dlt_ct=0;
//				buzzeron();
			}
			break;
		case 6:	//
				disp_pro_flg++;
				disp_dlt_ct=0;
			break;
		case 7:	//送出图片2
			if (disp_dlt_ct>=DIS_DLT)
			{
				//送出新图片
//				LCD_CmdWrite(0x12,0xa1); // LCD 顯示圖層設定
				LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
				LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
				for (m=0;m<40*240;m++)
				{
					wr_lcm_data(tupian2[m]);
				}
				disp_pro_flg++;
				disp_dlt_ct=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -