📄 upd6464a.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 + -