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

📄 upd6464a.c

📁 这是一个对OSD芯片upd6464A操作的接口测试程序,使用KC51编译
💻 C
字号:
//==============================
//FileName=upd6464a.c
//Date=20060518
//==============================
#include"public.h"
#include"delay_s.h"
#include"upd6464a.h"
#include<ctype.h>

//内部底层函数的说明
static void upd6464a_send_byte(uchar dat);
static void upd6464a_send_cmd_1byte(uchar s);
static void upd6464a_send_cmd_2byte(uchar s1, uchar s2);
static void upd6464a_send_cmd_continue_2byte(uchar cmd_high, uchar *cmd_low, uchar cmd_len);

//==============================
//	外部调用函数部分
//==============================
//0)将输入的ASCII码(包含一些自定义的特殊字符)转换为显示码
//注意: 大写字母'O'正常转换后对应的字符是白块!
uchar	upd6464a_get_disp_code(uchar ascii)
{
	if (isdigit(ascii)) return(ascii -'0');
	else if(islower(ascii)) return(ascii -0x10);
	else if(ascii =='O') return(0x5f);		//'O'用'o'来替代显示!
	else if(isupper(ascii)) return(ascii -'0');
	else
	{
		switch(ascii)
		{
			case ':':
				return(0x0a);

			case '<':
				return(0x0b);
			
			case '>':
				return(0x0c);
			
			case '-':
				return(0x0d);
				
			case '.':
				return(0x0e);
			
			case ',':
				return(0x0f);
				
			case ' ':
				return(0x10);
				
			case '?':
				return(0x50);
				
			case ';':
				return(0x6b);
				
			case '/':
				return(0x6d);

			case CHAR_CA:	//'x'
				return(0x6c);
			
			case CHAR_RIGHT:	//以下四个是方向符号
				return(0x3b);
				
			case CHAR_LEFT:
				return(0x3c);
				
			case CHAR_UP:
				return(0x3d);
				
			case CHAR_DOWN:	
				return(0x3e);			
				
			default:	//异常字符显示为空白
				return(0x10);
		}
	}
}


//1-byte 命令部分
//1-1)清除RAM,执行后需要延时1ms
void upd6464a_video_clr_ram(void)
{
	upd6464a_send_cmd_1byte(UPD6464A_CMD_VIDEO_RAM_CLR);
	delay_x1ms(10);
}

//1-2)显示控制
//参数依次为: 显示,LC振荡,闪烁的设置
void upd6464A_display_control(uchar disp, uchar lc, uchar blink)
{
	upd6464a_send_cmd_1byte(0x10 | ((disp &0x01)<<3) | ((lc &0x01)<<2) | (blink &0x03) );	
}

//1-3)内部视频输出时的颜色控制,如果使用外部视频叠加则无效
void upd6464A_internal_color_control(uchar color)
{	//输入大于等于4则只能是white
	upd6464a_send_cmd_1byte(0x20 | (( ((color &0x07)<4) ?(color &0x03) :0x07) <<1) );
}

//1-4)背景控制
void upd6464A_background_control(uchar select_bg)
{	
	upd6464a_send_cmd_1byte(0x30 | ((select_bg&0x03)<<1) );
}

//1-5)晶振模式控制
void upd6464A_osc_mode_control(uchar osc, uchar vs_mode)
{	
	upd6464a_send_cmd_1byte(0x40 | ((vs_mode &0x01)<<2) | (osc &0x01) );
}

//1-6)视频分类模式控制
void upd6464A_format_mode_control(uchar format)
{	
	upd6464a_send_cmd_1byte(0x48 | ((format <4) ? (format &0x03) :0x04 ) );
}

//1-7)OSC振荡方式控制
void upd6464A_osc_method_control(uchar method)
{	
	upd6464a_send_cmd_1byte(0x50 | ((method &0x01) <<1) );
}

//2-byte命令部分
//2-1)显示位置的控制
//参数:
//	x	水平方向离开左端的位置(0-31)
//	y	垂直方向离开上端的位置(0-31)
void upd6464A_disp_position_control(uchar x, uchar y)
{	
	upd6464a_send_cmd_2byte(0x80 | ((y >>3) &0x03), ((y&0x07)<<5) |(x &0x1f) );
}

//2-2)写入OSD的RAM地址的控制
//参数:
//	line	垂直方向行的位置(0-11)
//	coloum	水平方向列的位置(0-23)
void upd6464A_write_addr_control(uchar line, uchar coloum)
{	
	upd6464a_send_cmd_2byte(0x88 | ((line >>3) &0x01), ((line <<5) &0xe0) |(coloum &0x1f) );
}

//2-3)输出信号幅度的控制
//参数:
//	lum	字符控制(0/1 =75/90 I.R.E)
//	level	信号幅度控制(0/1 =1/2v pp)
void upd6464A_output_level_control(uchar lum, uchar level)
{	
	upd6464a_send_cmd_2byte(0x90 | (level &0x01), 0x04 | ( ((lum &0x01)==0) ?0x01 :0x03 ) );
}

//2-4)显示字符尺寸的控制
//参数:
//	high	字符高度(占的行数: 0...11)
//	dot	线宽控制(0/1 =1/2点线宽)
void upd6464A_character_size_control(uchar high, uchar dot)
{	
	upd6464a_send_cmd_2byte(0x98, ((dot ==0) ?0x00:0x40) | (high %(CONST_UPD6464A_CMD_WRITE_LINE_MAX+1)) );
}

//2-byte连续命令部分
//3-1)显示字符写入的控制
//参数:
//	blink		=1 字符闪烁
//	dat_str[]	输出的连续字符串
//	len		输出的连续字符串的字节数
//执行此命令前必须打开LC振荡!
void upd6464A_character_display_control(uchar blink, uchar *dat_str, uchar len)
{	
	upd6464a_send_cmd_continue_2byte(0xc0 | ((blink &0x01)<<1), dat_str, len);
}

//==============================
//	底层函数部分
//==============================
//------------------------------
//字节的串行输出,最底层函数
//输入:
//	dat	单字节
//输出:
//	无
//要求进入时的状态: CLK=1,CS=0
//退出时的状态: CLK=1,CS=0
//------------------------------
static void	upd6464a_send_byte(uchar dat)
{
uchar data i;
	for(i=0;i<8;i++)
	{
		CLK_LOW;		//clk为低时送数据,数据高位在前
		if((dat & 0x80) ==0x80)
		{
			DAT_HIGH;
		}
		else
		{
			DAT_LOW;
		}
		_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();
		CLK_HIGH;
		dat <<=1;
	}
	_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();
}

//------------------------------
//1-byte 单字节命令的发送
//输入:
//	s	单字节命令
//输出:
//	无
//------------------------------
void upd6464a_send_cmd_1byte(uchar s)
{
	CS_LOW;
	_nop_();_nop_();
	_nop_();_nop_();

	upd6464a_send_byte(s);
		
	CS_HIGH;
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
}

//------------------------------
//2-byte 双字节命令的发送
//输入:
//	s1	双字节命令的高字节
//	s2	双字节命令的低字节
//输出:
//	无
//------------------------------
void upd6464a_send_cmd_2byte(uchar s1, uchar s2)
{
	CS_LOW;
	_nop_();_nop_();
	_nop_();_nop_();

	upd6464a_send_byte(s1);
	upd6464a_send_byte(s2);
	
	CS_HIGH;
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
}


//------------------------------
//2-byte continue 双字节连续命令的发送
//输入:
//	cmd_high	双字节连续命令的起始字节
//	cmd_low[]	双字节连续命令的第二字节串
//	cmd_len		双字节连续命令的第二字节串的字节长度(不包括结束标志字节)
//输出:
//	无
//------------------------------
void upd6464a_send_cmd_continue_2byte(uchar cmd_high, uchar *cmd_low, uchar cmd_len)
{
uchar data j;

	CS_LOW;
	_nop_();_nop_();
	_nop_();_nop_();

	upd6464a_send_byte(cmd_high);
	_nop_();_nop_();
	_nop_();_nop_();
	for(j=0; j<cmd_len; j++)
	{	//进行字符值得限制
		upd6464a_send_byte(cmd_low[j] &0x7f);
	}	
	upd6464a_send_byte(CONST_UPD6464A_CMD_CONTINUE_END);
	
	CS_HIGH;
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
}


//End Of File

⌨️ 快捷键说明

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